【问题标题】:Cleanup custom event from ref in react从反应中的 ref 清除自定义事件
【发布时间】:2021-12-19 07:02:27
【问题描述】:

我有一个自定义元素,它在反应中调度一个自定义事件。 由于没有办法简单的绑定事件,我需要手动创建一个eventListener并移除它。

我试过了:

export function App() {
  const textRef = useRef<DemoTextElement>(null);
  let eventRef;
  const logEvent = (e) => {
    console.log(e)
  }
  useEffect(() => {
    if(textRef.current) {
      eventRef = textRef.current;
      textRef.current.addEventListener('onCustomEvent', logEvent)
    }
    return () => {
      if(eventRef) {
          eventRef.removeEventListener('onCustomEvent', logEvent)
      }
    }
  }, [])

  return (
    <div className={styles.app}>
      <demo-text ref={textRef}/>
    </div>
  );
}

但我收到提示

从 React Hook useEffect 内部对 'eventRef' 变量的分配将在每次渲染后丢失。要随着时间的推移保留该值,请将其存储在 useRef Hook 中,并将可变值保留在 '.current' 属性中。否则,您可以直接在 useEffect 中移动此变量。

但我已经在使用 useRef 钩子了,所以我不知道如何解决这个问题...因为我无法在 useEffect 钩子中添加 useRef 钩子。

【问题讨论】:

  • 您能否澄清一下您在哪里声明counter 参考?请编辑示例
  • @RamanNikitsenka 很抱歉我复制时打错了
  • 你可以参考useCallBack hook。
  • 这将如何改变?它引发了同样的问题。
  • 似乎,您不需要使用额外的变量 eventRef。在清理函数中使用 textRef.current.removeEventListener

标签: reactjs typescript react-hooks eslint


【解决方案1】:

eventRef 变量将在每次渲染时重新声明。只需将其移动到useEffect 钩子中并进行赋值操作即可。

import React, { useEffect, useRef } from 'react';

export default function Test() {
  const textRef = useRef<HTMLDivElement>(null);
  const logEvent = (e) => {
    console.log(e);
  };
  useEffect(() => {
    const eventRef = textRef.current;
    if (eventRef) {
      eventRef.addEventListener('onCustomEvent', logEvent);
    }
    return () => {
      if (eventRef) {
        eventRef.removeEventListener('onCustomEvent', logEvent);
      }
    };
  }, []);

  return <div ref={textRef}>123</div>;
}

【讨论】:

  • 是的,我实际上看错了东西,这样可以吗?它有效吗?如果是的话,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2022-07-27
相关资源
最近更新 更多