Vue3渲染函数的传参与使用
使用渲染函数和setup标签渲染子组件并传递参数
使用渲染函数
假设有一个子组件Child.vue,它接收一个props叫name,并在模板中显示它:
1 2 3 4 5 6 7 8 9 10 11
| <template> <div>{{ name }}</div> </template>
<script> export default { props: { name: String } } </script>
|
如果想在父组件中使用h()函数来渲染这个子组件,并传递一个name参数,可以这样写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <template> <div id="app"> {{ renderChild }} </div> </template>
<script> import { h } from 'vue' import Child from './components/Child.vue'
export default { data() { return { name: 'Vue3' } }, computed: { renderChild() { return h(Child, { name: this.name }) } } } </script>
|
这样,就可以在页面上看到Child组件渲染出来,并显示name的值
使用setup语法
- 需要在script标签上添加setup属性,表示为setup脚本
- 可以直接使用defineProps()函数来定义props
- 可以直接使用defineEmits()函数来定义emit事件
- 可以直接使用标签来编写模板
基于以上特点,可以将Child.vue重写为:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <template> <div>{{ name }}</div> </template>
<script setup>
const props = defineProps({ name: String })
const { name } = props </script>
|
这样,就可以在子组件中使用name变量,并且不影响父组件中h()函数的使用。
不使用setup语法
- 需要导出一个对象包含props、data、computed等选项
- 需要通过this关键字来访问props中的属性
- 需要导出一个render函数或者使用标签来编写模板
基于以上特点,可以将Child.vue重写为:
1 2 3 4 5 6 7 8 9 10 11
| <script> export default { props: { name: String }, render() { return h('div', this.name) } } </script>
|
或者:
1 2 3 4 5 6 7 8 9 10 11
| <template> <div>{{ name }}</div> </template>
<script> export default { props: { name: String } } </script>
|
这样,就可以在子组件中使用name属性,并且不影响父组件中h()函数的使用。
相关参考文档