【发布时间】:2023-03-29 18:10:02
【问题描述】:
当我使用带有状态管理器的反应功能组件(我正在使用recoil.js)并尝试使用反应挂钩更新状态时,它仅在状态不同时调用useEffect 不同比原来的状态。 当我在讨论组件如何重新呈现的堆栈溢出时,他们正在谈论类组件,以及每次调用 setState 时它们如何呈现。这只是两个组件类型工作方式之间的区别还是我只是误解了它?
这是我对功能组件的代码测试:
import React, {useEffect} from 'react'
import ReactDOM from 'react-dom'
import {atom, useRecoilState, RecoilRoot} from 'recoil'
ReactDOM.render(
<React.StrictMode>
<RecoilRoot>
<App />
</RecoilRoot>
</React.StrictMode>,
document.getElementById('root')
);
const testAtom = atom({
key: "test",
default: ""
});
function App(){
return (
<>
<C1 />
<C2 />
</>
);
}
function C1(){
const [test, setTest] = useRecoilState(testAtom);
useEffect(() => {
console.log('effected', 'c1');
});
return (
<div>
<button onClick={() => {setTest('c1')}}>Click me</button>
</div>
);
}
function C2(){
const [test, setTest] = useRecoilState(testAtom);
useEffect(() => {
console.log('effected', 'c2');
});
return (
<div>
<button onClick={() => {setTest('c2')}}>Click me</button>
</div>
);
}
运行这个useEffect只在状态改变的时候被调用,不只是在setTest被调用的时候,这个人said otherwise对于类组件。
React 不比较状态数据。当调用 setState 时,它会将组件标记为脏(这意味着它需要重新渲染)。
这是否意味着如果我要将此作为一个类组件,它每次都会 conoslelog?
【问题讨论】:
-
没有。一个反应组件是一个反应组件。当状态和/或道具更新时,它们会重新渲染。基于类的组件的渲染方法类似于功能组件的整个主体。每次渲染都会调用 React 钩子,按照它们声明的顺序。
-
你实际上可以制作一个类组件并检查你自己 - 它们以相同的方式呈现
标签: javascript reactjs recoiljs