【问题标题】:Component in Component, React redux组件中的组件,React redux
【发布时间】:2018-10-17 12:44:34
【问题描述】:

是否可以在组件中调用组件(如inception)

例子

内容.jsx

class Content extends React.Component {
    constructor(props) {
        super(props);
    }

    componentDidMount() {
        this.props.dispatch(fetchNav(this.props.match.params.tab));
    }

    componentDidUpdate(prevProps) {
        if(this.props.match.params.tab != prevProps.match.params.tab) {
            this.props.dispatch(fetchNav(this.props.match.params.tab));
        }
    }

    render() {
        const {nav, match} = this.props;
        let redirect = null;
        return (
            <div>
                <ul>
                    {nav.some((item, key) => {
                        if (this.props.location.pathname != (match.url + item.path)) {
                            redirect = <Redirect to={(match.url + item.path)} />;
                        }
                        return true;
                    })}
                    {redirect}
                    {nav.map((item, key) => {
                        return <li key={key}>
                            <Link to={match.url + item.path}>{item.name}</Link>
                        </li>;
                    })}
                    <Switch>
                        {nav.map((item, key) => {
                            return <Route key={key} path={`${match.url}/list/:tab`} component={Content} />;
                        })}
                    </Switch>
                </ul>
            </div>
        );
    }
}

const mapStateToProps = (state, props) => {
    const {fetchNav} = state;
    const {
        lastUpdated,
        isFetching,
        nav: nav
    } = fetchNav[props.match.params.tab] || {
        isFetching: true,
        nav: []
    };

    return {
        nav,
        isFetching,
        lastUpdated
    }
};

export default connect(mapStateToProps)(withStyles(appStyle)(Content));

实际上,当我这样做时,如果我的路由匹配并调用相同的“内容”组件,它会说:“this.props.dispatch is not a function”

你认为我需要创建一个 ContentContainer 来管理 connect() 并通过 props 传递一个方法来管理更改吗?

非常感谢您的回答

问候,

托马斯。

【问题讨论】:

    标签: reactjs react-redux


    【解决方案1】:

    您显然没有将调度映射到您的连接中的道具。

    redux 的连接方法见docs

    connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])

    您可以像这样将调度函数映射到您的道具:

    const mapDispatchToProps = (dispatch) => ({ dispatch });
    connect(mapStateToProps, mapDispatchToProps)...
    

    你认为我需要创建一个 ContentContainer 来管理 connect() 并通过 props 传递一个方法来管理更改吗?

    您不需要容器。容器和(视图)组件之间的代码分离只是一种模式,不是必需的。

    作为旁注:我建议使用 compose 来组合您的 HOC,请参阅 thisthis

    【讨论】:

    • 文档说:如果您不提供自己的 mapDispatchToProps 函数或充满动作创建者的对象,则默认的 mapDispatchToProps 实现只会将调度注入组件的道具。所以调度是默认的。调度有效,但在 Content 内的 Content 调用完成时无效。所以还是不行。感谢您撰写 ;)
    • @ThomasCorbisier “所以调度是默认的。” – 确实如此 :) 嗯,您确定在您的 withStyles 组件中您也不会意外地从您的道具中剥离调度吗?
    • 尝试将您从 withStyles HOC 传递的道具记录到您的内容组件中,并检查是否缺少调度。
    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 2016-09-11
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2016-06-30
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多