Vue 3 Повторная загрузка компонента при изменении переменной

Я пытаюсь восстановить компонент, если selectedLeague был изменен

<label class = "label">Select league</label>
<div class = "selector">
  <v-select
      v-model = "selectedLeague"
      :dropdown-should-open = "dropdownShouldOpen"
      :options = "leagues"
      label = "displayLeague"
      placeholder = "Select a league"
  />
</div>

<div v-if = "selectedLeague">
  <LeagueTopScorers :is = "selectedLeague" :selectedLeague = "selectedLeague.id.toString()" />
</div>

В компоненте LeagueTopScorers я получаю API, чтобы получить лучших бомбардиров из выбранной лиги.

Я пробовал :watch, v-on:, created()

Вы пытаетесь получить и отобразить новые данные после выбора? Поскольку истинная перезагрузка компонента не сохранит выбор, он вернется к значению по умолчанию перед выбором. Кроме того, ваше использование :is не является правильным синтаксисом.

Tim 11.11.2022 23:59

Я пытаюсь передать новую переменную в свой компонент, который должен извлекать данные и отображать их в моем родительском компоненте.

Remik00 12.11.2022 00:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
149
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

<LeagueTopScorers /> перерисовывается, когда selectedLeague изменяется 1, но не перемонтируется. Он монтируется только тогда, когда selectedLeague меняется с ложного значения на истинное (потому что именно тогда изменяется значение v-if).

Есть несколько проблем с вашим вопросом:

  • вы спрашиваете о техническом аспекте (назовем его X), который, по вашему мнению, решит бизнес-требование (назовем его Y). Это классическая проблема XY. Почему бы вам не описать требование Y? (например: чего вы хотите достичь). Какое изменение вывода вы хотите увидеть при изменении ввода?
  • размещенного вами кода недостаточно для создания работающего примера. Мы не знаем, что такое v-select, что такое <LeagueTopScorers /> или как :is выглядит на <LeagueTopScorers />.

Из фрагмента, который вы разместили, я предполагаю следующее:

  • v-select — это либо vue-select , либо Vuetify select component
  • вы ожидаете, что :is будет работать над <LeagueTopScorers /> так же, как и над <component />. Подсказка: это не так, если только вы не закодировали это сами, в чем я сомневаюсь
  • последнее, но не менее важное: я думаю, вы хотите, чтобы какой-то код, который вы поместили в хук жизненного цикла инициализации <LeagueTopScorers /> (например, onMounted), запускался, когда вы заменяете объект, хранящийся в selectedLeague, другим объектом.

Если я прав, самый простой и чистый способ добиться такого поведения — создать вычисляемый 2:

const leagueId = computed(() => selectedLeague?.id.toString() || '')

... и используйте его в v-if, :key и :selectedLeague:

<LeagueTopScorers
  v-if = "leagueId"
  :selectedLeague = "leagueId"
  :key = "leagueId" />

(без обертки <div v-if>).

Приведенное выше будет создавать новый экземпляр <LeagueTopScorers /> каждый раз, когда leagueId изменяется, и будет отображать его только тогда, когда leagueId не является ложным. Я считаю, что это то, чего вы пытались достичь технически 3.


Примечания:
1 - для проверки используйте onUpdated(() => console.info('updated...'))
2 - используйте selectedLeague.value?.id.toString(), если selectedLeague является ref
3 — в то же время я уверен, что фактические бизнес-требования могут быть выполнены без создания нового экземпляра <LeagueTopScorers /> каждый раз, когда leagueId изменяется, но я не могу помочь без дополнительных деталей и/или контекста.

Вью выберите. dropdown-should-open не является реквизитом Vuetify. Также может быть ошибка при передаче реквизита от родителя к дочернему, на основании комментария автора.

Tim 12.11.2022 02:24

Большое спасибо, хороший ответ. Это решило мою проблему.

Remik00 16.11.2022 00:37

Рад, что это помогло вам. Попробуйте отметить его как принятый, если он помог вам решить проблему. Если вы считаете, что это недостаточно актуально для вашей реальной проблемы, рассмотрите возможность добавления своего собственного, где вы более четко объясните, в чем заключалась проблема и как вы ее устранили, и пометьте это как принятое. В идеале ваш вопрос (и принятый ответ) должен помочь другим пользователям легко найти решение аналогичной проблемы.

tao 16.11.2022 10:33

Можешь взглянуть на мою большую проблему? Это похоже на это, но в другом случае. stackoverflow.com/questions/74468482/…

Remik00 17.11.2022 00:33

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