react-redux Reducer不会将对象传递给商店

时间:2018-08-18 17:28:18

标签: javascript reactjs redux react-router react-redux

我遇到了问题,我真的可以使用一些帮助。我对React和react-redux非常陌生,因此解决方案可能比我想的要简单(我希望如此)。我有一个简单的网站,其中包含带有配方名称的链接(来自react-router):

user space

现在,我还有一个组件Post,应该是一个配方。

kernal space

不管我做什么,我似乎都无法使其正常运行。我有一个操作,可以提取单个配方(获取配方列表没有问题),然后将其传递给减速器。但是,当我将console.log(action.payload)放入减速器的情况下,它可以很好地显示控制台中包含配方的对象。但是,当我将{this.props.recipe.name}放入Post.js时,我得到一个错误,指出this.props.recipe是未定义的。任何帮助都非常感谢。可以肯定的是,我还将发布reducer的代码和操作。

减速器:

class Posts extends Component {

    componentWillMount() {
        this.props.fetchPosts();
    }

    componentWillReceiveProps(nextProps) {
        if (nextProps.newPost) {
            this.props.posts.unshift(nextProps.newPost);
        }
    }


    render() {
        const postItems = this.props.posts.map(recipe => (
            <div key={recipe.id}>
                <Link to={`/recipe/id/${recipe.id}`}>{recipe.name}</Link>
            </div>
        ));

        return (

            <Router>
            <div>
                <h1>Well yeah</h1>
                {postItems}
                <Route path={`/recipe/id/:recipeId`} component={Post}/>
            </div>
            </Router>
        );
    }
}
Posts.propTypes = {
    fetchPosts: PropTypes.func.isRequired,
    posts: PropTypes.array.isRequired,
    newPost: PropTypes.object,
};

const mapStateToProps = state => ({
    posts: state.posts.items,
    newPost: state.posts.item,
});

export default connect(mapStateToProps, {fetchPosts})(Posts);

动作:

class Post extends Component {
    static propTypes = {};

    componentDidMount() {
        this.props.fetch();
    }

    render() {
        return (
            <div>Hello{this.props.recipe.name}</div>
        );
    }
}

Post.propTypes = {
    fetch: PropTypes.func.isRequired,
    recipe: PropTypes.object
};

const mapDispatchToProps = (dispatch, ownProps) => ({
    fetch: () => {
        dispatch(fetchPostById(ownProps.location.pathname))
    }
});
const mapStateToProps = state => ({

    recipe: state.posts.recipe
});
export default connect(mapStateToProps, mapDispatchToProps)(Post);

主减速器:

const initialState = {
    items: [],
    item: {},
    recipe:{}

};

export default function (state = initialState, action) {
    switch (action.type) {
        case FETCH_RECIPES:
            return {
                ...state,
                items: action.payload
            };
        case NEW_RECIPE:
            return {
                ...state,
                item: action.payload
            };
        case FETCH_RECIPE_ID:
            return{
                ...state,
                recipe:action.payload
            };
        default:
            return state;
    }

}

2 个答案:

答案 0 :(得分:0)

在关闭WebStorm过夜后,该网站于第二天早晨启动并运行良好。我对react-router的部分门槛有疑问,但是我将发布其他问题,因此我不会违反任何规则。非常感谢!

答案 1 :(得分:-1)

在这一行recipe: state.posts.recipe中,您所暗示的是在您的状态下有一个posts对象可以保存您的食谱,但是在reducer中,我看不到您所在状态的任何posts对象。尝试将其更改为此行recipe: state.recipe