Элемент рендеринга ReactJS по ссылке

Я пытаюсь отобразить родительский компонент, у которого есть два дочерних элемента. Рендеринг дочерних элементов будет переключаться, поэтому один раз будет отображаться только первый дочерний элемент, в другой раз он будет последним и, наконец, он вернется к первому дочернему элементу (который затем должен содержать все значения, показанные ранее). Я думал, что это будет просто, но оказалось, что это не так.

Теперь к проблеме: всякий раз, когда вызывается метод switchContainer, он переключает контейнер и отображает другой. Однако все переменные-члены, свойства и состояния теряются, и это в основном восстановило дочерний компонент с нуля.

Есть ли способ сохранить дочерние компоненты «как есть», и после повторного рендеринга он снова будет содержать все переменные-члены, свойства и состояния?

Я знаю, что вы можете отправлять реквизиты и состояния элементу следующим образом:

<Child props = {<data>} states = {<data>}>

но это не решает проблему с отсутствующими переменными-членами, и, на мой взгляд, это непростое решение.

Моя попытка пока (это всего лишь макет):

class Parent extends React.Component<any,any> {
  private firstContainer:any;
  private secondContainer:any;
  private currentContainer:any;
  constructor(props:any) {
        super(props);
        this.firstContainer = <Child>;
        this.secondContainer = <Child>;
    }
    public render() {
        return (
            <div>
                {this.currentContainer}
            </div>
        );
    }
    public switchContainer() {
        if (this.currentContainer === this.firstContainer) {
            this.currentContainer = this.secondContainer;
        }
        else {
            this.currentContainer = this.firstContainer;
        }
        this.forceUpdate();
    }
}


class Child extends React.Component<any,any> {
    private anyValue:string;
    constructor(props) {
        this.change = this.change.bind(this);
    }
    public render() {
        return (
            <input onChange = {this.change} value = {this.anyValue}/>
        );
    }
    private change(e:any) {
        this.anyValue = e.target.value;
    }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
449
1

Ответы 1

Вы можете попробовать сохранить состояние и обновить дочерние элементы в рендере вместо сохранения дочерних элементов как firstContainer и secondContainer

class Parent extends React.Component<any, any> {
    constructor(props) {
        super(props);
        this.state = {
            firstChild: true
        };
    }

    public render() {
        const { firstChild } = this.state;
        <div>
            <Child1 show = {firstChild}/>
            <Child2 show = {!firstChild} />
        </div>
    }

    public switchContainer() {
        this.setState(({ firstChild }) => ({ firstChild: !firstChild }));
    };
}

И в дочернем компоненте дескриптор show to showContent в противном случае отобразит значение null. Если вы хотите сохранить состояние, не следует отключать компонент.

Спасибо за быстрый ответ, к сожалению, это невозможно, так как дети могут быть добавлены «на лету» и неизвестны с самого начала. Таким образом, родительский компонент всегда должен будет повторно отображать дочерние элементы после добавления нового дочернего элемента. В вашем примере всякий раз, когда изменяется «firstChild», дочерний элемент будет повторно отображать, поэтому переменная-член «anyValue» снова теряется.

marius 25.07.2018 13:44

Вы можете сохранить любое значение как состояние в родительском компоненте.

Ravi Theja 25.07.2018 13:55

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