【问题标题】:How to pass the dispatch into the component like prop?如何将调度传递给像道具这样的组件?
【发布时间】:2018-10-10 17:48:31
【问题描述】:

谁能告诉我如何将我们的常规dispatch Redux store 方法像道具一样直接发送到组件。请参阅下面的示例。

附: 我还看到了 Dan Abramov https://github.com/reactjs/redux/issues/916 使用 functional component 的这个例子,但没有找到答案有没有办法让它抛出 class component

import React, { Component } from 'react';
import { connect } from 'react-redux';

function addData(data) {
    type: "ADD_DATA",
    data
};

class MainComponent extends Component {
    constructor({ dispatch }, props) {
        super(props);
    }

    handleUpdate = () => {
        const hi = 'hi';
        dispatch(addData(hi)); // error, could not find the method
    }

    render() {
        const { data } = this.props;
        console.log(this.props.store);
        return (
            <div>
                <button onClick={this.handleUpdate}>Click me!</button>
                {data}
            </div> 
        )
    }
}

export default connect()(MainComponent);

【问题讨论】:

  • 你的代码应该已经有 dispatch 作为 prop。您正在尝试登录 store。 Dan 的示例适用于类组件,涵盖了您的用例。如果我正确理解您的问题
  • dispatch(addData(hi))改成this.props.dispatch(addData(hi))
  • azium 有你的答案。您正在尝试直接利用 dispatch,但它是 props 对象的属性。

标签: javascript reactjs redux react-redux


【解决方案1】:

在您的connect() 方法中,您可以传入一个函数,该函数会将调度映射到您的道具;

那就试试吧;

const mapDispatchToProps = (dispatch) => ({
    dispatch
});

export default connect({}, mapDispatchToProps)(MainComponent);

然后在您的组件中,您应该可以访问道具中的dispatch

您的组件构造函数可以是;

constructor(props) {
    super(props);
}

或者完全放弃,因为你没有在其中做任何其他事情。

【讨论】:

【解决方案2】:

您可以使用 mapDispatchToProps,并将调度添加到组件的道具中。就像这样:

class MainComponent extends Component {
    constructor(props) {
     super(props);
    }

    handleUpdate = () => {
        const hi = 'hi';
        this.props.add(hi)
    }

    render() {
        const { data } = this.props;
        return (
            <div>
                <button onClick={this.handleUpdate}>Click me!</button>
                {data}
            </div> 
        )
    }
}

const mapDispatchToProps = dispatch => {
    return {
        add : (data) => dispatch(addData(data))
    }
}

export default connect({},mapDispatchToProps)(MainComponent);

mapDispatchToPropsconnect() 接收调度参数,并将其链接到您的组件。然后,只需将其作为参数传递给connect()

您的addData() 应该返回一个普通对象,如下所示:

function addData(data) {
    return {
        type: "ADD_DATA",
        data
    }
}

【讨论】:

  • 轻微语法错误,{ add = (data) =&gt; .. } 应该是{ add: data =&gt; .. }
  • 双向使用
  • 它不能。您将此与默认分配混淆
  • 哦,对不起,你是对的!我读错了!我以为你在谈论(data)data,而不是:-
【解决方案3】:

建议任何调度的动作都应该返回一个纯对象,这里你的addData 不是返回一个对象。像这样写下你的动作:

function addData(data) {
  return {
    type: "ADD_DATA",
    data
  }
};

您还可以查看在您的 connect 方法中作为前 2 个参数返回的 mapStateToPropsmapDispatchToProps 对象。它们为您提供了更多的灵活性来布置道具。请参阅此处的文档:Redux API

【讨论】:

  • 您对对象的看法是正确的,但您不需要这些功能中的任何一个。如果您只想传递dispatch,则可以不带任何参数使用connect()
  • 原来的 addData 函数没有任何语法错误,有趣的是,它在技术上是有效的 JavaScript。无意中使用了labeled statementcomma operator
猜你喜欢
  • 2019-09-23
  • 2018-08-01
  • 2020-10-28
  • 2019-03-31
  • 1970-01-01
  • 2022-01-03
  • 2020-04-10
  • 2017-10-20
  • 2021-11-02
相关资源
最近更新 更多