13

My server has code like this:

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

<Layout> obviously has more components which nest more.

I have a class like this deeper down:

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>
    );
  }
});

What I really want to do rather than this.props.onClick is dispatch an event to set state in a reducer. I've been some things online about context but I've gotten mixed reviews as that feature was or wasn't going away.

EDIT I see this connect method but I could have sworn I'd read not to use connect in children components.

4

2 回答 2

27

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

一个应用程序中可能有很多连接的组件,也可能有很多未连接的组件。这篇文章(由 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是一个非连通组件。

于 2016-04-11T21:53:36.413 回答
0

曾经有建议尝试限制您连接的组件。参见例如:

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

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

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

于 2016-04-11T21:47:19.100 回答