2016-05-18 2 views
3

Допустим, у меня есть 3 компонента, подключенных в один родительский.Допустимо ли повторное предоставление детям 3 раза в ReactJS?

Псевдо пример:

<div> 
<Parent /> 
<ChildMetaData /> 
<ChildData /> 
</div> 

На щелчку <Parent /> я использую следующую функцию, которая передается в качестве опоры:

handleParentClick(tid,sifUser) { 
    this.setState({ 
     tid : tid , 
     sifUser : sifUser 
    }, 
    () => { 
     this.loadChildRequestsFromServer(); 
     this.loadUserDataFromServer(); 
    }); 
} 

изменений состояния.

=> Все 3 компонента переделаны.

Когда мои loadChildRequestsFromServer() заканчивает он изменяет состояние глобальной переменной

=> Все 3 компонента повторной визуализации.

Когда мои loadUserDataFromServer() заканчивает он изменяет состояние глобальной переменной

=> Все 3 компонента повторной визуализации.

Как вы можете видеть, когда я нажимаю на свой родитель, мои компоненты повторно обрабатывают 3 раза. (Я проверяю это, запустив console.log в одной из функций рендеринга компонента, например <ChildData />.)

Это приемлемое поведение, или я что-то не так?

Следует отметить, что обе функции «загрузка с сервера» - это вызовы AJAX. А так как loadChildRequestsFromServer() и this.loadUserDataFromServer() связаны друг с другом, возможно, мне не следует сразу обновлять состояние после завершения первой функции. Но скорее передайте данные следующей функции и обновите ее там.

+0

Компоненты вашего псевдо-примера не имеют отношения родитель-ребенок, они просто братья и сестры. – Scarysize

+0

Они являются родителями-родителями/мастерами-рабами в базе данных, поэтому я назвал их такими. Я думаю, вы можете игнорировать именование компонентов. Это может смутить людей. Но для меня это семантическое значение. – Paran0a

+0

Вы можете подумать о добавлении необязательного параметра, который подавляет повторную визуализацию, когда вы знаете, что вы будете выполнять несколько инициирующих вызовов последовательно. –

ответ

2

Это идеальное решение для повторной обработки ваших компонентов 3 раза.
Потому что есть 3 различных состояния родителя:

  1. без АЯКС результатов
  2. с АЯКС результатами первого вызова
  3. с АЯКС результатами обоих вызовов

Реагировать отфильтрует все ненужные обновления DOM в любом случае, что является основным узким местом производительности. Вы можете отфильтровать ненужные обновления, реализовав shouldComponentUpdate(). Это также предотвратит ненужное выполнение функции render().

(обновление) Если первому ребенку нужны только первые результаты вызова ajax, а второму ребенку нужны только результаты второго вызова, вы также можете рассмотреть вопрос о предоставлении каждого дочернего состояния и вызвать каждую функцию из своего соответствующего дочернего элемента.
Таким образом, каждый ребенок обновляется независимо, и вы получаете меньше вызовов визуализации. Количество обновлений DOM останется таким же = минимальным по сравнению с исходным решением.

Если вам НИКОГДА не нужно состояние с результатами только одного вызова ajax, вы можете цепью, как описано.Но это сделает любую ошибку более сложной.

+0

Скажем, loadChildRequestsFromServer() заканчивается первым и меняет состояние. Это то, что берет эти данные и повторно отображает с ним, не будет отображаться, потому что у нас все еще нет данных, необходимых для его рендеринга. React wont touch , так как это было бы ненужным обновлением. После этого loadUserDataFromServer() заканчивается. Не зависит от этих данных, поэтому реакция не коснется его DOM, но делает, поэтому он отображает его. Теперь, если я запустил console.log, он будет только регистрировать вызовы для функции рендеринга, но DOM на самом деле не будет меняют 3 раза. Я понял, что так? – Paran0a

+1

Да. Добавлена ​​еще одна мысль: вы можете рассмотреть вопрос о каждом вызове в соответствующем компоненте. Таким образом, родителям не нужно обновлять 3x, и каждый ребенок обновляет только 2x (начальный + с результатами ajax). – wintvelt

+0

Удивительно, понял! Что бы вы сказали лучше? Чтобы иметь всю функцию ajax в какой-либо родительской области или в каждом отдельном компоненте? У меня все еще не хватает опыта, поэтому трудно понять, какой случай лучше. Первоначально я думал, что было бы хорошо иметь все мои данные, получающие функции в глобальной области, чтобы я мог отправлять данные дочерним компонентам. – Paran0a

Смежные вопросы