Dva: 如何正确的清空某个路由下model中的数据

Created on 8 Sep 2017  ·  3Comments  ·  Source: dvajs/dva

我现在在写一个编辑新闻的页面,因为编辑和新建都是一样的逻辑,所以我写在同一个页面中的,但问题是当我进入编辑逻辑时model中会残留着该次新闻编辑的model数据,当我下次以新建新闻的逻辑进来时就会把上次编辑新闻时的残留model数据加载进来,从而会影响到页面,我现在清空model的做法是在effects中写一个clearModel方法:

*clearModel({ payload }, { put }) {
    yield put({
        type: 'clear',
    });
},

同时在reducer中新建一个clear方法:

clear() {
    return {};
},

然后在组件的componentWillUnMount中dispatch:

dispatch({
    type: 'model/clearModel',
    payload: {}
});

问下各位大佬,我这种写法有问题不?感觉这么写有点不妥啊。

Most helpful comment

@sorrycc 发的链接404了

All 3 comments

@hanxiansen
我之前用过的一种写法是在 model 中的 subscriptions 用 history.listen((location))去判断当前进入的路由去调用不同的方法,如果是编辑的话先从服务端获取数据再渲染,如果是创建的话,就把当前的status中的数据清空,(只是我自己的做法不知到是否合适)代码如下:

..........
  state: {
    topicData: {},
    topicId: '',
  },

  subscriptions: {

    setup ({ dispatch, history }) {
      history.listen((location) => {
        const match = pathToRegexp('/topic/:id/edit').exec(location.pathname)
        if (match) {
          dispatch({
            type: 'getTopic',
            payload: { id: match[1] },
          })
        } else {
          dispatch({
            type: 'updateState',
            payload: { topicData: {}, topicId: '' },
          })
        }
      })
    },

  },

..........
  effects: {
    * getTopic ({ payload }, { call, put }) {
      const accesstoken = localStorage.getItem('accesstoken')
      let params = { accesstoken }
      params = Object.assign(params, payload)
      let data = yield call(getTopic, params)
      console.log(data)
      if (data.success) {
        data = { topicData: data.data, topicId: data.data.id }
        // yield put({
        //   type: 'setTopicId',
        //   payload: { topicId: payload.id },
        // })
        yield put({ type: 'updateState',
          payload: data,
        })
      }
    },
.......
},

  reducers: {
     ........
    updateState (state, { payload }) {
      return {
        ...state,
        ...payload,
      }
    },

  },

你这么做没啥问题,state 的变动肯定得走 reducer 。不过编辑、新增的逻辑走 modal 的话,数据可以不放 model 里,参考 https://github.com/dvajs/dva/blob/master/packages/dva-example-user-dashboard/ 的处理方式。

@sorrycc 发的链接404了

Was this page helpful?
0 / 5 - 0 ratings