面临TypeError:在React中使用Redux时无法读取未定义的属性'counter'

时间:2019-10-04 07:03:53

标签: javascript reactjs redux react-redux

我是Redux的新手,正在学习如何在React中正确使用它。但是我遇到的问题是“ TypeError:无法读取未定义的属性'counter'”。这是我正在使用的代码: 我是Redux的新手,正在学习如何在React中正确使用它。但是我遇到的问题是“ TypeError:无法读取未定义的属性'counter'”。这是我正在使用的代码:

reducer.js
    >     
    >         const initialState = {
    >           counter: 0
    >         };
    >         
    >         const reducer = (state = initialState, action) => {
    >           if (action.type === "INCREMENT") {
    >             counter: state.counter + 1;
    >           }
    >         };
    >         
    >         export default reducer;

Counter.js
    >     
    >         import React, { Component } from "react";
    >         import { connect } from "react-redux";
    >         
    >         import CounterControl from "../../components/CounterControl/CounterControl";
    >         import CounterOutput from "../../components/CounterOutput/CounterOutput";
    >         
    >         class Counter extends Component {
    >           counterChangedHandler = (action, value) => {
    >             switch (action) {
    >               case "inc":
    >                 this.setState(prevState => {
    >                   return { counter: prevState.counter + 1 };
    >                 });
    >                 break;
    >               case "dec":
    >                 this.setState(prevState => {
    >                   return { counter: prevState.counter - 1 };
    >                 });
    >                 break;
    >               case "add":
    >                 this.setState(prevState => {
    >                   return { counter: prevState.counter + value };
    >                 });
    >                 break;
    >               case "sub":
    >                 this.setState(prevState => {
    >                   return { counter: prevState.counter - value };
    >                 });
    >                 break;
    >             }
    >           };
    >         
    >           render() {
    >             return (
    >               <div>
    >                 <CounterOutput value={this.props.ctr} />
    >                 <CounterControl
    >                   label="Increment"
    >                   clicked={() => this.props.onIncrement}
    >                 />
    >                 <CounterControl
    >                   label="Decrement"
    >                   clicked={() => this.counterChangedHandler("dec")}
    >                 />
    >                 <CounterControl
    >                   label="Add 5"
    >                   clicked={() => this.counterChangedHandler("add", 5)}
    >                 />
    >                 <CounterControl
    >                   label="Subtract 5"
    >                   clicked={() => this.counterChangedHandler("sub", 5)}
    >                 />
    >               </div>
    >             );
    >           }
    >         }
    >         
    >         const mapStateToProps = state => {  //here it shows an error
    >           return { ctr: state.counter };
    >         };
    >         
    >         const mapDispatchToProps = dispatch => 
    >           return {
    >             onIncrement: () => dispatch({ type: "INCREMENT" })
    >           };
    >         };
    >         
    >         export default connect(
    >           mapStateToProps,
    >           mapDispatchToProps
    >         )(Counter);

index.js
    >     
    >         import React from "react";
    >         import ReactDOM from "react-dom";
    >         import "./index.css";
    >         import App from "./App";
    >         import registerServiceWorker from "./registerServiceWorker";
    >         import { createStore } from "redux";
    >         import reducer from "./store/reducer";
    >         import { Provider } from "react-redux";
    >         
    >         const store = createStore(reducer);
    >         ReactDOM.render(
    >           <Provider store={store}>
    >             <App />
    >           </Provider>,
    >           document.getElementById("root")
    >         );
    >         registerServiceWorker();

1 个答案:

答案 0 :(得分:3)

我在您的化简器定义中看到一个可能的问题(可能的语法错误),请尝试通过以下方式进行更改:

const reducer = (state = initialState, action) => {
    if (action.type === "INCREMENT") {
        return {
            ...state,
            counter: state.counter + 1
        };        
    }
    return state;
};