如何在createContainer(react-meteor-data)中访问Redux State?

时间:2017-07-02 16:36:08

标签: reactjs meteor redux react-redux

Stack :Meteor 1.5,React,Redux,React Router 4

我正在尝试在React组件中显示一系列事件。应根据某些Redux状态过滤事件。过滤应该发生在服务器端(以最小化流量) - 即通过订阅中的参数。

现在我不希望我的所有Meteor日期都处于Redux状态,而只需要一些常规应用程序设置(用户设置,过滤器,位置等)。

我的方法如下:

  1. 使用Redux状态连接哑组件并获取过滤器
  2. 在createContainer中包装已连接的组件并传递道具(应包括过滤器)。
  3. 我的问题是:

    道具不包含过滤器。谁知道为什么?代码如下。控制台日志仅显示Home组件的道具(即未连接的组件)。

    class Home extends Component {
        render () {
            return (
                <div>
                    { /* display events here */ }
                </div>
            )
        }
    }
    
    const mapStateToProps = state => {
        return {
            filter: state.filter
        }
    }
    
    let connectedHomeComponent = connect(mapStateToProps,)(Home)
    
    export default connectedHomeContainer = createContainer(_ => {
        console.log(_);
        let eventsSub = Meteor.subscribe('getEventsByFilter');
        let loading = !eventsSub.ready();
        let events = null;
        loading ? (events = null) : (events = Events.find().fetch());
        let eventsExists = !loading && !!events;
        return {
            loading,
            events,
            eventsExists,
        }
    }, connectedHomeComponent)
    

1 个答案:

答案 0 :(得分:1)

您以错误的顺序包裹了Home组件。你的回调函数会传递你的HomeContainer组件传递的道具。因此,如果您希望redux将filter道具注入您的HomeContainer,那么您必须将其转为:

const HomeContainer = createContainer(_ => {
    console.log(_);
    const eventsSub = Meteor.subscribe('getEventsByFilter');
    const loading = !eventsSub.ready();
    let events = null;
    loading ? (events = null) : (events = Events.find().fetch());
    const eventsExists = !loading && !!events;
    return {
        loading,
        events,
        eventsExists,
    } }, Home)

export default connectedHomeContainer = connect(mapStateToProps)(HomeContainer)

附注:默认情况下使用const,如果您稍后需要改变变量,则只将其更改为let