如何解决反应原生 EventEmitterListener 警告

Posted

技术标签:

【中文标题】如何解决反应原生 EventEmitterListener 警告【英文标题】:how to resolve a react native EventEmitterListener warning 【发布时间】:2016-09-16 15:08:28 【问题描述】:

我正在使用事件发射器在地图组件和工具栏之间进行通信。注意*我在我的应用程序的其他部分使用相同的代码没有问题。我得到的错误是:

警告:setState(...):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了 setState()。这是一个无操作。请检查未定义组件的代码。

我试图通过类似的帖子来解决这个问题,但它不起作用。我认为这与两个组件中的 mount && unmount 方法有关?

工具栏组件

        componentDidMount() 
    this.showLocateIconListener = AppEventEmitter.addListener('isTrip', this.isTrip.bind(this));
    this.endTripListener = AppEventEmitter.addListener('showLocateIcon', this.showLocateIcon.bind(this));
    this.endSubdivisionIcon = AppEventEmitter.addListener('showSubdivisionIcon', this.showSubdivisionIcon.bind(this));


componentWillUnMount() 
    this.showLocateIconListener.remove();
    this.endTripListener.remove();
    this.endSubdivisionIcon.remove();



 //// this is where the error is happening
showSubdivisionIcon(val) 
    if (val != 0)
        this.setState(
            items: menuSubdivision,
            subdivisionId: val
        )
    else
        this.setState(
            items: menu
        )

地图组件

  onMarkerPress(val) 
    AppEventEmitter.emit('showSubdivisionIcon', val.id);

EventEmitter.js 的控制台错误详情导致了这一点

  subscription.listener.apply(
        subscription.context,
        Array.prototype.slice.call(arguments, 1)
      );

EventEmitter.js 中的完整部分

      /**
   * Emits an event of the given type with the given data. All handlers of that
   * particular type will be notified.
   *
   * @param string eventType - Name of the event to emit
   * @param ...* Arbitrary arguments to be passed to each registered listener
   *
   * @example
   *   emitter.addListener('someEvent', function(message) 
   *     console.log(message);
   *   );
   *
   *   emitter.emit('someEvent', 'abc'); // logs 'abc'
   */
  emit(eventType: String) 
    var subscriptions = this._subscriber.getSubscriptionsForType(eventType);
    if (subscriptions) 
      var keys = Object.keys(subscriptions);
      for (var ii = 0; ii < keys.length; ii++) 
        var key = keys[ii];
        var subscription = subscriptions[key];

        // The subscription may have been removed during this event loop.
        if (subscription) 
          this._currentSubscription = subscription;
          subscription.listener.apply(
            subscription.context,
            Array.prototype.slice.call(arguments, 1)
          );
        
      
      this._currentSubscription = null;
    
  

【问题讨论】:

【参考方案1】:

唯一的问题是您的事件侦听器没有被删除,因为componentWillUnmount 方法的名称不正确。在您的代码中,mountM 是大写字母,应该是小写字母。

componentWillUnmount() 
    this.showLocateIconListener.remove();
    this.endTripListener.remove();
    this.endSubdivisionIcon.remove();

【讨论】:

以上是关于如何解决反应原生 EventEmitterListener 警告的主要内容,如果未能解决你的问题,请参考以下文章

我需要如何解决错误 ini 一个信号反应原生

如何解决“动画:不支持`useNativeDriver`,因为缺少原生动画模块。”在反应导航中?

如何解决 (Could not initialize class org.codehaus.groovy.reflection.ReflectionCache) 反应原生问题

如何更改 TextInput 上的光标位置? (反应原生)

如何折叠按在数组上的项目 - 反应原生?

我应该如何添加质量选择器来反应原生视频?