3

我已经Redux在我的React应用程序中实现了,到目前为止效果很好,但我有一个小问题。

我的导航栏中有一个选项可以更改locale存储在redux's state. 当我更改它时,我希望每个组件都重新渲染以更改转导。为此,我必须指定

locale: state.locale

mapStateToProps函数中......这导致了大量的代码重复。

有没有办法将 locale 隐式传递到每个组件的 propsconnectreact-redux

提前致谢!

4

3 回答 3

7

Redux 实现了一个shouldComponentUpdate来防止组件更新,除非它的 props 被改变。

pure=false在您的情况下,您可以通过传递给忽略此检查connect

connect(select, undefined, undefined, { pure: false })(NavBar);

出于性能原因,这是一件好事,可能不是您想要的。

相反,我建议编写一个自定义连接函数,以确保locale始终将其添加到您的组件道具中:

const localeConnect = (select, ...connectArgs) => {
  return connect((state, ownProps) => {
    return {
      ...select(state, ownProps),
      locale: state.locale
    };
  }, ...connectArgs);
};

// Simply use `localeConnect` where you would normally use `connect`
const select = (state) => ({ someState: state.someState });

localeConnect(select)(NavBar);  // props = { someState, locale }
于 2016-06-27T23:17:01.243 回答
0

为了减少代码的重复,我通常只在将状态映射到道具时将箭头函数传递给 connect 方法,这对我来说看起来更干净。不幸的是,我认为没有另一种方法可以使其隐含,因为您的组件可以订阅多个商店“对象”。

export default connect((state) => ({
  local: state.locale
}))(component);
于 2016-06-27T16:05:49.973 回答
0

为了解决这个问题,你可以设置你的父组件的Context,并在你的子组件中使用它。这是 Redux 用来为连接的 React 组件提供 storestate和函数的。dispatch

在您的 Parent 组件中,实现getChildContext并指定每个变量的PropType.

class Parent extends React.Component {
    getChildContext() {
        return {
            test: 'foo'
        };
    }

    render() {
        return (
            <div>
                <Child />
                <Child />
            </div>
        );
    }

}

Parent.childContextTypes = {
    test: React.PropTypes.string
};

在您的 Child 组件中,使用this.context.test并指定其PropType.

class Child extends React.Component {
    render() {
        return (
            <div>
                <span>Child - Context: {this.context.test}</span>
            </div>
        );
    }
}

Child.contextTypes = {
    test: React.PropTypes.string
};

这是它工作的演示

我不妨提一下,虽然像 Redux 这样的库使用了这个,但 React 的文档指出这是一个高级和实验性的特性,并且可能会在未来的版本中更改/删除。我个人不推荐这种方法,而不是mapStateToProps像您最初提到的那样简单地传递您需要的信息。

于 2016-06-27T19:21:23.933 回答