当前位置: 首页 > 面试题库 >

具有React useEffect钩子的componentWillUnmount

狄溪叠
2023-03-14
问题内容

如何能在useEffect钩(或任何其他挂钩的这个问题)可以被用来复制componentWillUnmount

在传统的类组件中,我将执行以下操作:

class Effect extends React.PureComponent {
    componentDidMount() { console.log("MOUNT", this.props); }
    componentWillUnmount() { console.log("UNMOUNT", this.props); }
    render() { return null; }
}

随着useEffect钩:

function Effect(props) {
  React.useEffect(() => {
    console.log("MOUNT", props);

    return () => console.log("UNMOUNT", props)
  }, []);

  return null;
}

(完整示例:https :
//codesandbox.io/s/2oo7zqzx1n)

这是行不通的,因为返回的“清理”功能会useEffect捕获安装过程中的道具,而不会在卸载过程中捕获道具的状态。

我怎么能获得最新版本的道具的useEffect清理 ,而不 在每一个道具的变化运行的函数体(或清理)?
\

该反应文档状态:

如果要运行效果并仅将其清除一次(在挂载和卸载时),则可以传递一个空数组([])作为第二个参数。这告诉React您的效果不依赖于props或state的任何值,因此它不需要重新运行。

但是在这种情况下,我依赖道具…但是仅用于清理部分…


问题答案:

您可以使用useRef并存储要在闭包内使用的道具,例如render useEffect返回回调方法

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>;
}

演示

但是,更好的方法是将第二个参数传递给,useEffect以便在所需道具的任何更改时进行清理和初始化

React.useEffect(() => {
  return () => {
    console.log(props.current);
  };
}, [props.current]);


 类似资料:
  • 我想使用wordpress在我的网站上添加变体 我尝试了很多插件,但它们不能满足我的要求。 要求: 我想根据给定的变化变化价格: 任何人都可以引用插件或函数?

  • Update:这里是带有共享状态示例的CodeSandBox.io链接,它使用类组件,我希望在不复制状态或使用虚假状态更新的情况下将这些组件转换为钩子。

  • 钩子列表 全局钩子 名称 描述 init 在生成文档站点前触发. nav 在解析导航 nav.md 后和解析文档前触发 book:before 加载 book 页面之前调用 page:before 加载 page 文件之前调用 page 加载 page 文件之后调用 book 加载 book 页面之后调用 finish 在生成文档站点完成后触发. 模板钩子 名称 描述 参数 tpl:header

  • 后端 hookList 目前 hooksList 只有下面列出的部分,如果您有其他的需求,可提建议到 github 或者 qq 群 /** * 钩子配置 */ var hooks = { /** * 第三方sso登录钩子,暂只支持设置一个 * @param ctx * @return 必需返回一个 promise 对象,resolve({username:

  • CodeIgniter 的钩子功能使得您可以在不修改系统核心文件的基础上来改变或增加系统的核心运行功能。 当 CodeIgniter 运行后,它会产生出一个特殊的进程,这个进程在 项目流程 页面中有说明。 当然,您可以自定义一些动作来替代程序运行过程中的某些阶段。例如,您可以在控制器刚刚载入前或刚刚载入后来运行特定的脚本,或者在其他时刻来触发您的脚本。 启用钩子 钩子功能可以在全局范围内打开或关闭

  • 和其它版本控制系统一样,Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。 你可以随心所欲地运用这些钩子。 安装一个钩子 钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks 。 当你用 git init 初始

  • Storm 提供了一种hook机制,你可以用来实现在Storm各种事件上运行自定义的代码。通过继承 BaseTaskHook 类创建一个hook,并且可以覆盖你想要跟踪的事件的一些方法。 一共有两种方式注册你的hook: 在 spout 的 open 方法或者 bolt 的 prepare 方法中使用 TopologyContext 方法. 使用 Storm 配置表中的 "topology.aut

  • Hook(也称为生命周期事件)是执行 sequelize 调用之前和之后调用的函数. 例如,如果要在保存模型之前始终设置值,可以添加一个 beforeUpdate hook. 注意: 你不能将 hook 与实例一起使用。 hook 用于模型. 获取完整列表, 请查看 Hooks file. 操作清单 (1) beforeBulkCreate(instances, options) befo