Javascript 函数组件和类组件的渲染是否不同?

Javascript 函数组件和类组件的渲染是否不同?,javascript,reactjs,recoiljs,Javascript,Reactjs,Recoiljs,当我在某个状态管理器中使用react功能组件(我使用的是recoil.js)并尝试使用react钩子更新状态时,它只在状态与原始状态不同时调用useEffect。 当我谈到组件如何重新渲染的堆栈溢出时,他们讨论的是类组件,以及每次调用setState时它们如何渲染。这只是两个组件类型工作方式的不同,还是我只是误解了它 这是我对功能组件的代码测试: import React, {useEffect} from 'react' import ReactDOM from 'react-dom' imp

当我在某个状态管理器中使用react功能组件(我使用的是recoil.js)并尝试使用react钩子更新状态时,它只在状态与原始状态不同时调用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>
    );

}

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挂钩按照声明的顺序重新调用每个呈现。实际上,您可以创建一个类组件并检查自己-它们以相同的方式呈现