【问题标题】:React-Redux: Uncaught TypeError: Cannot read property 'name' of undefinedReact-Redux:未捕获的类型错误:无法读取未定义的属性“名称”
【发布时间】:2019-03-25 21:33:59
【问题描述】:

我是 Redux 世界的新手,我正在尝试将它与 React 联系起来。 我用下一种方式构建了我的应用程序:

index.js:

const userReducer = (state={
  name: "max"
}, action) => {

  switch(action.type){
    case "SET_NAME":
      state = {
        ...state,
        name: action.payload
      };
    break;
  return state;
};

const myLogger= (store) =>(next)=>(action)=>{
  console.log("logged action: ",action);
  next(action);
};
const store = createStore(combineReducers({user: userReducer}),{}, applyMiddleware(myLogger,logger));

store.subscribe(()=>{
  console.log("Store upadated", store.getState());
});

ReactDOM.render(

   <BrowserRouter>
    <Provider store={store}>
    <App/>
    </Provider>
  </BrowserRouter>,

    window.document.getElementById('container')); 

app.js:

class App extends React.Component{

      render(){
        return(

        <div>
         <SearchBar
           username = {this.props.user.name}/>
        </div>
       )
      }  
    }

    const mapStateToProps = (state) => {
      return{
        user: state.user,
        math: state.math
      };
    };

    const mapDispatchToProps = (dispatch) => {
      return{
        setName: (name) =>{
            dispatch({
                type: "SET_NAME",
                payload: name
            });
        }
      };
    };

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

searchBar.js:

export default class SearchBar extends React.Component{

    render(){
        return(
            <div>
                Name: {this.props.username}
            </div>
        )
    }
}

当我试图将来自userReducername 变量传递给SearchBar 组件时,它似乎无法识别。

我不知道为什么?我是否可能通过尝试使用 Provider 来提供存储来构建我的 index.js 错误?还是我的连接功能有问题?

错误:

Uncaught TypeError: Cannot read property 'name' of undefined
    at component (app.js:141)
    at mountIndeterminateComponent (react-dom.development.js:8574)
    at beginWork (react-dom.development.js:8978)
    at performUnitOfWork (react-dom.development.js:11814)
    at workLoop (react-dom.development.js:11843)
    at HTMLUnknownElement.callCallback (react-dom.development.js:100)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:138)
    at invokeGuardedCallback (react-dom.development.js:187)
    at replayUnitOfWork (react-dom.development.js:11318)
    at renderRoot (react-dom.development.js:11885)

【问题讨论】:

  • 您最初的state 是什么?
  • @AlexandrZavalii state={ name: "max", age: 27 }
  • 抱歉错过了。您的代码在您发送操作后是否会抛出错误?
  • @AlexandrZavalii 是的,它无法识别变量名。我认为这可能是我在应用程序中的结构或只是连接功能
  • 您正在将state.user 映射到this.props.user,这在您所在的州不存在。因此,当您尝试获取this.props.user.name 时,this.props.user 为空/未定义,因此它没有name 属性

标签: reactjs redux react-redux


【解决方案1】:

我认为您的代码应该可以工作,或者您的导入错误,我看到的唯一缺少的是括号:

switch(action.type) {
  case "SET_NAME":
    state = {
      ...state,
      name: action.payload
    };
    break;
  }
  return state;
}

而且我认为您的 Provider 也应该包装路由器。 但目前,这不应该是阻塞的。

你也可以使用redux dev tools(浏览器扩展)看看问题出在哪里:

要使用它,请将此行添加到 index.js:

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(combineReducers({user: userReducer}), composeEnhancers(applyMiddleware(myLogger)));

【讨论】:

  • 括号在那里,我只是复制错了。 :/ 我会看看我的导入
  • 作为复制/过去,您的代码对我有用,名称显示良好,如果我发送一个新名称,新名称也会显示
  • 你能复制/粘贴你的导入吗?我只是似乎找不到它。
  • index.js : 从 'react' 导入 React;从 'react-dom' 导入 ReactDOM;从'react-redux'导入{Provider};导入 { createStore, combineReducers, applyMiddleware } from 'redux';从 your_path_to_app.js 导入应用程序; app.js:从“反应”导入反应;从'react-redux'导入{connect};从 your_path_to_searchBar.js 导入 SearchBar; searchBar : 从 'react' 导入 React;
  • 我也确信我的代码应该可以工作,但不知道发生了什么
【解决方案2】:

在 redux 中...您永远不会更改状态的原始副本...您需要在执行每个操作时返回一个新副本。

而且您还需要在执行任何操作之前返回一个初始值...认为您的 switch default case ... 用于应用加载时的 redux 存储初始化

const userReducer = (
      state = {
        name: 'max',
      },
      action,
    ) => {
      switch (action.type) {
        case 'SET_NAME':
          return {
            ...state,
            name: action.payload,
          };

        default:
          return state;
      }
    };

【讨论】:

  • 但它不是像 &lt;SearchBar username={this.props.user.name}/&gt;} 在 searchBar 组件中作为 props.username 发送的变量 name 吗?而不是user.props.name
  • 是的,当我像this.props.user.name 一样访问它时,我的名字variableundefined,就像它在user.props 中从未出现过一样。如果我尝试你的方式,它就行不通。我相信我必须尝试在 searchBar 组件中将其显示为{this.props.username}
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多