Состояние компонента ReactJS не меняется должным образом

Я создал Container класс и InnerElement учебный класс. Где Container оборачивает InnerElements. Нужно показать только один InnerElement в данный момент.

Проблема появляется, когда я перехожу на другую InnerElement, Интересно, когда я создаю console.log он отображает измененный элемент, но не отображается. Может ли кто-нибудь дать мне подсказку, пожалуйста, спасибо заранее!

Container учебный класс:

import React from 'react';

export default class Container extends React.Component {

    constructor(props) {
        super(props);

        this.changeElement = this.changeElement.bind(this);

        this.state = {
            currentElement: 0,
        }
    }

    changeElement() {
        const nextElement = this.state.currentElement + 1;
        this.setState({currentElement: nextElement});
    }

    render() {
        const element = this.props.children[this.state.currentElement];
        // In the console log the next (correct) element is shown
        console.log(element);

        return (
            <div>
                {element}
                <button onClick={this.changeElement}>next element</button>
            </div>
        );
    }
}

Здесь InnerElement учебный класс:

import React from 'react';
export default class InnerElement extends React.Component {

    constructor(props) {
        super(props);

        this.state = {
            name: props.name ? props.name : "test"
        }
    }

    render() {
        return (
            <div>
                {this.state.name}
            </div>
        );
    }
}

И вот мой Container с InnerElement вызов:

<Container>
    <InnerElement name="A" />
    <InnerElement name="B" />
    <InnerElement name="C" />
    <InnerElement name="D" />
</Container>

Я также обнаружил, что это работает, когда я использую в InnerElement this.props.name вместо гос.

1 ответ

Решение

Реагируйте на проблемы, определяя, что ваши дети меняются вместе с вашим setState потому что вы динамически модифицируете детей. Чтобы помочь React сделать это, вы можете добавить ключ к своему InnerElement:

<Container>
  <InnerElement key="A" name="A" />
  <InnerElement key="B" name="B" />
  <InnerElement key="C" name="C" />
  <InnerElement key="D" name="D" />
</Container>
Другие вопросы по тегам