javascript - React-redux connect() 无法传递 props

标签 javascript reactjs ecmascript-6 redux react-redux

我正在尝试学习 react-redux 架构,但我在最基本的东西上失败了。

我创建了 HomePage 类并使用 react-redux connect() 将其连接到商店的状态并进行调度。

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import {HomeButtonClickAction} from "./HomeActionReducer";
import {connect} from "react-redux";

class HomePage extends Component {

    constructor(props) {
        super(props);

        console.log('HomePage props');
        console.log(this.props);

        this.buttonClicked = this.buttonClicked.bind(this);
    }

    buttonClicked() {
        console.log('button cliked');
        this.props.buttonClick();
    }

    render() {
        console.log('Re-rendering...');

        let toggleState = this.props.toggle ? 'ON' : 'OFF';
        return (
            <div>
                <button onClick={this.buttonClicked}>{ toggleState }</button>
            </div>
        )
    }
}

HomePage.propTypes = {
    toggle: PropTypes.bool.isRequired,
    onClick: PropTypes.func.isRequired
};

const mapStateToProps = (state, ownProps) => {
    return {
        toggle: state.toggle
    }
};

const mapDispatchToProps = (dispatch, ownProps) => {
    return {
        buttonClick: () => {
            dispatch(HomeButtonClickAction());
        }
    }
};

const HomeContainer = connect(
    mapStateToProps,
    mapDispatchToProps
)(HomePage);

export default HomePage;

但这对我不起作用。 HomeContainer 不会将 props 传递给 HomePage 组件。 我在 devtools 中收到了这些警告。

enter image description here

我的 index.js 看起来像这样。

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import AppReducer from "./reducers/AppReducer";
import { createStore } from "redux";
import { Provider } from 'react-redux';

const store = createStore(AppReducer);

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

registerServiceWorker();

和 AppReducer.js

import { combineReducers } from 'redux';
import { toggle } from '../home/HomeActionReducer';

const AppReducer = combineReducers({
    toggle
});

export default AppReducer;

和 HomeActionReducer.js

const HOME_BUTTON_CLICK = 'HOME_BUTTON_CLICK';

export function toggle (state = true, action) {
    console.log('toggle launched');

    switch (action.type) {
        case HOME_BUTTON_CLICK :
            return !state;

        default:
            console.log('Toggle reducer default action');
            return state;
    }
}

export function HomeButtonClickAction() {
    console.log('action emitted');

    return {
        type: HOME_BUTTON_CLICK
    };
}

作为新手,我将非常感谢您的帮助:)

最佳答案

您正在导出 HomePage,它是展示组件。您想要导出 HomeContainer,它是通过 connect 将 props 传递给 HomePage 的容器。

所以替换这个

export default HomePage;

有了这个

export default HomeContainer;

也可以直接写

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

请注意,由于它是默认 导出,您可以根据需要命名导入,例如:

import HomePage from './HomePage' // even if it's HomeContainer that is exported

关于javascript - React-redux connect() 无法传递 props,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48335083/

相关文章:

javascript - 监听函数执行

javascript - 在nedb中添加的记录是单个记录,但是为什么VUE会多次存储相同的记录?

javascript - ES2015(或更高版本)中的命名参数

javascript - 使用 JavaScript 为类动态添加选择器

javascript - 比较两个元素在 body 中的位置

javascript - 如何转换此 JSON 日期时间?

javascript - 为什么 eval() 对导入函数不起作用?

html - 用于 radio 和标签的 React 和 css

Javascript promise 等待结果

javascript - javascript ES6 中的这个匿名 block 是什么?