为什么下面代码输入一个字符后,console 会打印两次,但是把useState({}) 改成 useState(3),state从对象改成原始类型只会打印一次
import React, { useState } from "react";
export default function Child() {
const [state, setState] = useState({});
const onChange = () => {
console.log("handleOnFocus", state);
};
return (
<div>
<input type="text" onChange={onChange} />
</div>
);
}
https://codesandbox.io/p/sandbox/react-input-functions-onfocu...
希望能解释state是对象和原始类型表现不一样的原因.
怀疑是sandbox 的bug,就中间console 打印2次。有时改了代码热更新后打印1次,刷新又打印2次。
打印多次是React有意为之滴,看文档 https://legacy.reactjs.org/docs/strict-mode.html#detecting-un...
StrictMode模式, React会进行两次渲染来帮助开发者发现潜在的问题,只会在开发环境存在。
第一次渲染用于检测副作用,第二次渲染用于实际的DOM更新,原始类型数据属于非引用类型没有副作用,所以只会渲染一次
文档部分内容:
React 假设您编写的每个组件都是纯函数。这意味着您编写的 React 组件在给定相同输入(props、state 和 context)的情况下必须始终返回相同的 JSX。
违反此规则的组件会行为不可预测并导致错误。为了帮助您找到意外不纯的代码,严格模式会在开发过程中两次调用某些函数(仅调用应为纯的函数)