- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看过这个答案: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/
我有以下组件: // component.js import React from 'react'; import useComponentSize from 'useComponentSize';
据我所知,useLayoutEffect 同步运行,而 useEffect 异步运行 - 或多或少就像我们使用 useLayoutEffect 一样,但是setTimeout(func,0)。 use
我们如何模仿 useLayoutEffect() 的功能?在类组件中? 假设我们的功能组件是 function MyFuncComponent() { useLayoutEffect(() =>
关于 useLayoutEffect 的区别之一对比 useEffect是useLayoutEffect将在 DOM 突变之后和浏览器绘制阶段之前同步触发。 (Reference) 但是,我遇到了一些
我看过这个答案:useMemo vs. useEffect + useState ,它很好地总结了 useEffect ,但就我而言,我想执行一项昂贵的操作来尽早更改 DOM。会useMemo()仍然
完整错误如下: Warning: useLayoutEffect does nothing on the server, because itseffect cannot be encoded int
useMutationEffect 和 useLayoutEffect 在使用方面有什么区别? 我已阅读所有在线可用 Material ,包括(但不限于) Hooks Reference Blog p
我不明白为什么需要以下 useImperativeHandle、useLayoutEffect 和 useDebugValue 钩子(Hook),您能否举例说明何时可以使用它们,但请不要使用文档中的示
我正在使用 React v.16.12.0 和 @MaterialUI/core v4.8.1。 我正在尝试为 React Leaflet Marker 创建自定义图标。图标是 Fab Materia
我想从 React Native 的标题底部删除模糊的边框。我正在使用 useLayoutEffect()钩子(Hook)修改标题但无法删除边框。我试过使用 borderBottomWidth: 0里
在官方 React 文档中,对于 useLayoutEffect ,其中提到: The signature is identical to useEffect, but it fires synchr
我有一个组件,我想在屏幕上呈现 HTML 之前进行一些计算。由于useEffect和 useLayoutEffect可以处理这个任务,我的问题是它们都在代码中,它们中的哪一个将首先被触发,useEff
我是一名优秀的程序员,十分优秀!