React. Objects are not valid as a React child (found: object with keys {slide})

182
29 марта 2018, 10:20

Добрый день. Получаю ошибку рендера в следующей ситуации. Я не очень понимаю что в этой ситуации должно быть массивом. Я итак беру список данных и в App.js рендерю весь список.

Самое интересное, что если я уберу this.state.isOpen && из const slide = this.state.isOpen && <div className="item"> <h3 className="item__hero">{hero}</h3> <p className="item__text">{text}</p> <img className="item__picture" src={image}/> </div> ; то все заработает корректно..

привожу полный код моих компонентов:

Slide.js

import React, {Component} from 'react';
class Slide extends Component {
    constructor(props) {
        super(props);
        this.state = {
            isOpen: props.defaultOpen
        }
    }
    render() {
        const {hero, text, image} = this.props;
        const slide = this.state.isOpen && <div className="item">
            <h3 className="item__hero">{hero}</h3>
            <p className="item__text">{text}</p>
            <img className="item__picture" src={image}/>
        </div> ;
        return (
            {slide}
        )
    }
}
export default Slide;

SliderItemList.js

export default function SliderItemList({sliderItems}) {
    const sliderElements = sliderItems.map((item, i) =>
        <Slide key={i} {...item} defaultOpen={i === 0}/>
    )
    return (
        <div className="container">
            <div className="slider__items">
                {sliderElements}
            </div>
        </div>
    )
}

App.js

import React, {Component} from 'react';
import SliderItemList from './components/SliderItemList';
import Slider from './components/Slider';
import feed from './feed';
class App extends Component {

    count = feed.slider.length;
    render() {
        return (
            <div className="container">
                <button>Left</button>
                <button>Right</button>
                <p>{this.count}</p>
                <SliderItemList sliderItems={feed.slider}/>
            </div>
        );
    }
}

И собственно массив объектов с данными:

const feed = {
    "slider": [
        {
            "hero": "https://placeimg.com/640/480/animals",
            "text": "Animals are here.",
            "image": "https://placeimg.com/150/150/animals/sepia"
        },
        {
            "hero": "https://placeimg.com/640/480/people",
            "text": "People are here.",
            "image": "https://placeimg.com/150/150/people/sepia"
        },
        {
            "hero": "https://placeimg.com/640/480/tech",
            "text": "Tech is here.",
            "image": "https://placeimg.com/150/150/tech/sepia"
        }
    ]
};
export default feed;

Objects are not valid as a React child (found: object with keys {slide}). If you meant to render a collection of children, use an array instead.

Заранее благодарен за помощь

Answer 1

@VladyslavTereshyn попробуйте переписать вашу компоненту Slide.js

render() {
    const {hero, text, image} = this.props;
    if (this.state.isOpen) {
        return (
             <div className="item">
                 <h3 className="item__hero">{hero}</h3>
                 <p className="item__text">{text}</p>
                 <img className="item__picture" src={image}/>
             </div>
        )
    }
    return null
}
READ ALSO
Как сделать прелоадер для сайта?

Как сделать прелоадер для сайта?

Стандартный способ это подгрузить мини блок и стили для него, в потом скрытьДля этого устанавливается таймер

178
Google adwords reports

Google adwords reports

В документации есть такой пример:

198
Unix Timestamp + 5 минут

Unix Timestamp + 5 минут

Здравствуйте!

220