Redux: 절대 상태를 변경하지 않음

  • 오늘 FreeCodeCamp는 [Redux의 상태 불변성의 원리] 키를 적용하는 방법에 대한 교훈을 제공할 것입니다. 즉, 상태를 직접 수정하지 않습니다. 대신 상태의 새 복사본을 반환합니다.
  • Redux는 저장소나 감속기에서 상태 불변성을 적극적으로 시행하지 않습니다. 문자열과 숫자는 기본 값이며 본질적으로 변경할 수 없습니다. 즉, 3은 항상 3입니다. 숫자 3의 값은 변경할 수 없습니다. 그러나 배열이나 객체는 변경할 수 있습니다.
  • 코드:

  • const ADD_TO_DO = 'ADD_TO_DO';
    
    // A list of strings representing tasks to do:
    const todos = [
      'Go to the store',
      'Clean the house',
      'Cook dinner',
      'Learn to code',
    ];
    
    const immutableReducer = (state = todos, action) => {
      switch(action.type) {
        case ADD_TO_DO:
          // Don't mutate state here or the tests will fail
          return
        default:
          return state;
      }
    };
    
    const addToDo = (todo) => {
      return {
        type: ADD_TO_DO,
        todo
      }
    }
    
    const store = Redux.createStore(immutableReducer);
    


  • 위에 할 일 항목을 관리하기 위한 코드 편집기에 storereducer가 있습니다. 상태에 새로운 할 일을 추가하려면 감속기에서 ADD_TO_DO 케이스 작성을 완료해야 합니다. action.todo의 항목이 끝에 추가된 새 배열을 반환하는 방법을 찾아야 합니다.
  • 답변:

  • const ADD_TO_DO = 'ADD_TO_DO';
    
    const todos = [
      'Go to the store',
      'Clean the house',
      'Cook dinner',
      'Learn to code',
    ];
    
    const immutableReducer = (state = todos, action) => {
      switch(action.type) {
        case ADD_TO_DO:
          let newList = [...todos]
          newList.push(action.todo)
          return newList;
        default:
          return state;
      }
    };
    
    const addToDo = (todo) => {
      return {
        type: ADD_TO_DO,
        todo
      }
    }
    
    const store = Redux.createStore(immutableReducer);
    
    store.dispatch(addToDo('PS5 Time'))****
    console.log(store.getState()) // 
    [ 'Go to the store',
      'Clean the house',
      'Cook dinner',
      'Learn to code',
      'PS5 Time' ]
    
    
    console.log(todos) // 
    [ 'Go to the store',
      'Clean the house',
      'Cook dinner',
      'Learn to code' ]
    


    배열에 스프레드 연산자 사용


  • (ES6) Redux에서 상태 불변성을 강화하는 데 도움이 되는 것은 기존 배열에서 새 배열을 생성하는 위의 강의에서 사용한 스프레드 연산자....입니다.
  • 배열을 복제하지만 새 배열에 값을 추가하려면 [...myArray, 'new value'] 라고 쓸 수 있습니다. 이것은 myArray의 값으로 구성된 새 배열과 마지막 값으로 새 값 문자열을 반환합니다.
  • 배열의 얕은 복사본만 만든다는 것을 아는 것이 중요합니다. 1차원 배열에 대해서만 변경할 수 없는 배열 연산을 제공합니다.
  • 코드:

  • const immutableReducer = (state = ['Do not mutate state!'], action) => {
      switch(action.type) {
        case 'ADD_TO_DO':
          // Don't mutate state here or the tests will fail
          return
        default:
          return state;
      }
    };
    
    const addToDo = (todo) => {
      return {
        type: 'ADD_TO_DO',
        todo
      }
    }
    
    const store = Redux.createStore(immutableReducer);
    


  • 답변:

  • const immutableReducer = (state = ['Do not mutate state!'], action) => {
      switch(action.type) {
        case 'ADD_TO_DO':
          let newArray = [...state, action.todo]
          return newArray
        default:
          return state;
      }
    };
    


    배열에서 항목 제거


  • 이제 배열에서 항목을 제거하는 연습을 해야 합니다. 기타 유용한 JavaScript 메소드에는 slice()concat() 가 있습니다.
  • 항목의 인덱스를 기반으로 배열에서 항목을 제거하도록 감속기 및 작업 작성자가 수정되었습니다. 특정 인덱스의 항목이 제거된 상태로 새 상태 배열이 반환되도록 리듀서 작성을 마치겠습니다.

  • *암호:

    const immutableReducer = (state = [0,1,2,3,4,5], action) => {
      switch(action.type) {
        case 'REMOVE_ITEM':
          // Don't mutate state here or the tests will fail
          return
        default:
          return state;
      }
    };
    
    const removeItem = (index) => {
      return {
        type: 'REMOVE_ITEM',
        index
      }
    }
    
    const store = Redux.createStore(immutableReducer);
    


  • 답변:

  • const immutableReducer = (state = [0,1,2,3,4,5], action) => {
      switch(action.type) {
        case 'REMOVE_ITEM':
          let a = state.slice(0, action.index)
          let b = state.slice(action.index + 1)
          return a.concat(b)
        default:
          return state;
      }
    };
    
    const removeItem = (index) => {
      return {
        type: 'REMOVE_ITEM',
        index
      }
    }
    
    const store = Redux.createStore(immutableReducer);
    


    Larson, Q., 2019. 프론트엔드 개발 라이브러리. [온라인] Freecodecamp.org. 사용 가능 위치: https://www.freecodecamp.org/learn/front-end-development-libraries/redux

    좋은 웹페이지 즐겨찾기