在vue3中父组件访问子组件中的属性和方法是需要借助于ref:
1.<script setup> 中定义响应式变量 例如: const demo1 = ref(null)
2.在引入的子组件标签上绑定ref属性的值与定义的响应式变量同名( <demo1 ref="demo1"/>)。
父组件代码如下:
|----------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <template>
``<demo1 ref=``"demo1"``/>
``<demo2 ref=``"demo2"``/>
``<demo3 ref=``"demo3"``/>
</template>
<script setup>
import Demo1 from ``'@/components/demo1.vue'
import Demo2 from ``'@/components/demo2.vue'
import Demo3 from ``'@/components/demo3.vue'
import {ref,onMounted} from ``'vue'
const demo1 = ref(``null``)
const demo2 = ref(``null``)
const demo3 = ref(``null``)
onMounted(()=> {
``console.log(demo1.value.count,``'demo1子组件'``)
``console.log(demo2.value?.a,``'demo2子组件'``)
``console.log(demo3.value.list[0],``"demo3子组件"``)
})
</script>
|
子组件代码如下:
demo1.vue
|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <template>
``<h1>i``'m demo1 content{``{count}}</h1>
</template>
<script >
import {ref} from '``vue'
export ``default
{
``setup () {
``const count = ref(999)
``return
{
``count
``}
``}
}
|
此时父组件可以获取到子组件的count属性(此时子组件用的是 export default 的写法)
demo2
|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 | <template>
``<h1>我是demo2</h1>
</template>
<script setup>
import {defineExpose,ref} from ``'vue'
const a = ref(``'helloss'``)
</script>
|
当使用 <script setup>
写法会导致父组件无法访问到子组件中的属性和方法。
使用
<script setup>
的组件,想要让父组件访问到它的属性和方法需要借助与defineExpose
来指定需要暴露给父组件的属性。
更改后的demo2组件
|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 | <template>
``<h1>我是demo2</h1>
</template>
<script setup>
import {defineExpose,ref} from ``'vue'
const a = ref(``'helloss'``)
defineExpose({
``a
})
</script>
|
demo3
|----------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <template>
``<h1>我是demo3</h1>
</template>
<script>
export ``default
{
``data () {
``return
{
``list:[``'a'``,``'b'``,``'c'``]
``}
``},
``methods: {
``btn () {
``}
``}
}
|
这种方式,父组件可以正常获取到里面的属性和方法。