Обновление props из дочернего компонента. Vue.js
Есть цикл, который обходит все элементы из массива в vuex. Выводит компонент с props: <card :city="city">.
В данном компоненте я вызываю метод update(), который делает запрос к API и в ответ я получаю данные, как эти данные использовать внутри компонента <card>, если начальное значение (props) уже передано ?
Пробую через emit, но не работает, хотя ивент отрабатывает как надо
Page:
</template>
<transition-group name="fade-translate" tag="div" class="grid">
<Card :city="city" v-for="city in cities" :key="city.id" @update="update(city, $event)"/>
</transition-group>
</template>
<script>
methods: {
update (city, event) {
city = event
},
},
computed: {
...mapGetters(['cities', 'error'])
},
</script>
Component:
<template>
....
<div class="control">
<button
type="button"
class="button is-text is-small has-text-link"
@click="update(city)"
>Update</button>
</div>
....
</template>
<script>
export default {
props: ['city'],
methods: {
async update (city) {
const { data } = await $api.get('/weather', {
params: {
id: city.id,
units: 'metric',
appid: API_KEY
}
})
this.$emit('update', data)
}
}
}
</script>
Ответы (1 шт):
Автор решения: bonusrk
→ Ссылка
Варианты есть :)
- "адовый брутфорс" - по эмиту перезапрашивать весь список. (Удобный, дорогой, тяжёлый вариант. А вес -это надёжность). "
- "пусть никто потом концов не найдет" - копировать пропсы в стейт на маунте потомков, и по апдейту не эмитить а обновлять Стейт.
- "зачем я это делаю" - вынести запрос в родителя, эмитить из потомка, передавая айди/индекс элемента, и потом по получению результата весело его апдейтить в вуэксе, перебирая этот список в поисках по индексу/айди :)
- "не зря вуэкс завезли" - вместо эмита диспатчить/комитить экшен/мутацию в стор, где опять менять элемент