我已经看到了这个答案:useMemo vs.Useffect useState,它对Useffect
进行了很好的总结,但在我的例子中,我希望执行一个昂贵的操作,尽早改变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操作,而是在呈现
我将尝试解释在哪里可以使用LayoutEffect和Memo。让我们从使用LayoutEffect开始。
Dan Abramov Link 1, Link 2表示,使用Layout效应有一些缺点。这是一个很好的解释,你可以使用这些给肯特C.多德。如果你需要一个例子,你可以在这里看到它,克里斯。不要忘记阅读来理解区别。
现在关于使用备忘录。它也有一个缺点。对于我们使用的备忘录,以及它的使用地点,您可以在这里找到。
现在在实践中。
选项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,因为这里有一个反模式的效果。
选项2使用布局效果
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);
这将是一个毫无意义的渲染
选项使用备忘录
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);
在这里,一切都很完美
共计
减去备忘录1,
减去useLayoutEffect,1,反模式效果或无意义渲染,添加useState,
这就是为什么你应该使用useMemo。
但是如果有一种方法不使用这些钩子,它将是完美的。
本文向大家介绍JSONObject与JSONArray的使用,包括了JSONObject与JSONArray的使用的使用技巧和注意事项,需要的朋友参考一下 1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: 1.commons-lang.jar 2.commons-beanutils.jar 3.commons-collections.jar
如何正确使用和?例如,当我创建一个有状态小部件时,它开始加载数据(FutureBuilder),然后我应该用新数据更新列表,所以我使用setState,但它开始循环无穷大(因为我再次重建了小部件),有什么解决方案吗?
目标 无明确目标 知识点 了解 mongodb (http://www.mongodb.org/ ) 学习 mongoose 的使用 (http://mongoosejs.com/ ) 课程内容 mongodb mongodb 这个名词相信大家不会陌生吧。有段时间 nosql 的概念炒得特别火,其中 hbase redis mongodb couchdb 之类的名词都相继进入了大众的视野。 hba
本文向大家介绍window.onerror()的用法与实例分析,包括了window.onerror()的用法与实例分析的使用技巧和注意事项,需要的朋友参考一下 onerror语法使用 onerror 默认有三个入参: •msg: 错误信息 •url:错误所在文件 •line: 错误所在代码行,整型 window.onerror = function(msg, url, line){ // some
本文向大家介绍JSP中Servlet的Request与Response的用法与区别,包括了JSP中Servlet的Request与Response的用法与区别的使用技巧和注意事项,需要的朋友参考一下 JSP中Servlet的Request与Response的用法与区别 简介:Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的respo
本文向大家介绍log4j与slf4j的使用与区别详解,包括了log4j与slf4j的使用与区别详解的使用技巧和注意事项,需要的朋友参考一下 学习目标 (1)Junit 针对方法 (2)log4j与sl4j (3)Spring - IOC log4j的介绍 (1)什么是log4j? Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件等 (2)