2016-12-25 2 views
2

У меня есть список предметов. Каждый предмет может отображаться в MyComponent, передавая его itemId. Для прослушивания на изменениях выбранного пункта, я передаю myService:ответить native: как отменить регистрацию слушателя/службы?

<MyComponent myService={myService} id={itemId}/> 

компонент извлекает сведения об элементе и начинает слушать службу:

componentDidMount() { 
    this.fetchItemDetails(this.props.id); // fetch the item details 

    this.props.myService.listensTo('eventId',() => { 
     // something changed, fetch again ... 
    }); 
} 

componentWillUnmount() { 
    // reset/unregister the listener for this instance 
} 

Проблема: слушатель зарегистрирован каждый раз я монтирую MyComponent, что становится проблемой с несколькими экземплярами.

Я хочу прослушать только активный, смонтированный компонент и unlisten, как только он будет размонтирован.

Любые идеи?

Заранее благодарен!

ответ

2

Вы должны сохранить ссылку на функцию, которую используете в качестве обратного вызова. Обычно, что прослушиватели событий поддерживают внутреннюю структуру всех функций обратного вызова, которые необходимо вызывать, когда происходит событие, и поэтому, когда вы хотите прекратить прослушивание, вы должны сообщить диспетчеру событий, который является функцией, которая должна быть исключены из списка. Поскольку единственное, что дает вам эту информацию, - это ссылка на функцию обратного вызова. Я хотел бы сделать следующее:

constructor(){ 
    super(); 
    this.myListener = this.myListener.bind(this); // Do this only if necessary 
} 

componentDidMount() { 
    this.fetchItemDetails(this.props.id); // fetch the item details 

    this.props.myService.listensTo('eventId', myListener); 
} 

myListener(){ 
    //... 
} 

componentWillUnmount() { 
    // reset/unregister the listener for this instance 
    this.props.myService.deregister('eventId', myListener); 
} 

Важно, чтобы сохранить ссылку на функцию, поэтому важно поставить связывание в конструкторе.

+0

отлично, upvote .. Мне нужна консультация: как лучший пользователь в * реагировать на родной тег, как вы думаете, он учит его достойным ?! Кто-то говорит, что это прекрасно, кто-то другой говорит, что это ужасная идея. Поэтому я в замешательстве, я хочу сделать мобильное приложение * (как для операционных систем Android, так и для iOS) *, хорошо, можно сделать профессиональные приложения * реагировать на родной *? Или * отредактируйте родной язык * просто давайте создавать новички? Также как насчет качества приложений, которые были созданы с помощью * response native *? спасибо – Alex

+1

Ммм ... Сначала я тоже немного неохотно, но теперь я думаю, что RN неплохо справляется с большими/профессиональными приложениями. Несмотря на то, что все еще сложно выполнять некоторые задачи, такие как фоновые задания или push-уведомления, библиотека продолжает добавлять больше функциональности с каждой версией, а стабильность каждой новой версии также выше (цикл выпуска замедляется, как следствие). Это также не занимает слишком много времени, чтобы учиться, поэтому я бы сказал, что это безопасная инвестиция. – martinarroyo

Смежные вопросы