【问题标题】:react redux: still getting empty object for this.props when using Connect for mapStateToProps and mapDispatchToProps反应 redux:当使用 Connect for mapStateToProps 和 mapDispatchToProps 时,this.props 仍然得到空对象
【发布时间】:2018-02-27 12:07:13
【问题描述】:

我正在尝试在 React Redux 上遵循本教程 (https://medium.com/@stowball/a-dummys-guide-to-redux-and-thunk-in-react-d8904a7005d3),但是当我打印出 this.props 时得到一个空对象。似乎 mapStateToProps 实际上并没有设置 this.props 因为 react redux 的 connect 没有被调用,但我不知道为什么

这应该是状态(就像在教程中一样),我所做的只是将组件的名称 ItemList 更改为 Home

这是我得到的(没有任何东西映射到状态):

actions/items.js

export function itemsHasErrored(bool) {
    return {
        type: 'ITEMS_HAS_ERRORED',
        hasErrored: bool
    };
}

export function itemsIsLoading(bool) {
    return {
        type: 'ITEMS_IS_LOADING',
        isLoading: bool
    };
}

export function itemsFetchDataSuccess(items) {
    return {
        type: 'ITEMS_FETCH_DATA_SUCCESS',
        items
    };
}

export function itemsFetchData(url) {
    return (dispatch) => {
        dispatch(itemsIsLoading(true));

        fetch(url)
            .then((response) => {
                if (!response.ok) {
                    throw Error(response.statusText);
                }

                dispatch(itemsIsLoading(false));

                return response;
            })
            .then((response) => response.json())
            .then((items) => dispatch(itemsFetchDataSuccess(items)))
            .catch(() => dispatch(itemsHasErrored(true)));
    };
}

组件/Home.js

export class Home extends Component {
  componentDidMount() {
    console.log(this.props)
  }

 render() {

    if (this.props.hasErrored) {
      return <p>Sorry! There was an error loading the items</p>;
    }

    if (this.props.isLoading) {
        return <p>Loading…</p>;
    }

  return (
      <ul>
          {this.props.items.map((item) => (
              <li key={item.id}>
                  {item.label}
              </li>
          ))}
      </ul>
  );    

  }
}


 const mapStateToProps = (state) => {
  return {
      items: state.items,
      hasErrored: state.itemsHasErrored,
      isLoading: state.itemsIsLoading
  };
};

const mapDispatchToProps = (dispatch) => {
  return {
      fetchData: (url) => dispatch(itemsFetchData(url))
  };
};

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

reducers/index.js

export function itemsHasErrored(state = false, action) {
    switch (action.type) {
        case 'ITEMS_HAS_ERRORED':
            return action.hasErrored;

        default:
            return state;
    }
}

export function itemsIsLoading(state = false, action) {
    switch (action.type) {
        case 'ITEMS_IS_LOADING':
            return action.isLoading;

        default:
            return state;
    }
}

export function items(state = [], action) {
    switch (action.type) {
        case 'ITEMS_FETCH_DATA_SUCCESS':
            return action.items;

        default:
            return state;
    }
}

存储/configureStore.js

import { applyMiddleware, createStore } from 'redux'
import thunk from 'redux-thunk'
import rootReducer from '../reducers'

export default function configureStore(initialState) {
    return createStore(
        rootReducer,
        initialState,
        applyMiddleware(thunk)
    )
} 

App.js

import React, { Component } from 'react'
import { Provider } from 'react-redux'
import configureStore from './store/configureStore'

import { Home }                     from './components/Home'
const store = configureStore()

export default class App extends Component {

    render () {
      return (
        <Provider store={store}>
          <Home />
        </Provider>
      )
    }

  }

index.js(我正在使用 create-react-app 样板)

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

ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();

【问题讨论】:

  • 您是否检查了商店内容以查看商品是否存在?我建议你安装 redux 开发工具,这使得查看这个非常容易。
  • 另外,您是否随时致电this.props.fetchData?我在你的代码中没有看到。
  • 在你的截图中,你看到的是Provider的道具; Home 是 store 状态将 props 映射到的组件。
  • 当我在 componentDidMount() 中执行 this.props.fetchData() 时,我得到 fetchData 不是函数,并且没有任何内容映射到 Home 组件

标签: javascript reactjs redux react-redux create-react-app


【解决方案1】:

问题是您要导出两个组件...未连接(通过命名导出Homeexport class Home...)和连接(通过export default)。然后,您正在导入和渲染未连接的组件:

import { Home } from './components/Home'

既然你想使用 connected 组件,你应该像这样导入 default 导出:

import Home from './components/Home'

您可能只想导出已连接的组件,除非您有某些理由使用未连接的组件。

【讨论】:

  • 天哪,你是救生员,非常感谢!!
  • 我的荣幸,@user3226932!
  • 我确实花了 3 小时来了解为什么我的应用程序无法正常工作以及两个小括号的问题。这是我的赞成票!
  • 即使在今天我也犯了同样的错误。这个答案对我有帮助。
  • 非常感谢。这是一个简单的问题,但如果没有你的帮助,我肯定会挠头几个小时:)
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 2019-01-27
  • 2018-06-15
  • 2018-01-18
  • 1970-01-01
  • 2017-03-10
  • 2017-01-21
  • 1970-01-01
相关资源
最近更新 更多