【问题标题】:Should I use a global state or React hook's local state?我应该使用全局状态还是 React hook 的本地状态?
【发布时间】:2020-06-25 06:38:44
【问题描述】:

我有以下代码(使用 React 钩子):

const { state, dispatch } = useContext(Store);

const [branch, setBranch] = useState<TaskingBranchState | null>(null);
const handleBranchChange = (event: ChangeEvent<{}>, newValue: TaskingBranchState | null) => {
    setBranch(newValue);
    setBranchMembers([]);
}
const [branchMembers, setBranchMembers] = useState([]);
const handleBranchMembersChange = (event: ChangeEvent<{}>, newValue: any) => {
    setBranchMembers(newValue);
}

在代码后面的某个地方,我正在执行useQuery 来获取branchMembers,它被分派到我的全局state。如果重要的话,它看起来像这样:

useQuery(GET_BRANCH_MEMBERS(["id", "name"]), {
    variables: {
        branchId: branch?.branchId
    },
    onCompleted: (data) => {
        if (data !== undefined && data.getBranchMembers !== undefined && data.getBranchMembers !== state.branchMembers) {
            dispatch({
                type: 'DISPATCH_TYPE',
                payload: {
                    branchMembers: data.getBranchMembers
                }
            });
        }
    }
});

其中dispatchpayload 写入全局state(与上述useContext 中的state 相同)。

我的问题是:

  1. 我应该使用state.branchMembersuseQuery 调度到的全局值)还是直接调用setBranchMembers 并使用上面定义的本地branchMembers 状态?
  2. 有什么区别?
  3. 在这两种情况下,我是否不再需要定义全局状态(如果对 Q1 回答否)或不再需要在本地使用 useState 定义任何内容(如果对 Q1 回答是)?

一直在弄乱我的代码,才意识到我有这种困惑。不太熟悉 React hooks tbh,所以如果是基础问题,也请帮忙。

谢谢!

【问题讨论】:

    标签: reactjs react-hooks react-state-management react-state


    【解决方案1】:

    这取决于您是否愿意在不同组件之间共享branchMembers

    由于您已经将branchMembers 发送到全局状态,我假设您确实想分享它。因此,您可以只使用全局状态并删除 useState

    const { state, dispatch } = useContext(Store);
    ...
    doSomethingWith(state.branchMembers);
    ...
    

    无需将全局状态数据(来自上下文)写入本地状态(来自useState)即可使用它。您可以立即使用上下文中的数据。

    更新

    如果您的branchMembers 依赖于branch,那么请继续发送branchDatabranchMembers。记得写在reducer里面

    dispatch({
      type: "WRITE_BRANCH_AND_BRANCH_MEMBERS",
      payload: {
        branch: branchId, // or branch or branchData whatever needed
        branchMembers: data.getBranchMembers,
      },
    });
    
    
    // your-reducer.js
    function reducer(state, action) {
      ...
    
      switch (action.type) {
      case "WRITE_BRANCH_AND_BRANCH_MEMBERS": {
        newState = {
          ...state,
          branch: action.payload.branchId,
          branchMembers: action.payload.branchMembers,
        }
        break;
      }
    
      ...
    
      }
    }
    

    【讨论】:

    • 有道理,谢谢!但是,如果我需要为每个组件调用相同的端点但以不同方式实例化它们(例如,我已将某些内容作为数组分派到组件 A 中的 state.branchMembers 中,但是当我打开组件 B 时,我需要将 state.branchMembers 初始化为空数组),那么在这种情况下我应该使用本地状态吗?谢谢!
    • 对不起,但另外,如果我的状态依赖于其他状态(例如 branchMembers 依赖于分支),那么我应该使用本地状态吗?
    • 你是否真的在上下文中存储了一个函数?
    • 如果我的状态依赖于其他状态如果state它是共享的并且依赖于一些otherState然后@987654333 @ 也应该与原始 state 一起共享和存储在上下文中
    • 注意到状态依赖!我会在我的生产代码中记住这一点,这只是测试我的后端功能的东西:) 你在上下文中存储一个函数是什么意思?如果这就是你的意思,我在我的商店中定义了一堆减速器,它们将有效负载的输出映射到状态
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2020-08-06
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多