首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用diff方法更新状态

如何使用diff方法更新状态
EN

Stack Overflow用户
提问于 2022-04-16 15:57:17
回答 1查看 45关注 0票数 0

我在react "react": "^17.0.0",中定义了这样的状态:

代码语言:javascript
复制
export interface IRoleState {
    data: API.InterviewList,
    menus: API.MenuItem,
    meta: {
        total: number
        per_page: number
        page: number
    }
}

当我收到来自服务器的响应时,我希望像这样更新menus项目:

代码语言:javascript
复制
*getMenuTree({payload: params}, effects) {
            if(!params) return;            
            const data = yield effects.call(menuPage,  params)
            if (data) {
                yield effects.put({
                    type: 'getTree',
                    payload: {
                        menus: data
                    }
                })
            }
        },

但是现在我发现它用菜单覆盖所有的值,如何使用diff方式更新菜单项?只更新菜单,保持其他值不变。我试过这样做:

代码语言:javascript
复制
yield effects.put({
                    type: 'getTree',
                    payload: {
                        ...,
                        menus: data
                    }
                })

似乎不起作用。这是国家的完整代码:

代码语言:javascript
复制
import { Effect, Reducer, Subscription } from 'umi';
import { rolePage } from '@/services/ant-design-pro/permission/role/role';
import { menuPage } from '@/services/ant-design-pro/permission/menu/menu';

export interface IRoleState {
    data: API.InterviewList,
    menus: API.MenuItem,
    meta: {
        total: number
        per_page: number
        page: number
    }
}

interface IRoleModel {
    namespace: 'roles'
    state: IRoleState
    reducers: {
        getPage: Reducer<IRoleState>,
        getTree: Reducer<IRoleState>
    }
    effects: {
        getRolePage: Effect,
        getMenuTree: Effect
    }
    subscriptions: {
        setup: Subscription
    }
}


const RoleModel: IRoleModel = {
    namespace: 'roles',
    state: {
        data: {},
        menus: {},
        meta: {
            current: 1,
            pageSize: 10,
            page: 1
        }
    },
    reducers: {
        getPage(state, action) {
            return action.payload
        },
        getTree(state, action){
            return action.payload
        },
    },
    effects: {
        *getRolePage({payload: params}, effects) {
            if(!params) return;            
            const data = yield effects.call(rolePage,  params)
            if (data) {
                yield effects.put({
                    type: 'getPage',
                    payload: {
                        data: data,
                        meta: {
                            ...params
                        }
                    }
                })
            }
        },
        *getMenuTree({payload: params}, effects) {
            if(!params) return;            
            const data = yield effects.call(menuPage,  params)
            if (data) {
                yield effects.put({
                    type: 'getTree',
                    payload: {
                        menus: data
                    }
                })
            }
        },
    },
    subscriptions: {
        setup({ dispatch, history }, done) {
            return history.listen((location, action) => {
                if(location.pathname === '/users' || location.pathname === '/my') {
                    dispatch({
                        type: 'getRemove',
                        payload: {
                            page: 1,
                            per_page: 5
                        }
                    })
                }
            })
        }
    }
};
export default RoleModel;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-16 16:10:00

我假设您使用的是redux-saga,在这种情况下,您可以在redux减速器中扩展当前状态。

代码语言:javascript
复制
...
return {
  ...state,
  menus: action.payload.menus
}
...

或者,您可以通过选择器获取saga中的数据,并将整个数据发送到减缩器,但我不推荐。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71895379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档