#typescript #vue.js #vuex #vuejs3 #vuex4
#typescript #vue.js #vuex #vuejs3 #vuex4
Вопрос:
Я немного новичок в Vue / VueX, поэтому наверняка должно быть что-то, что я не понимаю правильно.
У меня есть очень простой компонент:
- Он извлекает коллекцию элементов из VueX
mapState
(incomputed()
) - Из которого я извлекаю один элемент (
mounted()
в данный момент) - Затем мне нужно вставить этот элемент в шаблон, но я не могу понять это
Насколько я понимаю, мы можем передавать данные в шаблон только из setup
data
методов or, но не из mounted
, created
хуков и т. Д. Правильно ли это звучит?
В следующем примере кода, как я могу отправить item
объект, который я получаю из items
in mounted()
, в шаблон?
Я не могу сделать все setup
это, поскольку мой computed()
items
объект VueX там еще недоступен. Есть предложения о том, как правильно достичь этой простой цели?
<template>
<p>ID: {{ id }}</p>
<p>Name:: {{ item.name }}</p>
</template>
<script lang="ts">
import { useRoute } from 'vue-router'
import { ref, computed, watch } from 'vue'
import { mapState, mapActions } from 'vuex'
export default {
// fetching items from vuex (works)
computed: mapState({
items: (state: any) => state.items
}),
setup() {
const route = useRoute()
// parsing ID from route params (works)
const id = ref(route.params.id || 'Plants')
return {
id,
// this seems to be the proper way of pushing data to template:
// item: { name: 'this works from here' }
}
},
mounted() {
// fetch item by id (works)
const item: Plant = this.items.find(i => i.id === this.id)
// TODO: I need to push this to the template but I cannot from here
return { item }
}
}
</script>
Ответ №1:
Лучший способ для этого случая определить другое вычисляемое свойство, например :
export default {
computed:{ ...mapState({//should spread the mapState in order to add other properties
items: (state: any) => state.items
}),
item(){
const _item: Plant = this.items.find(i => i.id === this.id)
return _item;
}
},
setup() {
const route = useRoute()
// parsing ID from route params (works)
const id = ref(route.params.id || 'Plants')
return {
id,
}
},
}
или используйте только api опций :
export default {
computed:{ ...mapState({//should spread the mapState in order to add other properties
items: (state: any) => state.items
}),
item(){
let id=this.$route.params.id || 'Plants'
const _item: Plant = this.items.find(i => i.id === id)
return _item;
}
},
}
и
<template>
<p>ID: {{ $route.params.id }}</p>
<p>Name:: {{ item.name }}</p>
</template>
Комментарии:
1. Именно то, что я искал! Большое спасибо!
2. пожалуйста, всегда старайтесь не изменять данные между options api и setup, используйте composition api только для сложных ситуаций и для повторно используемой логики, для простых свойств используйте только option api