javascript - 如何将 React useState 钩子(Hook)解构到命名空间中?

标签 javascript reactjs

作为个人喜好,我将 React props 包装在命名空间中。它帮助我组织不同 Prop 的来源。

通过 useState 钩子(Hook)我正在这样做。

function MyComponent() {
  const [todoCount, setTodoCount] = useState(100);
  const [doneCount, setDoneCount] = useState(0);
  const myState = {
    todoCount,
    setTodoCount,
    doneCount,
    setDoneCount
  };

  return (
    <>
      <Text>Todo {myState.todoCount}</Text>
      <Text>Done {myState.doneCount}</Text>
    </>
  );
}

是否有更简洁的状态设置语法?

我失败的尝试是

const myState = {
  [todoCount, setTodoCount]: useState(100),
  [doneCount, setDoneCount]: useState(0);
};

最佳答案

听起来像是您可以作为 custom hook 的一部分做的事情。例如

 function useMappedState(defaultState = {}) {
   const keys = Object.keys(defaultState);
   return keys.reduce((map, k) => {
     const fk = `set${k.charAt(0).toUpperCase()}${k.slice(1)}`;
     const [state, setState] = useState(defaultState[k]);
     map[k] = state;
     map[fk] = setState;
     return map;
   }, {});
 }
 ...
 const state = useMappedState({
   todoCount: 100,
   doneCount: 0
 });
 console.log(state.todoCount) // 100
 state.setTodoCount(5); // should set state of todoCount

理论上,这应该给你你想要的,但我没有测试过,所以谨慎使用(例如,我什至不确定是否可以调用钩子(Hook)在迭代器内)。 - 这个 works fine .

尽管如此,您正在做的事情确实useReducer 类似。已经这样做了,也许值得尝试一下这个钩子(Hook)。

关于javascript - 如何将 React useState 钩子(Hook)解构到命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56622854/

相关文章:

c# - 如何在 JavaScript 中从 ASP.net TextBox 模板列读取值

Javascript 对象值没有得到正确的值

javascript - 将多个 jQuery 元素选择器传递给一个函数

javascript - React Router 和 framer motion Animate Presence

reactjs - 无法在 Jenkins 管道中构建 reactjs

reactjs - 使用 react-moment 转换日期

css - react : background image overlaps navbar

javascript - 无法在 Laravel 上使用 swal 确认删除

reactjs - 访问 React 中的组件方法

javascript - 如何在括号中设置 jslint ES6 指令?