๐Ÿ’ป6/16

๋ฐฉ์˜ˆ์„œยท2022๋…„ 6์›” 16์ผ
0

Project

๋ชฉ๋ก ๋ณด๊ธฐ
4/4

6/16

๊ตฌํ˜„

๋ฏธ๋“ค์›จ์–ด๋กœ ํ•ฉ์น˜๋Š๋ผ ๋ณ„ ์‚ฝ์งˆ์„ ๋‹ค ํ•˜๋‹ค๊ฐ€ ๊ฒฐ๋ก ์ ์œผ๋กœ action์„ ๋ชจ๋‘ ํ•ฉ์น˜๊ณ , ์กฐ๊ฑด ์ฒ˜๋ฆฌ๋„ ๋ชจ๋‘ reducer์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ–ˆ๋‹ค.

react ์‹ค๊ฐ•์—์„œ ๋ฏธ๋“ค์›จ์–ด๋Š” redux์—์„œ ๋ชจ๋“  ์ƒํƒœ, action๋“ค์ด ๊ฑฐ์ณ๊ฐ€๋Š” ์—ญํ• ์ด๋ผ๊ณ  ํ•˜์…จ๋Š”๋ฐ(?) ์šฐ๋ฆฌ๋Š” slice๋ฅผ ๋‘๊ฐ€์ง€ ์“ฐ๊ณ  ์žˆ๊ณ , ๋‚ด๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๊ฒƒ์€ searchSlice์—๋งŒ ๊ด€ํ•œ ๊ฒƒ์ด์–ด์„œ ๋ฏธ๋“ค์›จ์–ด์—์„œ ์ž‘์—…ํ•˜๋ ค๋ฉด action์ด searchSlice์—์„œ ์˜จ ๊ฑด์ง€, clipSlice์—์„œ ์˜จ ๊ฑด์ง€๋ถ€ํ„ฐ ํŒ๋‹จํ•ด์•ผํ–ˆ๋‹ค.

store๋ฅผ ๋‘ ๊ฐœ ์“ฐ๊ฑฐ๋‚˜, action.type์œผ๋กœ ํŒ๋ณ„ํ•˜๊ฑฐ๋‚˜, try catch๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜...
๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ–ˆ์œผ๋‚˜ ๊ฒฐ๋ก ์ ์œผ๋กœ ๋ฏธ๋“ค์›จ์–ด์˜ ์—ญํ• ์ด ๋งž๋Š”์ง€ ํ™•์‹ ๋„ ์—†๊ณ , ๊ถ๊ทน์ ์œผ๋กœ ๋‚ด๊ฐ€ ์ž˜ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค ใ…Ž;;

๊ฒฐ๊ตญ Input.jsx์—์„œ๋Š” ๊น”๋”ํ•˜๊ฒŒ update ์•ก์…˜๋งŒ ์ž‘์„ฑํ•ด์ฃผ๊ณ , updateHistory ์•ก์…˜ ๋‚ด์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์ฃผ๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค.
(์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋‹ˆ ๊ฒฐ๊ตญ 10๋ถ„๋งŒ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‚ด ํ•˜๋ฃจ๊ฐ€... ๐Ÿ˜‡) ๊ดœ์ฐฎ์•„! ์ด๊ฒŒ ๋‹ค ์„ฑ์žฅ์˜ ์ผ๋ถ€์ง€ ๋ญ

// store.js
import { createSlice } from '@reduxjs/toolkit';

const historyMax = 5;

const searchSlice = createSlice({
  name: 'search',
  initialState: [],
  reducers: {
    updateHistory: (state, action) => {
      if (state.includes(action.payload)) {
        let temp = [...state];
        temp.splice(state.indexOf(action.payload), 1);
        return [action.payload, ...temp];
      }

      // ์ตœ๋Œ€ ๊ฐœ์ˆ˜์ด๋ฉด ์‚ญ์ œํ•˜๊ณ  ๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ
      return (state.length === historyMax) 
      ? [action.payload, ...state.slice(0, state.length-1)]
      : [action.payload, ...state];
    },
  },
});

export const { updateHistory } = searchSlice.actions;
export default searchSlice.reducer;
// Input.jsx
import React, { useState } from 'react'
import { useSelector, useDispatch } from 'react-redux';

import { updateHistory } from '../reducer/searchSlice';

export default function Input() {

  const history = useSelector(state => state.searchSlice);
  const dispatch = useDispatch();

  const [value, setValue] = useState("");

  const onChange = (e) => {
    setValue(e.target.value);
  }

  const onEnterDown = (e) => {
    if (e.key === "Enter") {
      searchFunc();
    }
  }

  function searchFunc() {
    dispatch(updateHistory(value));
  }

  return (
    <div>
      <input onChange={onChange} onKeyDown={onEnterDown}/>
      <div> {history.map((value, i) => (<p key={i}>{i} : {value}</p>))}</div>
    </div>
  )
}

Git๊ณผ ๋ฉ˜ํ† ๋ง

์ด์ œ Input ์ž‘์—…์„ ๋งก์€ ๋‚˜์™€ ํŒ€์›์ด ํ•œ๋ฒˆ Merge๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.
์ด ๊ณผ์ •์ด ๋งค์šฐ ๊นŒ๋‹ค๋กœ์› ๋‹ค. ์•„์ง ํ•ด๊ฒฐ ๋ชป ํ•จ.
์•„์˜ˆ ํ•œ ํŒŒ์ผ์—์„œ ๋™์‹œ์— ์ž‘์—…์„ ํ•˜๋‹ˆ confilct๊ฐ€ ๋‚ฌ๊ณ , ๋‹น์—ฐํ•œ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐ์€ ํ–ˆ์œผ๋‚˜ ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜๋ถ€ํ„ฐ ์—ด๊นŒ์ง€ ๋‚ด๊ฐ€ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ ๋ชปํ–ˆ๋‹ค. (Git์ด ์–ด๋Š ์ •๋„ ํ•ด์ฃผ๋Š” ์ค„...)

๋ฉ˜ํ† ๋ง๊ณผ ๋งค๋‹ˆ์ €๋‹˜ ๋‘˜ ๋‹ค ๊ณตํ†ต์ ์œผ๋กœ ๋ง์”€ํ•˜์‹  ๊ฒƒ์„ ํ† ๋Œ€๋กœ ๋‚ด๊ฐ€ ๋Š๋‚€ ๊ฒƒ์€

  • ์• ์ดˆ์— ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋‚˜๋ˆŒ ๋•Œ ์ด๋ ‡๊ฒŒ ์งœ๋ฉด ์•ˆ๋จ.
    ๋ฌผ๋ก  ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹จ์œ„๊ฐ€ ์ž‘๋‹ค๋ณด๋‹ˆ ์–ด์ฉ” ์ˆ˜ ์—†๊ธด ํ–ˆ๋Š”๋ฐ, ์ด๋Ÿด๊ฑฐ๋ฉด ํ•œ๋ช…์ด ์ผ๋‹จ input ์ž‘์—… ํ•˜๊ณ , ํ•œ ๋ช…์€ header ์ž‘์—…ํ•˜๊ณ  ์žˆ๊ณ , ์ด๋Ÿฐ ์‹์œผ๋กœ ์–ด๋Š ์ •๋„ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ž‘์—…ํ•œ ๋‹ค์Œ์—, input์ด ๋‹ค ๋๋‚˜๋ฉด ๊ทธ ๋•Œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ input ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ? ์ด๋Ÿฐ ์‹์œผ๋กœ ๋‚˜๋ˆด์–ด๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค.

  • ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์„ ๊ธฐ๋Šฅ/์ด๋ฆ„ ์œผ๋กœ ํ•˜๊ณ  develop์œผ๋กœ ๋‘์ง€ ๋ง ๊ฒƒ.

์ฐพ์•„๋ณผ ๊ฒƒ

  • git rebase

  • git ์ž‘์—… ํ๋ฆ„

profile
console.log('bang log');

0๊ฐœ์˜ ๋Œ“๊ธ€