typescript - Hämta props från templatreferens


Är det möjligt att få egenskaperna hos en Vue-komponent via en template-ref? Jag skulle kunna använda defineExpose men jag är intresserad av om det finns en annan lösning. Jag använder 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>

Svar #1

Lägger till ett annat svar med hjälp av defineExpose-API:et.

Först behöver du exponera egenskaperna hos barnkomponenten som du vill få åtkomst till i föräldrakomponenten via ref-metoden.

I ditt fall, eftersom du vill få åtkomst till egenskaperna hos barnkomponenten, behöver du exponera egenskaperna med defineExpose-API:et.

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>

Här är en fungerande demo.

Svar #2

Ett sätt är att använda defineComponent-API:et och binda childRef-mallreferensen till Child-komponenten med hjälp av ref-attributet. Till exempel-

const childRef = ref<typeof Child>()

Vi behöver också importera Child-komponenten med defineComponent-funktionen så att vi kan använda den i komponentalternativet.

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>

Här är en fungerande demo.

Relaterade artiklar