React Native

#react-native #redux #react-redux #state-management

Вопрос:

Я пытался использовать Redux в своем проекте React Native для создания приложения-счетчика. Но потом я сталкиваюсь с этой ошибкой. Там написано что-то вроде undefined is not an object (evaluating 'state.counter')

Пожалуйста, взгляните на мой код.

Counter.js

 class Counter extends Component {
  state = {counter: 0};

  render() {
    return (
      <View style={styles.container}>
        <View style={styles.counterPart}>
          <TouchableOpacity onPress={() => this.props.increaseCounter()}>
            <Text style={styles.text}>Increase</Text>
          </TouchableOpacity>
          <Text style={styles.text}>{this.props.counter}</Text>
          <TouchableOpacity onPress={() => this.props.decreaseCounter()}>
            <Text style={styles.text}>Decrease</Text>
          </TouchableOpacity>
        </View>
      </View>
    );
  }
}

function mapStateToProps(state) {
  return {
    counter: state.counter,
  };
}

function mapDispatchToProps(dispatch) {
  return {
    increaseCounter: () => dispatch({type: 'INCREASE_COUNTER'}),
    decreaseCounter: () => dispatch({type: 'DECREASE_COUNTER'}),
  };
}

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

Ошибка, по — видимому, вызвана вышеприведенной mapStateToProps(state) функцией.

App.js

 const reducer = (state = initialState, action) => {
  switch (action.type) {
    case 'INCREASE_COUNTER':
      console.log('Enter INCREASE_COUNTER reducer');
      return {counter: state.counter   1};
    case 'DECREASE_COUNTER':
      console.log('Enter DECREASE_COUNTER reducer');
      return {counter: state.counter - 1};
  }
  return state;
};

const store = createStore(reducer);

const initialState = {
  counter: 0,
};

class App extends Component {
  render() {
    return (
      <Provider store={store}>
        <Counter />
      </Provider>
    );
  }
}
 

Я был бы признателен, если бы вы могли предложить решение или предложение по этому вопросу. Спасибо.

Ответ №1:

Я думаю, проблема в том, что вы не можете получить доступ к initialState in reducer, попробуйте переместить объявление сверху reducer вот так.

 const initialState = {
  counter: 0,
};

const reducer = (state = initialState, action) => {
  switch (action.type) {
    ...
  }
}
 

Комментарии:

1. В любом случае, что, если я напишу свой собственный код react в функциональном компоненте? Знаете ли вы, как реализовать redux в функциональном компоненте?

2. Да, нет необходимости оборачивать ваш компонент connect , просто используйте useSelector и useDispatch крючки.

3. Взгляните на этого дока.