【问题标题】:How can I dispatch from child components in React Redux?如何从 React Redux 中的子组件调度?
【发布时间】:2016-04-11 21:34:23
【问题描述】:

我的服务器有这样的代码:

<ReactRedux.Provider store={store}><Layout defaultStore={JSON.stringify(store.getState())}/></ReactRedux.Provider>

<Layout> 显然有更多嵌套的组件。

我有这样一个更深层次的课程:

import React from 'react';

export default React.createClass({
  render: function(){
    var classes = [
      'js-select-product',
      'pseudo-link'
    ];

    if (this.props.selected) {
      classes.push('bold');
    }

    return (
      <li className="js-product-selection">
        <span onClick={this.props.onClick} className={classes.join(' ')} data-product={this.props.id}>{this.props.name}</span>
      </li>
    );
  }
});

我真正想做的而不是this.props.onClick 是向set state in a reducer 发送一个事件。我在网上有一些关于上下文的事情,但我得到了褒贬不一的评价,因为该功能是否会消失。

编辑 我看到了这个connect method,但我可以发誓我不会在子组件中使用connect

【问题讨论】:

    标签: javascript reactjs react-redux


    【解决方案1】:

    您太沉迷于子组件了。您应该构建您的应用程序,以便您拥有连接的组件和非连接的组件。非连接组件应该是无状态的,本质上是纯函数,通过 props 接收所有需求。连接的组件应该使用connect 函数将redux state 映射到props,redux dispatcher 映射到props,然后负责将这些props 传递给子组件。

    您的应用中可能有很多连接的组件,也可能有很多未连接的组件。 This post(redux 的创建者)更详细地讨论了它,并讨论了非连接(哑)组件负责 UI 的实际显示,连接(智能)组件负责组合非连接组件。

    一个例子可能是(使用一些较新的语法):

    class Image extends React {
      render() {
        return (
          <div>
            <h1>{this.props.name}</h1>
            <img src={this.props.src} />
            <button onClick={this.props.onClick}>Click me</button>
          </div>
        );
      }
    }
    
    class ImageList extends React {
      render() {
        return (
          this.props.images.map(i => <Image name={i.name} src={i.src} onClick={this.props.updateImage} />)
        );
      }
    }
    
    const mapStateToProps = (state) => {
      return {
        images: state.images,
      };
    };
    const mapDispatchToProps = (dispatch) => {
      return {
        updateImage: () => dispatch(updateImageAction()),
      };
    };
    export default connect(mapStateToProps, mapDispatchToProps)(ImageList);
    

    在本例中,ImageList 是连接组件,Image 是非连接组件。

    【讨论】:

    • "连接的组件应该使用 connect 函数来映射"redux dispatcher 到 props。换句话说,将调度程序作为道具传递给孩子,例如
    • @jeffora 这个答案的问题是您假设您可以在“父级”中加载所有调度操作。但它并没有解决 OP 的问题,即将子组件连接到 redux 调度是否是一种反模式
    • @AlxVallejo 嘿,感谢您的评论。我相信我在答案中链接到的帖子确实解决了 OP 的问题,表明连接子组件 not 是一种反模式。正如你所说,我假设父组件可以加载它需要的所有调度操作,但我没有假设应用程序有一个 single 父组件。 “父级”可能非常低级,但它应该只关心连接到调度程序并将数据传递给子组件,而子级只关心渲染输入数据。此外,这已经 2 岁了,事情变化很快
    【解决方案2】:

    过去曾有建议尝试限制您连接的组件。例如:

    https://github.com/reactjs/redux/issues/419

    https://github.com/reactjs/redux/issues/419#issuecomment-178850728

    无论如何,这对于将状态切片委托给组件确实更有用。如果这对您的情况有意义,或者您不想传递调用 dispatch() 的回调,您可以这样做,您可以根据需要传递存储或向下分派层次结构。

    【讨论】:

    • 所以真的把它连接到像例子export default connect()(MyComponent)这样的组件,然后从那里分派?忘记我 6 个月前的记忆? :)
    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2018-06-05
    • 2023-03-31
    • 2016-06-06
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多