Redux:影响两个状态键

时间:2017-02-07 22:08:22

标签: reactjs redux

大家好!

我是Redux的新手,我尝试构建天气应用程序。我的州看起来像:

   #include <stdio.h>
   #include <mntent.h>

   FILE *setmntent(const char *filename, const char *type);

   struct mntent *getmntent(FILE *stream);

   int addmntent(FILE *stream, const struct mntent *mnt);

   int endmntent(FILE *streamp);

   char *hasmntopt(const struct mntent *mnt, const char *opt);

   /* GNU extension */
   #include <mntent.h>

   struct mntent *getmntent_r(FILE *streamp, struct mntent *mntbuf,
                              char *buf, int buflen);

我有city reducer和selectedCity reducer。当用户删除除最后一个之外的所有城市我想强制选择城市。更改城市时如何影响selectedCity? (在这种情况下从城市数组中删除)

2 个答案:

答案 0 :(得分:0)

没有办法自动完成,您需要在更改城市数组时修改selectedCity,或者使用条件。

cities.length === 1 ? cities[0] : selectedCity在您的渲染功能中或您需要的地方。

修改

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

这样做的一种干净方式是这样的:

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>
  );
function mapStateProps(state) {
  selectedCity: state.selectedCity,
  cities: state.cities,
}

答案 1 :(得分:0)

哇!我找到了答案!

我忘了,在异步行动中除了&#34;发送&#34;我们将getState方法作为thunk中间件中的第二个参数传递。

例如:

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

这是解决方案:在行动中,在同步调度DELETE_CITY之后我们检查getState()。cities长度。如果它等于1 - 发送CHOOSE_CITY动作那个城市。

例如:

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));
        }
    }
}