2015-09-03 13 views
5

W moim składnika Mam następujący:Jak należy zrezygnować z subskrypcji w komponencie reagowania podczas korzystania z redux?

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

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

niestawienie wypisz powoduje następujący błąd:

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.

Co chciałbym wiedzieć, to powinienem być przypisaniem unsubscribe do this czy istnieje lepsze miejsce do przydzielenia?

+0

Powinieneś spróbować w componentDidMount() zamiast componentWillMount(). – legolandbridge

+0

@legolandbridge, które nie ma znaczenia, ponieważ nadal muszę "wypisać się". – Clarkie

+0

Czy sprawdziłeś, używając 'react-redux''' connect' i 'Provider'? –

Odpowiedz

4

Jak wspomniano powyżej w komentarzach Salehen Rahman powyżej, w końcu użyłem react-redux.

Po ich dokumentacji Stworzyłem dwie funkcje, jeden do mapowania „państwo globalny” do rekwizytów w ramach komponentu:

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

i jeden do mapowania wysyłane czynności do funkcji przekazywane do komponentu jako rekwizyty:

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

To wtedy wszystko staje się ciągną razem stosując metodę connect:

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

Mam wrażenie, że wszystko to pod maską jest dołączenie metody unsubscribe do komponentu, ale upraszcza to wszystko.

+1

Pod maską rzeczywiście dołącza "wypisanie" do "tego" - ale nie do twojego elementu. React Redux 'connect()' generuje komponent pośredni: dlatego otrzymujesz dane jako 'this.props', a nie jako' this.state'. Powinieneś raczej używać React Redux w większości przypadków, zamiast ręcznie go zwijać, ponieważ ma pewne optymalizacje wydajności. –

Powiązane problemy