Данные Vue JS — реквизитов не обновляются в дочернем элементе при использовании асинхронной функции

#javascript #vue.js #vue-props

#язык JavaScript #vue.js #vue-реквизит

Вопрос:

Я относительно новичок в Vue JS, но чувствую, что относительно хорошо разбираюсь в иерархии компонентов. Просто столкнулся здесь с проблемой, которая меня немного смущает и на самом деле не соответствует моему пониманию того, что props следует делать.

В моем родительском компоненте у меня есть вызываемый data атрибут loading , который инициализируется как true . У меня также есть вызываемый атрибут dataItems , который инициализируется как null , но заполняется асинхронным методом, вызывающим API. В точке, в которой dataItems успешно заполнено, loading также должно быть установлено значение false. Этот вызов API выполняется внутри mounted функции.

Все работает так, как ожидалось на родительском уровне, но передача этих двух атрибутов дочернему компоненту (через реквизиты), похоже, только передает их начальное состояние ( true и null , соответственно) и никогда не обновляет их.

В качестве краткого примера я добавил несколько lt;pgt; тегов как к родительскому, так и к дочернему компонентам для вывода данных, вот сокращенный HTML и JS, которые я использовал.

Родительский компонент:

 lt;templategt;  lt;pgt;Loading: {{loading}}lt;/pgt; // outputs Loading: false  lt;pgt;dataItems: {{dataItems}}lt;/pgt; //outputs JSON string  lt;ChildComponent :loading="loading" :dataItems="dataItems" /gt; lt;/templategt;  lt;scriptgt;  data: function() {  loading: true  dataItems: null  },  methods: {  getDataItems: async function() {  //.. make API call  this.dataItems = response.data  loading = false  }  },  mounted: function() {  this.getDataItems()  } lt;/scriptgt;  

Дочерний компонент:

 lt;templategt;  lt;pgt;Loading: {{loading}}lt;/pgt; // outputs Loading: true  lt;pgt;dataItems: {{dataItems}}lt;/pgt; //no output lt;/templategt;  lt;scriptgt;  props: ["loading", "dataItems"],  data: function() {  loading: this.loading  dataItems: this.dataItems  }, lt;/scriptgt;  

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

 Loading: false // from parent dataItems: {"someJsonString"} // from parent Loading: true // from child  //from child  

Я не понимаю, почему передаваемые данные не обновляются, так как я вроде как понял, что в этом суть Vue. Как я уже сказал, я относительно новичок в этой системе, так что есть вероятность, что я совершил простую ошибку.

Если кто-нибудь может подсказать мне правильное направление, я был бы очень признателен!

Спасибо

Ответ №1:

ваш код верен, но, похоже, подход, который вы решили реализовать, props не подходит для этой ситуации.

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

Теперь я вижу, что цель вашего дочернего компонента-показывать только информацию, которую отправляет родитель (с помощью реквизитов). Таким образом, вы можете напрямую получить доступ из своего шаблона к значениям реквизитов, которые являются ссылками (они являются реактивными).

Дочерний компонент, получающий доступ к реквизитам в шаблоне:

 lt;templategt;  lt;pgt;Loading: {{ loading }}lt;/pgt;  lt;pgt;dataItems: {{ dataItems }}lt;/pgt; lt;/templategt;  lt;scriptgt;  props: ["loading", "dataItems"],  data: function() {  // Use the props directly in your template  }, lt;/scriptgt;  

Комментарии:

1. Спасибо за это, я приму во внимание ваш комментарий об архитектуре!