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

什么是等效的传递一个更新器到setState,以'(状态,道具)'作为参数更新状态,使用React钩子?

艾宁
2023-03-14

使用React中的setState函数替换的最佳做法是什么。组件--https://reactjs.org/docs/react-component.html#setstate

setState(updater, [callback])

更新程序具有签名的位置

(state, props) => stateChange

(因此,新状态取决于以前的状态和道具)

--用鱼钩?

当我搜索useState钩子的API时,https://reactjs.org/docs/hooks-reference.html#functional-updates

函数更新如果使用以前的状态计算新状态,则可以将函数传递给setState。函数将接收上一个值,并返回更新后的值。下面是一个计数器组件的示例,它使用两种形式的setState:

function Counter({initialCount}) {
  const [count, setCount] = useState(initialCount);
  return (
    <>
      Count: {count}
      <button onClick={() => setCount(initialCount)}>Reset</button>
      <button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
      <button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
    </>
  );
}

更新状态的函数,setCount,不接受props作为参数。

最佳实践是使用useffecthook,并将道具作为依赖项吗?

有人能解释一下为什么这是分开的吗?

共有2个答案

商品
2023-03-14

Hooks FAQ中有一节是关于如何实现getDerivedStateFromProps?。虽然它首先说你可能不需要从道具派生状态,但它接着给出了一个通过闭包引用道具的例子,即直接引用它们。

所以我认为直接引用prop和set state函数参数的组合应该可以工作,比如:

export default function Conuter({ incrementBy }) {
  const [count, setCount] = useState(0)
  return (
    <>
      Count: {count}
      <button onClick={() => setCount(prevCount => prevCount + incrementBy)}>
        Increase count by increment
      </button>
      <button onClick={() => setCount(0)}>Reset</button>
    </>
  );
}

这里有一个活生生的例子。

亢胤运
2023-03-14

简而言之,是的,使用设置计数(计数1)是完全安全的,这是设置功能组件状态的通常做法。

如果您正在寻找回调模式,我相信这篇其他的SO帖子将更适合回答您的问题,因为他们正在为此目的使用使用效果钩子。

 类似资料:
  • 所以我有这个: 只是一个数组的数字例如然而没有给出正确的总数,但?我甚至放了一个超时延迟,看看这是否解决了问题。任何明显的还是我应该发布更多的代码?

  • 我试图将“加载”的状态从true更改为false,但当我调用一个函数并在该函数中设置“this.setState({loading:false})”时,加载状态仍然保持true。 在下面的代码中,当按钮按钮函数被调用时,它将“加载”状态设置为真,但当用户成功登录“加载”状态时,应该变为假,这样我的渲染按钮函数将重新渲染,旋转器可以隐藏自己并显示按钮。 为什么LoginSAccess函数中的“加载”

  • 我有问题的反应形式和管理的状态适当。我在一个表单中有一个时间输入字段(在一个模态中)。初始值在中设置为状态变量,并从父组件传入。这本身就很好用。 当我想通过父组件更新默认的start_time值时,问题就来了。更新本身通过在父组件中发生。但是,在我的表单中,默认的start_time值从不更改,因为它只在中定义过一次。 我尝试使用通过强制更改状态,这确实起到了作用,但给了我错误。 所以我的问题是,

  • 我正在尝试使用状态将一个表单输入值复制到另一个表单输入值,但状态没有更新 我创建了一个带有按钮的表单,其中左侧表单输入的值应复制到右侧表单输入。这是我的代码: 无论我做什么,dbSecName的状态都不会改变。我试着设置一个新的常量。我尝试使onclick函数异步并等待。如果我为我试图设置的变量的值添加,我可以正确地看到它,但是dbSecName的console.log总是显示原始值。 我真的不知

  • 我有一个对象的状态数组: 我有一个添加按钮,用于将对象添加到数组中,这是onclick事件的主体:

  • 它几乎添加了一个对象,该对象包含来自主窗体的子窗体的值。 这是我用作按钮的函数的函数。 这将一个新对象添加到一个名为的状态,该状态是一个对象数组。 提前谢了。