开发者问题收集

当我尝试运行时,出现“TypeError:无法获取未定义或空引用的属性‘age’”

2020-05-21
75

我的应用应该分别在单击“添加”按钮或“减法”按钮时增加年龄(初始化为 20)或减少年龄。

我不明白为什么我一直收到此错误。我检查了 Reducer.js 以确保相应地使用“age”属性初始化状态,因此我完全不知道是什么原因导致了此错误。我仔细检查了所有正确的依赖项,并确保所有语法正确。

我认为可能导致此问题的另一件事是,我没有在 Reducer.js 中对代码行 const newState = {state 使用扩展运算符。由于某种原因,vscode 不允许我使用扩展运算符。每次我这样做并运行我的应用程序时,屏幕上都不会出现任何内容。使用扩展运算符是否需要安装依赖项?

以下是我的代码:

// index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';

import reducer from './reducer';
import { Provider } from 'react-redux';
import { createStore } from 'redux';

const store = createStore(reducer);

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

// App.js

import React from 'react';
import './App.css';
import { connect } from 'react-redux';

class App extends React.Component {
  render() {
    return (
      <div className="App">
        <div>Age: <span>{this.props.age}</span></div>
        <button onClick={this.props.onAgeUp}>Add</button>
        <button onClick={this.props.onAgeDown}>Sub</button>
      </div>
    );
  }
}

const mapStateToProps = (state) => {
  return { age: state.age };
};

const mapDispatchToProps = (dispatch) => {
  return {
    onAgeUp: () => dispatch({ type: 'ADD' }),
    onAgeDown: () => dispatch({ type: 'SUBTRACT' })

  };
};

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

// Reducer.js

import { ADD, SUBTRACT } from './actionTypes';

const initialState = {
  age: 20
};

const reducer = (state=initialState, action) => {
    const newState = {state};

    switch(action.type) {
        case ADD:
            newState.age+=1;
            break;
        case SUBTRACT:
            newState.age-=1;
            break;
        default:
            return state;
    }

};

export default reducer;
3个回答

快速修复,您可以使用 Object.assign 代替扩展运算符:

const newState = Object.assign({}, state);

要使用扩展运算符,您必须检查以下几件事:

首先确保 @babel/plugin-proposal-object-rest-spread 依赖项在 package.json 中,然后将其添加到 babel 配置文件的插件中:

{
  "plugins": ["@babel/plugin-proposal-object-rest-spread"]
}

有关更多信息,请访问 babel rest spread

StackedQ
2020-05-21

我发现这里有三个问题:

  • 您将 newState 声明为 {state}。这会在对象内创建对象。
  • 由于您使用 const 声明 newState,因此无法更改。但您试图在这两种情况下更改 newState。
  • 您没有向状态返回任何内容。redux 的主要思想是通过返回新状态来更新状态。
Usman Khalil
2020-05-21

newState 的定义方式如下:

{
  state: {
    age: 20
  }
}

这就是 age 未定义的原因,它不是直接子属性。

例如:

const letters = { alpha: 'a' }

const spreadLetters = { letters }

spreadLetters 将是一个新对象,具有一个属性“letters”。 此属性的值将是原始 letters 变量的精确副本。

{
  letters: {
    alpha: a
  }
}
daveyfaherty
2020-05-21