2015-09-03 2 views
5

В моем компоненте я следующее:Как отказаться от подписки в компоненте реакции при использовании сокращения?

componentWillMount: function() { 
    this.unsubscribe = store.subscribe(function() { 
    this.setState({message: store.getState().authentication.message}); 
    }.bind(this)); 
}, 

componentWillUnmount: function() { 
    this.unsubscribe(); 
}, 

Не вызывая отписки вызывает следующее сообщение об ошибке:

Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op.

То, что я хотел бы знать, я должен быть назначая unsubscribe к this или есть лучшее место для его назначения?

+0

Вы должны попробовать в componentDidMount() вместо componentWillMount(). – legolandbridge

+0

@legolandbridge, который не имеет никакого значения, поскольку мне все еще нужно «отписаться». – Clarkie

+0

Вы изучали использование 'response-redux'' connect' и 'Provider'? –

ответ

4

Как уже упоминалось, Salehen Rahman выше в комментариях, я в конечном итоге использовал react-redux.

После их документации, которую я создал две функции, одна для сопоставления «глобальное состояния» к реквизиту в компоненте:

function mapStateToProps(state) { 
    return { 
    users: state.users.items 
    }; 
} 

и один для отображения посланных действий на функцию, переданной в компонент в качестве реквизита:

function mapDispatchToProps(dispatch) { 
    return { 
    lockUser: (id) => dispatch(actions.lockUser(id)), 
    unlockUser: (id) => dispatch(actions.unlockUser(id)), 
    updateUser: (id, user) => dispatch(actions.updateUser(id, user)), 
    addUser: (user) => dispatch(actions.addUser(user)) 
    }; 
} 

Это тогда все становится стягиваются с помощью connect метод:

export default connect(mapStateToProps, mapDispatchToProps)(UsersContainer); 

У меня такое ощущение, что все это под капотом присоединяет метод unsubscribe к компоненту, но он существенно упрощает ситуацию.

+1

Под капотом действительно прикрепляется 'unsubscribe' к' this', но не к вашему компоненту. React Redux 'connect()' генерирует промежуточный компонент: поэтому вы получаете данные как 'this.props', а не как' this.state'. Вероятно, вы должны использовать React Redux в большинстве случаев, вместо того, чтобы вручную запускать его, потому что он имеет определенную оптимизацию производительности. –

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