如何解决反应原生EventEmitterListener警告

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

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

我试图解决这个类似的post,但它不工作。 我认为这两个组件的挂载&&卸载方法?

工具栏组件

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

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

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