Reactjs Redux:影响两个状态键

Reactjs Redux:影响两个状态键,reactjs,redux,Reactjs,Redux,各位! 我是Redux的新手,我尝试构建天气应用程序。我的状态是: const state={ 城市:[], 所选城市:{} } 我有city reducer和Selected city reducer。当用户删除除最后一个城市以外的所有城市时,我想强制选择该城市。更改城市时,我如何影响selectedCity?(在本例中,从城市数组中删除)如果无法自动执行,您需要在更改城市数组时修改所选城市,或者使用条件列表 cities.length==1?城市[0]:在渲染功能中或需要的任何位置选择城市

各位!

我是Redux的新手,我尝试构建天气应用程序。我的状态是:

const state={
城市:[],
所选城市:{}
}

我有city reducer和Selected city reducer。当用户删除除最后一个城市以外的所有城市时,我想强制选择该城市。更改城市时,我如何影响selectedCity?(在本例中,从城市数组中删除)

如果无法自动执行,您需要在更改城市数组时修改所选城市,或者使用条件列表

cities.length==1?城市[0]:在渲染功能中或需要的任何位置选择城市

编辑:

您要做的是,活动数据是存储在城市中的数据的扩展异步收集版本,这需要副作用

一个干净的方法是这样的:

constructor(props) {
  super(props);
  this.cityChangeHandler = this.cityChangeHandler.bind(this);

cityChangeHandler(city) {
  changeActive(city); // That's an action, which will update the Redux store.
}

render() {
  return (
    <div>{this.props.selectedCity && selectedCity.name}</div>
  );

哇!我找到了答案

我忘了,在异步操作中,除了“dispatch”之外,我们在thunk中间件中传递getState方法作为第二个参数

例如:

export default function thunkMiddleware({ dispatch, getState }) {
    return next => action => {
        typeof action === 'function' ?
            action(dispatch, getState) :
            next(action);
    }
}
export function deleteCity(city) {
    return function(dispatch, getState) {
        dispatch({
            type: CITY_DELETE,
            payload: city
        })

        var currentCitiesLength = getState().cities.length;
        if(currentCitiesLength == 1) {
            dispatch(selectCity(getState().cities[0]));
        } else if(currentCitiesLength == 0) {
            // Pass null to clean selectedCity
            dispatch(selectCity(null));
        }
    }
}
这就是解决方案:在运行中,在同步调度DELETE_CITY之后,我们检查getState()。cities length。如果它等于1-调度,则选择该城市的城市行动

例如:

export default function thunkMiddleware({ dispatch, getState }) {
    return next => action => {
        typeof action === 'function' ?
            action(dispatch, getState) :
            next(action);
    }
}
export function deleteCity(city) {
    return function(dispatch, getState) {
        dispatch({
            type: CITY_DELETE,
            payload: city
        })

        var currentCitiesLength = getState().cities.length;
        if(currentCitiesLength == 1) {
            dispatch(selectCity(getState().cities[0]));
        } else if(currentCitiesLength == 0) {
            // Pass null to clean selectedCity
            dispatch(selectCity(null));
        }
    }
}

和是不同的组成部分。第一个使用城市状态键,第二个使用activeCity状态键。每一个都不知道另一个。在你拥有的减速机中,减速机可以同时管理这两个减速机,即使你发送操作来处理其中一个减速机them@Dmitriy在MapStateTrops中,可以传递所需的任何redux变量。您不需要同时修改这两个选项来通知两个不同的组件。@Kejt您是指CombineReducer的结果吗?@zurfyx将cities键传递给activeCity组件是正确的解决方案吗?