当前位置: 首页 > 知识库问答 >
问题:

在状态对象中对多个键/值对使用React钩子

蒋胡非
2023-03-14

我想知道在功能组件中为状态定义多个键/值对的最佳方法是什么。

在一个类中,我会初始化状态

this.state = {
    first: 'foo',
    second: 'bar'
};

更新我调用的State

this.setState({
    first: 'foobar'
    second: 'barfoo'
});

现在使用React Hooks,我像这样初始化State。

const [first setfirst] = useState('foo');
const [second, setSecond] = useState('bar');

更新我调用的State

setFirst = 'foobar';
setSecond = 'barfoo';

但是,依我看,这并不理想。我必须重写const[x,setX]=useState(…)每次我想向状态对象添加新的键/值对时。样板。我还必须记住x的“setter”名称,即setX。如果状态对象增长,则会变得混乱。

如果我能打个电话就好了

setState(first: 'foobar', second: 'barfoo');

但是我不确定如何正确初始化State对象/最好的方法是什么。


共有3个答案

湛安宁
2023-03-14

我建议买减速机挂钩。React官方网站说,若你们有复杂的状态,那个就选择userReducer钩子。



const initialState = {
first: 'foo',
second: 'bar'
};

function reducer(state, action) {
  switch (action.type) {
    case 'updateFirst':
      return {...state, first: 'fooBar' };
    case 'updateSecond':
      return {...state, second: 'barfoo' };
    case 'updateBoth':
      return {...state, second: 'barfoo',first: 'fooBar' };
    default:
      throw new Error();
  }
}

function Component() {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <>
      {state.first}
      {state.second}
      <button onClick={() => dispatch({type: 'updateFirst'})}>UpdateFirst</button>
      <button onClick={() => dispatch({type: 'updateSecond'})}>UpdateSecond</button>
      <button onClick={() => dispatch({type: 'updateBoth'})}>UpdateBoth</button>
    </>
  );
}


代码:https://codesandbox.io/s/busy-rosalind-9oiow

丁书
2023-03-14

使用对象作为初始值

您可以使用javascript对象作为您的值。通过这种方式,您可以在对象和一个位置放置更多变量。因此,您的代码如下所示:

const [example, setExample] = useState({first:'foobar', second:barfoo''});

然后你可以像这样更新它:

setExample({...example,first:'new foobar'})
setExample({...example,second:'new foobar second'})

这种类型的设置正在解构您以前的值,并用旧值替换您的新值。

使用此对象,您只需将新的属性添加到示例的初始化和需要设置它的位置。

作为一个复杂的示例,您可以访问以下链接:

用对象反应钩子useState()

通知(更新变量)

如果您只是使用{first:'new fobar'}更新它,并且在属性中不包括第二,您可能会丢失第二的旧值。所以使用...例子来获得旧的值第二个

澹台季萌
2023-03-14

可以使用useState设置整个对象,如下所示-

const [stateObj, setStateObj] = useState({first:'foobar', second:'barfoo'});

然后更新状态-

setStateObj({first:'foobarnew', second:'barfoonew'})
 类似资料:
  • 问题内容: 我发现React Hooks文档的这两部分有些令人困惑。使用状态挂钩更新状态对象的最佳实践是哪一种? 想象一下要进行以下状态更新: 选项1 从使用React Hook的文章中,我们可以做到: 所以我可以做: 然后: 选项2 从钩子参考中我们可以得出: 与类组件中的setState方法不同,useState不会自动合并更新对象。您可以通过将函数更新程序形式与对象传播语法结合使用来复制此行

  • 我发现这两个反应钩文档有点混乱。使用状态钩子更新状态对象的最佳实践是哪一个? 假设一个用户希望进行以下状态更新: 选择1 从使用React Hook一文中,我们可以看出这是可能的: 所以我可以做: 然后呢: 选择2 从Hooks参考中我们得到: 与类组件中的setState方法不同,useState不会自动合并更新对象。通过将函数更新程序窗体与对象扩展语法相结合,可以复制此行为: 据我所知,两者都

  • 我想用React useState钩子设置多个状态值,这样我就可以用useEffect钩子分别更新它们。我有以下代码: 但是当我用React DevTools检查应用程序时,我会看到钩子的多个“状态”值,而不是“订单”、“支付”、“提交”等。

  • 但是我想这样做(不要得到预期的结果): 我错过了什么?

  • 我有以下数据库结构: 对于如何从April和May键获取对象的值,我有点困惑。使用*ngFor在对象上迭代时。我将所有关键点都作为对象。我试图使用,但不起作用。 完整代码: Html 输出 如上所述,我的数据现在位于下。那么,我如何避免或访问密钥以获取数据呢?是否可以使用?

  • 问题内容: 或者,实际上,如何按多个键对词典列表进行排序? 我有一个字典列表: 并且我需要使用由Total_Points反转的多键排序,然后不由反转。 可以在命令提示符下完成,如下所示: 但是我必须通过一个函数来运行它,在其中传递列表和排序键。例如,。 对于传递给multikeysort函数的任意数量的键,如何使用lambda行将对列表进行排序,并考虑到sortkey可以具有任意数量的键,并且需要