typescript - Získat vlastnosti z referenční šablony
Je možné získat vlastnosti komponenty Vue pomocí odkazového ref ve šabloně? Mohu použít defineExpose, ale zajímá mě, jestli existuje jiné řešení. Používám Vue 3 Composition API.
<script setup lang="ts">
const childRef = ref()
const foo = () => {
console.log(childRef.value.someData)
}
</script>
<template>
<Child ref="childRef" some-data="my special data" />
</template>
<style scoped lang="scss"></style>
Odpověď č. 1
Přidání další odpovědi pomocí API defineExpose.
Nejprve je potřeba zpřístupnit vlastnosti dětské komponenty, ke kterým chcete v rodičovské komponentě přistupovat pomocí metody ref.
Ve vašem případě, pokud chcete přistupovat k vlastnostem (props) dětské komponenty, musíte tyto vlastnosti zpřístupnit pomocí API defineExpose.
Child.vue<script setup lang="ts">
import { defineExpose } from "vue";
const props = defineProps({
someData: String
})
defineExpose({
props,
})
</script>
<template>
{{ someData }}
</template>
<style scoped lang="scss"></style>
parent.vue<template>
<Child ref="childRef" some-data="my special data" /><br><br>
<v-btn @click="foo">Access Child Component Properties</v-btn>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import Child from './Child.vue'
const childRef = ref()
const foo = () => {
console.log(childRef.value?.props?.someData)
}
</script>
Zde je funkční ukázka.
Odpověď č. 2
Jedním z přístupů je použít API defineComponent a přiřadit childRef šablonový ref komponentě Child pomocí atributu ref. Například-
const childRef = ref<typeof Child>()
Také potřebujeme importovat komponentu Child pomocí funkce defineComponent, abychom k ní mohli přistupovat v možnosti components.
parent.vue<template>
<Child ref="childRef" some-data="my special data" /><br><br>
<v-btn @click="foo">Access Child Component Properties</v-btn>
</template>
<script setup lang="ts">
import { ref, defineComponent } from 'vue'
import Child from './Child.vue'
const childRef = ref<typeof Child>()
const foo = () => {
console.log(childRef.value?.someData)
}
defineComponent({
components: {
Child,
},
setup() {
return {
childRef,
foo
}
},
})
</script>
child.vue<script setup lang="ts">
const props = defineProps({
someData: String
})
</script>
<template>
{{ someData }}
</template>
<style scoped lang="scss"></style>
Zde je funkční ukázka.
