redux 中的初始状态不能正常工作
·
问题:redux 中的初始状态不能正常工作
我想显示<Alert />组件取决于状态值isVisible。我设置了初始状态,但它不起作用,虽然我在createLogger中看到状态正在改变。我究竟做错了什么?我使用联合减速器。
减速器_alert.js
const initialState = {
isVisible: false
}
export default function (state = initialState, action) {
switch (action.type) {
case FETCH_WEATHER:
return { isVisible: false };
case FETCH_WEATHER_ERROR:
return { isVisible: true };
}
return state;
}
索引_reducer.js
const rootReducer = combineReducers({
weather: WeatherReducer,
isVisible: AlertReducer
});
export default rootReducer;
天气_container.js
render() {
return (
<div>
{this.props.isVisible ? <Alert alertInfo="Sorry, but city not found." /> : null }
</div>
)
}
}
动作.js
export const FETCH_WEATHER = 'FETCH_WEATHER';
export const FETCH_WEATHER_ERROR = 'FETCH_WEATHER_ERROR';
export function fetchWeather (city) {
const url = `${ROOT_URL}&q=${city}`;
const request = axios.get(url);
return (dispatch) => {
request
.then(({data}) => {
dispatch({type: FETCH_WEATHER, payload: data});
})
.catch((error) => {
dispatch({type: FETCH_WEATHER_ERROR, payload: error});
});
};
}
我可以告诉更多,当我像下面这样修改减速器警报时,一切正常:
export default function (state = false, action) {
switch (action.type) {
case FETCH_WEATHER:
return false;
case FETCH_WEATHER_ERROR:
return true;
}
return state;
}
解答
那是因为当您创建这样的减速器时:
const rootReducer = combineReducers({
weather: WeatherReducer,
isVisible: AlertReducer
});
你将有一个看起来像这样的状态:
state = {
weather: ...,
isVisible: ...
}
通过查看您的减速器初始状态:
const initialState = {
isVisible: false
}
你应该以这种方式访问它:state.isVisible.isVisible在你的组件中,那是因为你的减速器只负责isvisible状态的一部分(而不是整个状态)
TLDR
你的第一个reducer返回一个对象:{isVisible: false|true },所以每当你想访问状态时,你应该这样做:state.isVisible.isVisible,而在你的第二个例子中,你的reducer返回一个布尔值true|false,这就是为什么访问state.isVisible时它工作得很好。
更多推荐
所有评论(0)