我理解React中使用useState钩子更新状态的工作原理如下。
- 将要更改的状态值与当前状态值进行比较
- 如果两个状态值相同,请在不更改状态值的情况下不要重新渲染
- 如果两个状态值不同,请更改状态值并执行重新渲染
https://codesandbox.io/s/nostalgic-fog-riyg4
但在这个例子中,它的作用似乎有所不同。
- 安装应用程序组件时执行第一次渲染
- 单击按钮并执行第二次渲染时,状态值会发生变化。(因为当前状态值和要更改的状态值不同。(
- 再次单击该按钮时,状态值不会更改,但会进行渲染->为什么会发生这种情况?我没想到会渲染,因为这两个状态值是相同的
- 第三次单击该按钮时,状态值不会再次更改,但这次不会重新渲染组件。这是我期望在第二次点击后发生的行为
state
或props
时都会更新。react组件的这两个工件不能在render
函数或render
调用的任何函数中更改。
此外,您必须记住,您永远不能在组件本身中更改组件的道具。道具是从父级传递的,不能由子级更改。但对于state
,您可以在onClick
函数中调用setState
或在render
之外调用任何其他函数,并且无论何时调用setState
,您的组件都会更新其视图。
在熟悉ReactJs之后,我建议您将Redux用于任何类型的数据操作和功能。以下是react redux网站的链接:https://react-redux.js.org/
我希望这能回答你的问题
用于更新通用usestate函数:const[initialState,setState]=使用状态(initialState(
initialState
是组件和的初始状态
setState
是更新initialState 的函数
有关react中useState挂钩的更多信息:链接:https://blog.bitsrc.io/understanding-react-hooks-usestate-6627120614ab
react的useState()
钩子在每次react使用useState()
钩子提供的更新方法更新状态之前进行浅层比较。在这个代码示例中,您可以进行以下更改以清楚地理解它。
您可以进行以下更改并尝试。
useState(0)
,使其像useState({value:0})
setNumber(1)
,使其类似于setNumber({value:1})
- 在16号
{number}
线上,把它做成{number.value}
对appComponent进行上述更改后,无论值是否更改,每次单击按钮时都会进行渲染。
这是因为useState()
在对状态进行更新之前进行浅比较。
在对象的情况下,肤浅的比较总是返回false。因为在浅层比较过程中,对象是使用内存位置进行比较的,而不是通过对象内部的值进行比较。