#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
действие. и решение таково: в строке 30countReducers
, удалите...state,
, потому что он не должен добавлять выбранные, он должен их заменить.