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

iipsa 发布于 2017-09-08 dva 最后更新 2018-07-31 22:50 7 浏览

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

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

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

clear() {
    return {};
},

然后在组件的componentWillUnMount中dispatch:

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

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

已邀请:

cea

赞同来自:

@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, } },

},

fillum

赞同来自:

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

somnis

赞同来自:

@sorrycc 发的链接404了