react/jsx-no-constructed-context-values 性能
它做了什么
禁止在 JSX Context Provider 中使用会导致无意义重新渲染的值。
为什么这是不好的?
每当 React Context 及其所有子节点和 Consumers 的 value 属性发生变化时,就会触发重新渲染。由于每个 JavaScript 对象都有其自身的身份标识,因此像对象表达式({foo: 'bar'})或函数表达式这样的结构在每次渲染时都会获得新的身份。这会使 Context 认为它收到了一个新对象,从而导致不必要的重新渲染和意外后果。
这种行为可能带来巨大的性能开销,因为不仅会引发 Context Provider 及其子树中所有元素的重新渲染,还会浪费掉 React 在遍历整个组件树以渲染 Provider 并查找 Consumers 所需的处理时间。
示例
以下为 错误 的代码示例:
jsx
return <SomeContext.Provider value={{ foo: "bar" }}>...</SomeContext.Provider>;jsx
function Component() {
function foo() {}
return <MyContext.Provider value={foo} />;
}以下为 正确 的代码示例:
jsx
const foo = useMemo(() => ({ foo: "bar" }), []);
return <SomeContext.Provider value={foo}>...</SomeContext.Provider>;jsx
const MyContext = createContext();
const Component = () => <MyContext.Provider value="Some string" />;如何使用
要通过配置文件或 CLI 启用 此规则,可以使用:
json
{
"plugins": ["react"],
"rules": {
"react/jsx-no-constructed-context-values": "error"
}
}bash
oxlint --deny react/jsx-no-constructed-context-values --react-plugin