Реагировать на изменение объекта свойства

#reactjs #object #properties #parent-child #react-component

#reactjs #объект #свойства #родитель-потомок #реагировать-компонент

Вопрос:

Я ищу способ обновить реакцию.Компонент, когда изменяется внутреннее состояние одного из его свойств (объекта).

Пример:

 export class ParentClass extends React.Component {

    constructor(props) {
        super(props);
        this.someObject = new SomeObject();
    }

    ...

    render() {
        return <ChildClass someObject=this.someObject />
    }
}
 

Когда я вызываю this.someObject.change() родительский класс. Как я могу сообщить дочернему классу, что он должен выполнить повторный рендеринг, поскольку внутреннее состояние SomeObject только что изменилось?

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

Возможно ли ChildClass в этом случае запустить повторный рендеринг? Может быть, есть лучшее соглашение для управления этими отношениями?

Ответ №1:

Это может повлиять на производительность, но я решил эту проблему, перейдя someObject в состояние родительского объекта и установив дочернее свойство {this.state.someObject} равным .

Когда SomeObject (в данном случае roadTileMatrix ) изменяется, я клонирую объект, вношу изменения, затем устанавливаю новый объект в качестве состояния. Это, кажется, распространенный шаблон из моего чтения.

В качестве альтернативы, в качестве более легкого решения, похоже, вы могли бы вместо этого установить key значение в состоянии, которое будет меняться каждый раз, когда вносятся изменения в SomeObject, вызывая повторный рендеринг дочернего объекта.

Код здесь:

 import React from 'react'
import PropTypes from 'prop-types';

import { RoadTileMatrix, Grid } from './Grid';
import { TravelGraph } from './TravelGraph';

export class RoadNetwork extends React.Component {
    constructor(props) {
        super(props);

        const rows = this.props.rows;
        const cols = this.props.cols;

        this.state = {
            roadTileMatrix: new RoadTileMatrix(rows, cols, null)
        };

        this.addTile = this.addTile.bind(this);
    }

    addTile(r, c) {
        const rows = this.props.rows;
        const cols = this.props.cols;
        const oldArray = this.state.roadTileMatrix.innerArray;

        const newRoadTileMatrix = new RoadTileMatrix(rows, cols, oldArray);
        newRoadTileMatrix.addTile(r, c, true);

        this.setState({
            roadTileMatrix: newRoadTileMatrix,
        });
    }

    render() {
        return (
            <div>
                <Grid roadTileMatrix={this.state.roadTileMatrix} addTile={this.addTile} />
                <TravelGraph />
            </div>
        );
    };
}

RoadNetwork.propTypes = {
    rows: PropTypes.number.isRequired,
    cols: PropTypes.number.isRequired,
}