如何在反应钩子中修改我选择的对象?

Posted

技术标签:

【中文标题】如何在反应钩子中修改我选择的对象?【英文标题】:How can I modify a object of my choice in a react hook? 【发布时间】:2021-06-19 14:35:47 【问题描述】:

当点击按钮时,如何将foo2 更改为e.target.value,而不影响其他对象?

import React from 'react'

export const App = () => 
  const [state, setState] = useState(
    foo1: "12", foo2: 2, foo3: null
  )
  return (
    <div>
      <input type="button" value="" onClick=(e) => setState()/>
    </div>
  )

【问题讨论】:

foo1: "12", foo2: 2, foo3: null 考虑一个数组。如果属性之间没有那么相关,请考虑单独的状态,而不是将它们放在单个大状态对象中以使更新更容易。 我最大的问题是我不知道如何将状态一个一个地传递给另一个组件。 @CertainPerformance 如果你想传递所有的值,拥有一个单一的状态对象可能更合理。 &lt;SomeComp state=state /&gt; 【参考方案1】:

使用spread operator

setState( ...state, foo2: e.target.value )

【讨论】:

【参考方案2】:

如果“其他对象”是指状态对象中的其他值,那么您可以使用 javascript 的扩展运算符 setState( ...state, foo2: 1 ); 执行以下操作 作为替代方案,您也可以为各个值使用单独的 useState 钩子,如果它们没有在逻辑上组合在一起。但是,您可能不关心额外的样板文件。

【讨论】:

【参考方案3】:

您可以为按钮添加name 属性,并使用它通过传播原始状态来更新状态,并使用target.value 覆盖属性[target.name]

const  useState  = React

const App = () => 
  const [state, setState] = useState(
    foo1: "12", foo2: 2, foo3: null
  )
  
  const update = ( target ) => 
    setState(s => ( ...s, [target.name]: target.value ))
  
  
  console.log(state)
  
  return (
    <div>
      <button type="button" name="foo1" value="" onClick=update>Foo 1</button>
      <button type="button" name="foo2" value="" onClick=update>Foo 2</button>
      <button type="button" name="foo3" value="" onClick=update>Foo 3</button>
    </div>
  )


ReactDOM.render(
  <App />,
  root
)
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>

<div id="root"></div>

【讨论】:

以上是关于如何在反应钩子中修改我选择的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象添加到反应钩子?

反应表单钩子如何验证选择选项

如何正确更新反应钩子状态中的数组

如何使用我的反应应用程序中的 useState 钩子给出的 setState 方法增加状态对象的选定索引的计数

反应钩子:useState/context;无法读取未定义的属性“头像”/如何更新嵌套对象

如何在反应中使用带有useState钩子的回调[重复]