我将尝试解释您可以在哪里使用 LayoutEffect 和 Memo。让我们从 LayoutEffect 的使用开始。
Dan Abramov Link 1, Link 2 说 LayoutEffect 的使用有一些缺点。这是一个很好的解释,你可以在哪里使用这些给 Kent C。 Dodds。如果你需要一个例子,你可以在这里看到它Chris。不要忘记阅读以了解差异。
现在关于使用备忘录。它还有一个drawback。关于我们使用备忘录的内容,以及使用它的地方,您可以找到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 的原因。
但如果有办法不使用这些钩子,那就完美了。