Я думаю, что это правильная идея - нет ничего плохого в использовании обратных вызовов, если за ним все еще достаточно легко следовать, что, кажется, именно здесь. Redux отлично подходит для очень сложных состояний, охватывающих большие иерархии; для чего-то более простого, подобного этому, скорее всего, это будет ненужная церемония.

й компании мы переносим интерфейс веб-приложения на ReactJS. Мы работаем с приложением create-реагировать (обновлено до v16), без Redux. Теперь я застрял на странице, структуру которой можно упростить с помощью следующего изображения:

Данные, отображаемые тремя компонентами (SearchableList, SelectableList и Map), извлекаются с одним и тем же внутренним запросом вcomponentDidMount() метод MainContainer. Результат этого запроса затем сохраняется в состоянии MainContainer и имеет структуру, более или менее похожую на эту:

state.allData = {
  left: {
    data: [ ... ]
  },
  right: {
    data: [ ... ],
    pins: [ ... ]
  }
}

LeftContainer получает в качестве опорыstate.allData.left от MainContainer и пропусковprops.left.data в SearchableList, еще раз в качестве опоры.

RightContainer получает в качестве опорыstate.allData.right от MainContainer и пропусковprops.right.data в SelectableList иprops.right.pins на карту.

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

Я решил сохранить в состоянии RightContainer список, в котором хранятся все идентификаторы элементов, отображаемых с помощью SelectableList; этот список передается как реквизиты и в SelectableList, и в Map. Затем я передаю в SelectableList обратный вызов th, когда всякий раз, когда делается выбор, обновляется список идентификаторов внутри RightContainer; новые реквизиты поступают как в SelectableList и Map, и такrender() называется в обоих компонентах.

Он работает нормально и помогает сохранить все, что может случиться с SelectableList и Map внутри RightContainer, но я спрашиваю, верно ли это длялифтинг-состояние до а такжеодного источника из-истины концепции.

В качестве возможной альтернативы я подумал добавить_selected свойство каждого элемента вstate.right.data в MainContainer и передайте три уровня обратного вызова select в SelectableList, обрабатывая все возможные действия в MainContainer. Но как только происходит событие выбора, это в конечном итоге приведет к загрузке LeftContainer и RightContainer, что приводит к необходимости реализации таких логик, какshouldComponentUpdate() избегать бесполезногоrender() особенно в LeftContainer.

Какое / может быть лучшее решение для оптимизации этой страницы с точки зрения архитектуры и производительности?

Ниже у вас есть выдержка из моих компонентов, чтобы помочь вам понять ситуацию.

MainContainer.js

class MainContainer extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      allData: {}
    };
  }

  componentDidMount() {
    fetch( ... )
      .then((res) => {
        this.setState({
          allData: res
        });
      });
  }

  render() {
    return (
      <div className="main-container">
        <LeftContainer left={state.allData.left} />
        <RightContainer right={state.allData.right} />
      </div>
    );
  }
}

export default MainContainer;

RightContainer.js

class RightContainer extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      selectedItems: [ ... ]
    };
  }

  onDataSelection(e) {
    const itemId = e.target.id;
    // ... handle itemId and selectedItems ...
  }

  render() {
    return (
      <div className="main-container">
        <SelectableList
          data={props.right.data}
          onDataSelection={e => this.onDataSelection(e)}
          selectedItems={this.state.selectedItems}
        />
        <Map
          pins={props.right.pins}
          selectedItems={this.state.selectedItems}
        />
      </div>
    );
  }
}

export default RightContainer;

Заранее спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос