removeEventListener已经被废弃,我无法成功地重构它。

17

Linking.removeEventListener('url', onReceiveURL);

removeEventListener已被弃用。

我的IDE建议使用:

EventEmitter.removeListener('url', ...):该方法已被弃用。请改为使用EventEmitter.addListener返回的订阅上调用remove()

  // Custom function to subscribe to incoming links
  subscribe(listener: (deeplink: string) => void) {
    // First, you may want to do the default deep link handling
    const onReceiveURL = ({url}: {url: string}) => listener(url);
    // Listen to incoming links from deep linking
    Linking.addEventListener('url', onReceiveURL);
    const handleDynamicLink = (
      dynamicLink: FirebaseDynamicLinksTypes.DynamicLink,
    ) => {
      listener(dynamicLink.url);
    };
    const unsubscribeToDynamicLinks = dynamicLinks().onLink(handleDynamicLink);
    return () => {
      unsubscribeToDynamicLinks();
      Linking.removeEventListener('url', onReceiveURL);
    };

我尝试了很多方法,但似乎没有什么作用。

没有找到任何具体的信息。

有什么帮助来弄清楚吗?

编辑 -> 我会进一步调查,但目前它正常运行:

 const unsubscribeToDynamicLinks : any = ...

then in return : 
return () => {
unsubscribeToDynamicLinks().remove('url', onReceiveURL);};

 

我对特定的链接不确定,但语法通常是:const subscription = Linking.addEventListener('url', onReceiveURL); 然后稍后 subscription.remove() - Abe
我已经尝试了几乎所有的方法,如在最终返回中使用subscribe.remove(),但调试器告诉我subscribe不存在... 我刚刚成功做到了这一点,但我不知道它是否有效。const unsubscribeToDynamicLinks: any = dynamicLinks().onLink(handleDynamicLink); return () => { unsubscribeToDynamicLinks().remove('url', onReceiveURL); - Harkayn
到目前为止听起来不错,谢谢Abe =) - Harkayn
3个回答

35

对于新的 API,它是这样工作的:


useEffect (() => {
  const subscription = Linking.addEventListener('url', onReceiveURL);
  return () => subscription.remove();
}, [])


如何在类组件中移除监听器? - CrackerKSR
嗨 @CrackerKSR,你可以查看这个问题:https://dev59.com/R1kT5IYBdhLWcg3wefQn。 - Anita
1
实际上,所有这些答案都已经过时了。removeListener已被弃用。我在构造函数中声明变量subscribe,并在DidMount()中为其分配监听器,在willUnmount()中使用相同的变量来调用remove()。但是它是否真正删除了监听器,我不知道。顺便说一句,谢谢回复。 - CrackerKSR
componentDidMount() { Linking.addEventListener('url', this.handleUrl); } componentWillUnmount() { Linking.removeEventListener('url', this.handleUrl); } handleUrl = ({ url }) => { // 处理URL }; - Anita
1
Emitter.removeEventListener在新版本中已被弃用。Linking.removeEventListene不起作用。我已经尝试过了。 - CrackerKSR

8

对于类组件,你可以使用以下代码:

class MyClass extends Component {
  constructor(props){
    super(props)
    this.changeEventListener = null
  }
  componentDidMount(){
    // or you can use constructor for this
    this.changeEventListener = AppState.addEventListener('change', () => {
      // your listener function
    })
  }

  componentWillUnmount() {
    this.changeEventListener.remove()
  }
}



3

原始代码

AppState.addEventListener('change', handleAppStateChange);

return () => {
  AppState.removeEventListener('change', handleAppStateChange);
};

由于removeEventListener已被弃用,因此我用以下代码替换了上面的行:

const subscription = AppState.addEventListener(
  'change',
  handleAppStateChange
);
return () => {
  subscription.remove();
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接