#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. Взгляните на этого дока.