Push истории не определено при использовании реквизита в Axios getData в React - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь сделать этот компонент постов многоразовым, добавив реквизиты от родителя.Мои реквизиты "путь" и "фильтр".У меня есть путь к моей базе данных, который я хочу обновить, и фильтр, который позволяет мне отфильтровывать данные из этой базы данных.Распечатывает список сообщений на основе пути и фильтра.Это работает нормально, мой компонент Posts показывает правильно.

Однако, когда я добавляю функцию щелчка к своему единственному сообщению, чтобы он перешел к компоненту 'FullPost' на основе post.id, я получаю ошибкуговоря, что это не может прочитать свойство «push» из неопределенного.Когда я не использую реквизиты, а жестко кодирую значения, он работает нормально, и щелчок работает как положено, он переходит к компоненту FullPost и URL-адресу на основе идентификатора.

Я попытался распечатать «this.props.history», и он показывает «undefined».Я не уверен, как сделать это определенным и почему добавление реквизита делает это неопределенным.

Родитель называет это так:

<Route path="/food" exact render={() => <Posts pathname="/posts" filter="food" />} />

Кажется, что метод render () не делаетне включает в себя спасательные крючки, чтобы не включать историю?Однако я не уверен, как включить мои реквизиты, если я не использую render () вместо component = {} в Route.

Ниже приведен код:

import React, { Component } from 'react';
import axios from '../../../axiosPosts';

import Aux from '../../../hoc/Aux/Aux';
import classes from './Posts.css';
import Post from '../../../components/Post/Post';


class Posts extends Component {

    state = {
        posts: []
    }

    componentDidMount () {
        //console.log('posts props: ', this.props.pathname, ', posts filter: ', this.props.filter, ', this props: ', this.props);
        this.getData(this.props.pathname, this.props.filter);
    }

    getData(pathname, filter) {

        axios.get(pathname + '.json')
        .then(response => {
            const post = response.data.filter(({category}) => category === filter);

            const updatedPosts = post.map(post => {
                return {
                    ...post
                }
            });

            this.setState({
                posts: updatedPosts
            });

            console.log( 'history: ', this.props.history );
        })
        .catch(error => {
            console.log(error);
        });
    }


    postSelectedHandler = ( id ) => {
        this.props.history.push( this.props.match.url + '/' + id );
    }

    render () {
        let posts = <p style={{textAlign: 'center'}}>Whoops! Something went wrong.</p>;

        if(!this.state.error) {
            posts = this.state.posts.map(post => {
                return (
                     <Post 
                         key={post.id}
                         title={post.title}
                         dek={post.dek}
                         clicked={() => this.postSelectedHandler( post.id )}     />
                );
            });
        };
        return (
            <Aux>
                 <div className={classes.PostList}>
                     <h2 className={classes.PostListTitle}>{this.props.filter}</h2>
                    {posts}
                </div>
            </Aux>
        )
    }
}

export default Posts;

1 Ответ

0 голосов
/ 22 мая 2018

Вы пропустили маршрутные реквизиты :

<Route path="/food" exact render={(routeProps) => <Posts pathname="/posts" filter="food" {...routeProps} />} />

или (если вам нужно просто history):

<Route path="/food" exact render={({history}) => <Posts pathname="/posts" filter="food" history={history} />} />
...