gpt4 book ai didi

reactjs - useLayoutEffect + useState 与 useMemo 的用例

转载 作者:行者123 更新时间:2023-12-03 13:30:50 34 4
gpt4 key购买 nike

我看过这个答案:useMemo vs. useEffect + useState ,它很好地总结了 useEffect ,但就我而言,我想执行一项昂贵的操作来尽早更改 DOM。会useMemo()仍然推荐代替useLayoutEffect()有状态更新吗?效果 -> 状态更新的双重渲染是否会抵消任何性能提升?

编辑

useLayoutEffect()场景:

useLayoutEffect(() => {
const tokens = expensiveOperationGeneratingClasses(param1)
setTokens(tokens)
},
[param1])

render (
<>
{
tokens.map(token => <span className={token.id}/>)
}
</>
)

useMemo场景:

const tokens = useMemo(() => {
return expensiveOperationGeneratingClasses(param1)
},
[param1]

render (
<>
{
tokens.map(token => <span className={token.id}/>)
}
</>
)

实际上我意识到我没有进行 DOM 操作,而只是在渲染 <span> 之前生成类名。标签以避免闪烁,所以我认为我最好使用 useMemo ,我说得对吗?

最佳答案

我将尝试解释在哪里可以使用 LayoutEffect 和 Memo。让我们从 LayoutEffect 的使用开始。

Dan Abramov 表示,使用 LayoutEffect 有一些缺点 Link 1 , Link 2 .这是一个很好的解释,说明您可以在哪里使用这些给出的 Kent C 。 Dodds。如果您需要示例,可以在这里查看 Chris 。不要忘记阅读以了解差异。

现在介绍一下 Memo 的使用。它还有一个drawback 。对于我们使用 Memo 的用途以及使用地点,您可以找到 here .

现在正在实践中。

选项 1 使用 LayoutEffect

import React, { useState, useLayoutEffect } from "react";
import ReactDOM from "react-dom";

import "./styles.css";
const Control = () => {
const [add, setAdd] = useState(1);
return (
<div>
<div>
<PostOffice add={add} />
</div>
<div onClick={() => setAdd(add + 1)}>{"Click"}</div>
</div>
);
};

function PostOffice({ add }) {
const [letter, setLetter] = useState(add);

useLayoutEffect(() => {
console.log("useLayoutEffect");
setLetter(add);
}, [add]);

console.log(letter);
return <div className="App">{console.log(letter, "DOM")}</div>;
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Control />, rootElement);

我不确定这个选项1,因为有一个anti-pattern effect在这里。

选项 2 使用 LayoutEffect

import React, { useState, useLayoutEffect } from "react";
import ReactDOM from "react-dom";

import "./styles.css";
const Control = () => {
const [add, setAdd] = useState(1);
return (
<div>
<div>
<PostOffice add={add} />
</div>
<div onClick={() => setAdd(add + 1)}>{"Click"}</div>
</div>
);
};

function PostOffice({ add }) {
const [letter, setLetter] = useState(0);

useLayoutEffect(() => {
console.log("useLayoutEffect");
setLetter(add);
}, [add]);

console.log(letter);
return <div className="App">{console.log(letter, "DOM")}</div>;
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Control />, rootElement);

将会出现无意义的渲染

选项 useMemo

import React, { useState, useMemo } from "react";
import ReactDOM from "react-dom";

import "./styles.css";
const Control = () => {
const [add, setAdd] = useState(1);
return (
<div>
<div>
<PostOffice add={add} />
</div>
<div onClick={() => setAdd(add + 1)}>{"Click"}</div>
</div>
);
};

function PostOffice({ add }) {
const Letter = useMemo(() => {
console.log("useMemo");
return add + 1;
}, [add]);

console.log(Letter);
return <div className="App">{console.log(Letter, "DOM")}</div>;
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Control />, rootElement);

这里一切都很完美

总计

减去 useMemo 1 ,

减去useLayoutEffect,1 ,反模式效果或无意义渲染,添加useState,

这就是您应该使用 useMemo 的原因。

但如果有办法不使用这些钩子(Hook),那就完美了。

关于reactjs - useLayoutEffect + useState 与 useMemo 的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57030945/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com