Javascript 函数组件和类组件的渲染是否不同?
当我在某个状态管理器中使用react功能组件(我使用的是recoil.js)并尝试使用react钩子更新状态时,它只在状态与原始状态不同时调用useEffect。 当我谈到组件如何重新渲染的堆栈溢出时,他们讨论的是类组件,以及每次调用setState时它们如何渲染。这只是两个组件类型工作方式的不同,还是我只是误解了它 这是我对功能组件的代码测试:Javascript 函数组件和类组件的渲染是否不同?,javascript,reactjs,recoiljs,Javascript,Reactjs,Recoiljs,当我在某个状态管理器中使用react功能组件(我使用的是recoil.js)并尝试使用react钩子更新状态时,它只在状态与原始状态不同时调用useEffect。 当我谈到组件如何重新渲染的堆栈溢出时,他们讨论的是类组件,以及每次调用setState时它们如何渲染。这只是两个组件类型工作方式的不同,还是我只是误解了它 这是我对功能组件的代码测试: import React, {useEffect} from 'react' import ReactDOM from 'react-dom' imp
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>
);
}
import React,{useffect}来自“React”
从“react dom”导入react dom
从“recoil”导入{atom,useRecoilState,RecoilRoot}
ReactDOM.render(
对于类组件
React不比较状态数据。调用setState时,它会将组件标记为脏组件(这意味着需要重新呈现)
这是否意味着,如果我将它作为一个类组件,它每次都会显示出来?是和否。我不会说“它们呈现方式不同”,但在确定何时重新呈现组件之间存在差异。我理解人们如何期望默认行为是相同的,但是,我也理解引入新的状态系统(useState
)为开发人员提供了改进默认行为的机会
我不知道反冲是如何具体工作的,但我假设它的行为至少类似于useState
wrt重新提交组件。从:
如果将状态挂钩更新为与当前状态相同的值,React将退出,而不渲染子级或激发效果。(React使用。)
这证实了你的观察
但让我明确一点:这不是功能组件的特征,这只是useState
的工作方式。您可以开发自己的状态管理挂钩,它的行为会有所不同
现在查看添加类组件,来自:
setState()
将始终导致重新渲染,除非shouldComponentUpdate()
返回false
关于:
使用shouldComponentUpdate()
让React知道组件的输出是否不受当前状态或道具更改的影响。默认行为是在每次状态更改时重新渲染,在大多数情况下,您应该依赖默认行为
当接收到新的道具或状态时,将在呈现之前调用shouldComponentUpdate()
。默认值为true
第一部分没有那么清楚(“默认行为是在每次状态更改时重新渲染”,但将相同的值设置为“更改”),但第二段明确指出。shouldComponentUpdate
默认返回true
,因此在调用setState
时组件将始终重新渲染
如果您实现了shouldComponentUpdate
来调用Object.is
,您将复制useState
的行为。是和否。我不会说“它们呈现不同”,但在确定何时重新呈现组件之间存在差异。我理解人们如何期望默认行为是相同的,但是,我也理解引入新的状态系统(useState
)为开发人员提供了改进默认行为的机会
我不知道反冲是如何具体工作的,但我假设它的行为至少类似于useState
wrt重新提交组件。从:
如果将状态挂钩更新为与当前状态相同的值,React将退出,而不渲染子级或激发效果。(React使用。)
这证实了你的观察
但让我明确一点:这不是功能组件的特征,这只是useState
的工作方式。您可以开发自己的状态管理挂钩,它的行为会有所不同
现在查看添加类组件,来自:
setState()
将始终导致重新渲染,除非shouldComponentUpdate()
返回false
关于:
使用shouldComponentUpdate()
让React知道组件的输出是否不受当前状态或道具更改的影响。默认行为是在每次状态更改时重新渲染,在大多数情况下,您应该依赖默认行为
当接收到新的道具或状态时,将在呈现之前调用shouldComponentUpdate()
。默认值为true
第一部分没有那么清楚(“默认行为是在每次状态更改时重新渲染”,但将相同的值设置为“更改”),但第二段明确指出。shouldComponentUpdate
默认返回true
,因此在调用setState
时组件将始终重新渲染
如果实现shouldComponentUpdate
来调用Object.is
,您将复制useState
的行为。react组件是react组件。当状态和/或道具更新时,它们会重新渲染。基于类的组件的渲染方法类似于功能组件的整个主体。react钩子按声明的相同顺序调用每个渲染。实际上,您可以创建一个类组件并检查自己-它们以相同的方式渲染否。react组件是react组件。当状态和/或道具更新时,它们会重新渲染。基于类的组件的渲染方法类似于功能组件的整个主体。react挂钩按照声明的顺序重新调用每个呈现。实际上,您可以创建一个类组件并检查自己-它们以相同的方式呈现