简体   繁体   中英

React native with connect helper from redux doesn't re-render when state change?

I used reactJS and i know that a component that is wrapped with connect helper that listens to specific reducer when its reducer's state changes it causes the component to re-render .

I don't know why same procedure doesn't work for react-native , i tested my action creators as well as reducers and checked hundred percent that they return new state , And when i checked componentWillRecieveProps i found that the new state is returned correctly and the component doesn't re-render.


Reducer

const INITIAL = {
  isSigned: null
}

export default (state = INITIAL, action) => {
  switch(action.type){
    case SIGNED_IN : return {...state, isSigned: true};
    case LOGGED_OUT: return {...state, isSigned: false};
    default: return state;
  }
}

Component

import React, { Component } from 'react';
import { ActivityIndicator } from 'react-native';
import { connect } from 'react-redux';
import * as actions from '../../actions';


class Loading extends Component {
  constructor(props){
    super(props);

  }

  componentDidMount(){

    this.props.checkSigned();

     switch(this.props.isSigned){
       case null  : return;
       case false : this.props.navigation.navigate('Auth');
       case true  : this.props.navigation.navigate('App')
     }
  }

  render(){
    return (
        <ActivityIndicator size="large" color="black" />
    )
  }
}

const mapStateToProps = ({signed}) => {
  const {isSigned} = signed;
  return {
    isSigned
  }
}

export default connect(mapStateToProps, actions)(Loading);

Actions

export const SIGNED_IN = 'SIGNED_IN';
export const LOGGED_OUT = 'LOGGED_OUT';

//Action Creators

export const checkSigned = () => async dispatch => {
    let token = await AsyncStorage.getItem('fb_token');
     if(token){
       dispatch({type: SIGNED_IN})
     }
    dispatch({type: LOGGED_OUT})
  }

You need to use bindActionCreators to dispatch your actions as props

import { bindActionCreators } from 'redux';


const mapDispatchToProps = dispatch => bindActionCreators(actions, dispatch);
const mapStateToProps = state => {
  return {
    isSigned: state.isSigned
  }
}

export default connect(mapStateToProps, actions)(Loading);

// In actions, you need to fix action code

export const checkSigned = () => async dispatch => {
let token = await AsyncStorage.getItem('fb_token');
 if(token){
   dispatch({type: SIGNED_IN});
 } else {
    dispatch({type: LOGGED_OUT});
 }
}

I think the problem is that you're running your state change logic in componentDidMount . componentDidMount doesn't run when your component re-renders, but componentDidUpdate does. Put your logic there.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM