如何使用useffect
钩子(或任何其他钩子)来复制组件willunmount
?
在传统的类组件中,我将执行以下操作:
class Effect extends React.PureComponent {
componentDidMount() { console.log("MOUNT", this.props); }
componentWillUnmount() { console.log("UNMOUNT", this.props); }
render() { return null; }
}
使用useffect
hook:
function Effect(props) {
React.useEffect(() => {
console.log("MOUNT", props);
return () => console.log("UNMOUNT", props)
}, []);
return null;
}
(完整示例:https://codesandbox.io/s/2oo7zqzx1n)
这不起作用,因为在useffect
中返回的“cleanup”函数捕获装载期间的道具,而不是卸载期间的道具状态。
如何在不运行函数体(或清除)的情况下对每个道具更改进行清理?
一个类似的问题并没有涉及获得最新道具的部分。
文件状态为:
如果希望运行一个效果并只清理一次(装载和卸载时),可以将空数组([])作为第二个参数传递。这告诉React,您的效果不依赖于道具或状态的任何值,因此它永远不需要重新运行。
然而,在这种情况下,我依赖道具...但只是为了清理部分...
useEffect(() => {
if (elements) {
const cardNumberElement =
elements.getElement('cardNumber') || // check if we already created an element
elements.create('cardNumber', defaultInputStyles); // create if we did not
cardNumberElement.mount('#numberInput');
}
}, [elements]);
useLayout效应()是您在2021年的答案
useLayoutEffect(() => {
return () => {
// Your code here.
}
}, [])
这相当于ComponentWillUnMount。
99%的时间您希望使用useEffect,但是如果您希望在卸载DOM之前执行任何操作,那么您可以使用我提供的代码。
您可以使用useRef并存储要在闭包(例如render useEffect return callback method)中使用的道具
function Home(props) {
const val = React.useRef();
React.useEffect(
() => {
val.current = props;
},
[props]
);
React.useEffect(() => {
return () => {
console.log(props, val.current);
};
}, []);
return <div>Home</div>;
}
演示
但是,更好的方法是将第二个参数传递给useffect
,以便在所需道具发生任何更改时进行清理和初始化
React.useEffect(() => {
return () => {
console.log(props.current);
};
}, [props.current]);
我试图创建一个简单的组件,从Apollo GraphQL服务器(查询)返回我的所有组织。我想从一个上下文状态呈现所有这些组织,在这个上下文状态下,在组件挂载(由useEffect挂钩处理)之后,可以使用分派方法放置这些组织。 如果状态结果(organizations数组)为空,useEffect钩子应该调用函数getOrganizations,然后调用自定义钩子useGetOrganization
问题内容: 我正在学习有关如何使用钩子注册事件的Udemy课程,讲师给出了以下代码: 现在效果很好,但我不认为这是正确的方法。原因是,如果我理解正确,则每次重新渲染时,事件都会每次都在注册和注销,并且我根本认为这样做不是正确的方法。 所以我对下面的钩子做了一些修改 通过使用一个空数组作为第二个参数,使组件只运行一次效果,即模仿。当我尝试结果时,奇怪的是,在我键入的每个键上都没有附加,而是被覆盖了。
我想在中调用几个异步函数,但我不确定如何包含关键字以等待它们的结果 这给了我 意外的保留字“await” 如何在中异步函数?
问题内容: 根据文档: 更新发生后立即调用。初始渲染不调用此方法。 我们可以使用新的钩子来模拟,但似乎在每次渲染后都被运行,即使是第一次也是如此。如何使它不在初始渲染上运行? 如您在下面的示例中看到的那样,它是在初始渲染期间打印的,但在初始渲染期间没有打印的。 问题答案: 我们可以使用该钩子来存储我们喜欢的任何可变值,因此我们可以使用它来跟踪函数是否是第一次运行。 如果我们希望效果在与该效果相同的
有人能解释一下我做错了什么吗?我有一个react功能组件,在其中我使用useEffect钩子从服务器获取一些数据,并将这些数据放入状态值。在获取数据之后,在同一个useHook中,我需要使用该状态值,但由于某些原因,该值是明确的。看看我的示例,console有一个空字符串,但在浏览器上我可以看到该值。 链接到codesandbox。
我在useeffect钩子上得到以下错误。 React Hook use效应有一个缺失的依赖项:当前页面。要么包含它,要么删除依赖array.eslintreact-钩子/穷举-deps 你知道我为什么会得到这个吗? }