我想要显示<Alert />
组件取决于状态值isVisible
。虽然我在createLogger
中看到状态正在发生变化,但我设置了初始状态但它不起作用。我究竟做错了什么?
我使用联合减速器。
reducer_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;
}
index_reducer.js
const rootReducer = combineReducers({
weather: WeatherReducer,
isVisible: AlertReducer
});
export default rootReducer;
weather_container.js
render() {
return (
<div>
{this.props.isVisible ? <Alert alertInfo="Sorry, but city not found." /> : null }
</div>
)
}
}
actions.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});
});
};
}
我可以告诉更多,当我修改如下所示的reducer警报时,一切正常:
export default function (state = false, action) {
switch (action.type) {
case FETCH_WEATHER:
return false;
case FETCH_WEATHER_ERROR:
return true;
}
return state;
}
答案 0 :(得分:3)
那是因为当您创建这样的缩减器时:
const rootReducer = combineReducers({
weather: WeatherReducer,
isVisible: AlertReducer
});
你的状态如下:
state = {
weather: ...,
isVisible: ...
}
通过查看你的减速器初始状态:
const initialState = {
isVisible: false
}
你应该这样访问它:state.isVisible.isVisible
在你的组件中,因为你的reducer只负责isvisible
部分状态(而不是整个状态)
<强> TLDR 强>
你的第一个reducer返回一个对象:{isVisible: false|true }
,所以每当你想要访问状态时,你应该这样做:state.isVisible.isVisible
,而在你的第二个例子中你的reducer返回一个boolean { {1}},这就是访问true|false
时工作正常的原因。