@aleks_web_dev

Почему reducer вызывается дважды?

const initialState = {count: 0};

function reducer(state, action) {
//console.log('reducer');  
  switch (action.type) {
    case 'increment':
      //console.log('increment');  
      return {count: state.count + action.num};
    case 'decrement':
      //console.log("decrement");
      return {count: state.count - action.num};
    default:
      throw new Error();
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({type: 'decrement',num:1})}>-</button>
      <button onClick={() => dispatch({type: 'increment',num:1})}>+</button>
    </>
  );
}

export default Counter;


Суть вопроса вот в чем если к счетчику прибавлять или уменьшать значение то //console.log('reducer'); вызывается 2 раза ну и //console.log('increment') и //console.log("decrement"); тоже в данном примере счетчик работает нормально если там будет меняться булевое значение то работает неправильно
при первом клике вызывается по //console.log('reducer'); 1 раз потом по 2

Например в таком примере у меня есть 1 todo item просто с текстом и чекбоксом и я должен поменять ее значение на противоположное но из-за того что в reducer вызывается 2 раза оно не меняться
export default function(state, action) {
  switch (action.type) {
    case 'add':
      return [
        ...state,
        {
          id: Date.now(),
          title: action.payload,
          completed: false
        }
      ]
    case 'toggle':
      return state.map(todo => {
        if (todo.id === action.payload) {
          todo.completed = !todo.completed
        }
        return todo
      })
    case 'remove':
      return state.filter(todo => todo.id !== action.payload)
    default:
      return state
  }
}


не работает в action.type === 'toggle' значение меняться по 2 раза
  • Вопрос задан
  • 571 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Denioo
Чувак у тебя первый код точь в точь из документации(посмотри внимательней):
https://ru.reactjs.org/docs/hooks-reference.html#u...
Второе, определись по тегам ты хук useReducer используешь или redux, если redux то 2 пример есть в документации по redux.
Более наглядное объяснение хука useReducer
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы