React-redux Reducer не передает объект в магазин

У меня проблема, и мне действительно нужна помощь. Я очень новичок, чтобы реагировать и реагировать-redux, поэтому решение, вероятно, проще, чем я мог подумать (я надеюсь на это). У меня есть простой сайт, который содержит ссылки (от response-router) с названиями рецептов:

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

Теперь у меня также есть компонент Post, который должен быть одним рецептом.

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

Независимо от того, что я делаю, я не могу заставить его работать должным образом. У меня есть действие, которое выбирает единственный рецепт (у меня нет проблем с получением списка рецептов), а затем передает его редуктору. Однако, когда я помещаю console.info (action.payload) в case в редукторе, он отлично показывает объект, содержащий рецепт, в консоли. Но когда я помещаю {this.props.recipe.name} в Post.js, я получаю сообщение об ошибке: this.props.recipe не определен. Любая помощь очень ценится. Чтобы быть уверенным, я также выложу код редуктора и действий.

Редуктор:

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

}

Действия:

export const fetchPosts = () => dispatch => {
    fetch('http://192.168.1.3:6996/recipe')
        .then(res => res.json())
        .then(recipes => dispatch({
            type: FETCH_RECIPES,
            payload: recipes
        }));

};
export const createPost = (postData) => dispatch => {
    fetch('http://192.168.1.3:6996/recipe', {
        method: 'POST',
        headers: {
            'content-type': 'application/json'
        },
        body: JSON.stringify(postData)
    }).then(res => res.json()).then(recipe => dispatch({
        type: NEW_RECIPE,
        payload: recipe
    }))

};
export const fetchPostById= (id) => dispatch => {
    fetch('http://192.168.1.3:6996' + id)
        .then(recipe => recipe.json())
        .then(recipe => dispatch({
        type: FETCH_RECIPE_ID,
        payload: recipe
    }))
};

Главный редуктор:

import { combineReducers } from 'redux'
import postReducer from './postReducer'

export default combineReducers({
    posts: postReducer
});

ошибка копирования / вставки: recipe: state.posts.recipe в mapStateToProps

xadm 18.08.2018 19:56

что ты имеешь в виду? Ваш комментарий и мой код совпадают?

CoolPrase 18.08.2018 20:07

почини это место;)

xadm 18.08.2018 20:10

Я бы с удовольствием, но я не знаю как

CoolPrase 18.08.2018 20:18

у вас есть posts в гос?

xadm 18.08.2018 20:20

Я делаю, плюс собираю названия всех рецептов, работает и они тоже посты.

CoolPrase 18.08.2018 20:29

обновление изменяет «контекст». бревенчатые стойки в componentDidUpdate и shouldComponentUpdate() {return true}

xadm 18.08.2018 20:51

вы проверили реквизиты на вкладке инструментов разработки? может быть, реквизит обновлен, но смотреть нет

xadm 18.08.2018 21:01

URL не должен содержать '/recipe/'+ id? вы написали, что он загружается нормально - этого не должно быть с fetch('http://192.168.1.3:6996' + id) .... хорошо, я вижу `location.pathname '

xadm 18.08.2018 21:22

Я не уверен, что вы имеете в виду, говоря об этих обновлениях, но я займусь этим завтра. Это нормально, я получаю единственный рецепт редуктора, не могу передать его в Post.js. Я думал, что моя проблема связана с функцией подключения и / или mapStateToProps

CoolPrase 19.08.2018 01:11

В ваших сообщениях и компонентах сообщений добавьте эту строку внутри render console.info(this.props), посмотрите, что вы получаете

SGhaleb 19.08.2018 08:50

Я получаю 30 предметов и пустой список рецептов, но не один рецепт

CoolPrase 19.08.2018 08:58

render должен вызываться дважды (используйте журнал) - если нет, то обновленные реквизиты не вызывают принудительную повторную визуализацию (принудительное выполнение гарантируется для изменения состояния) - используйте shouldComponentUpdate для регистрации изменений / принудительного рендеринга

xadm 19.08.2018 12:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
13
934
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В этой строке recipe: state.posts.recipe вы подразумеваете, что в вашем состоянии есть объект сообщений, содержащий ваш рецепт, но в редукторе я не вижу никаких объектов сообщений в вашем состоянии. попробуйте поменять его на эту строчку recipe: state.recipe

Да, извините, верю. редуктор, который я показываю, не является основным, он выглядит так: import {combReducers} из 'redux' импортировать postReducer из './postReducer' экспортировать комбинированныеReducers по умолчанию ({posts: postReducer});

CoolPrase 18.08.2018 20:27

в основном да, я должен писать там сообщения

CoolPrase 18.08.2018 20:28

вы можете добавить в сообщение свой другой редуктор?

H.Qureshi 18.08.2018 20:30

Готово. Если это поможет, я могу опубликовать все это на github или что-то в этом роде ..

CoolPrase 18.08.2018 20:32

postReducer - это тот, который вы разместили ранее?

H.Qureshi 18.08.2018 20:33

да. Редуктор поста - это тот, который я показал изначально

CoolPrase 18.08.2018 20:34

Вы настроили поставщик в корневом компоненте?

vitomadio 18.08.2018 20:51

Вот в чем дело - у меня есть! У меня почти идентичные рецепты получения действий, с той лишь разницей, что для этого действия я предоставляю идентификатор, поэтому он является двухсторонним, а для других действий - всегда одним способом.

CoolPrase 18.08.2018 20:55
Ответ принят как подходящий

после отключения WebStorm на ночь сайт заработал на следующее утро и работал нормально. У меня проблема с подоконником части реактивного маршрутизатора, но я опубликую другой вопрос, поэтому я не нарушаю никаких правил. Большое спасибо!

Другие вопросы по теме