после использования react-router-dom url изменился, но страница не перерисовывалась

#reactjs #redux #react-router

#reactjs #redux #react-router

Вопрос:

я использую react, redux, react-router для своего проекта, и я столкнулся с проблемой.

всякий раз, когда я использую history.push() или Link to=» , целевой веб-сайт не отображается, но после его обновления все снова становится нормальным!

(добавление {forcefresh: true} в ./history, похоже, решает проблему, но есть ли другие способы сделать это!)

Как вы можете видеть, isSignedIn после перенаправления значение равно null:

введите описание изображения здесь

Но после обновления он получит true значение.

Мой редуктор:

 import { SIGNED_IN, SIGNED_OUT } from '../actions/actionTypes';

const initialState = {
  isSignedIn: null,
  userInfo: null,
};

export default (state = initialState, action) => {
  switch (action.type) {
    case SIGNED_IN:
      return { ...state, isSignedIn: true, userInfo: action.payload }; //important parts!
    case SIGNED_OUT:
      return { ...state, isSignedIn: false, userId: null };
    default:
      // return { ...state, isSignedIn: true, userInfo: action.payload };
      return initialState;
  }
};
  

Комментарии:

1. github.com/0529bill/countable

2. /client/src/components/App/App.js для настройки маршрутизатора и маршрута

3. /client/scr/history.js для настройки истории

4. Вы должны были опубликовать код в самом вопросе. Но настройка вашего маршрутизатора выглядит нормально. В чем именно проблема? Вы не можете перейти на какой-либо маршрут, используя history.push или это проблема с аутентификацией, т.Е. Вы не видите домашнюю страницу / панель мониторинга после завершения входа в систему?

5. у меня есть проблемы, подробно описанные в видеоформате здесь: kapwi.ng/c/njymI7Aw

Ответ №1:

В вашем редукторе, когда у вас есть необработанное действие, вы сбрасываете состояние (возвращаете начальное состояние):

   switch (action.type) {
    ...
    default:
      return initialState;
  }
  

вот почему isSignedIn после перенаправления становится нулевым. потому что, когда есть необработанное действие, это приведет к сбросу состояния. (я взглянул на ваш репозиторий, и там вызвано действие FETCH_COUNTS , которое не обрабатывается.)

Поэтому измените его на:

 export default (state = initialState, action) => {
  switch (action.type) {
    case SIGNED_IN:
      return { ...state, isSignedIn: true, userInfo: action.payload }; //important parts!
    case SIGNED_OUT:
      return { ...state, isSignedIn: false, userId: null };
    default:
      console.error('action is not handled!', action)
      return state; // <----- just return previous state when the actiontype is not recognized
  }
  return state
};

  

так что это не приведет к сбросу состояния, когда у вас есть необработанное действие.

Комментарии:

1. прежде всего, большое вам спасибо за ваш ответ! но здесь возникает другая проблема: всякий раз, когда я пытаюсь создать новый «счетчик», в src / components / Menucount он создаст два одинаковых счета! и, как ни странно, когда я обновляю страницу, количество секунд исчезает! можете ли вы пролить свет на эту проблему? и почему это происходит! Заранее спасибо!

2. @water проблема в том, что вы добавляете новый элемент 2 раза. один, когда вы отправляете CREATE_COUNT действие, а другой, когда вы отправляете FETCH_COUNTS действие. и решение таково: в строке 30 countReducers , удалите ...state, , потому что он не должен добавлять выбранные, он должен их заменить.