知识点!知识点!!知识点!!!
例子使用组合式Api的写法。
父传子
1.props方式
父组件
// addUserDialog是导入的子组件
// :dialogTitle = 'dialogTitle' 写法与vue2一样
<addUserDialog
v-model="dialogFormVisible"
v-if="dialogFormVisible"
:dialogTitle = 'dialogTitle'
:dialogRowValue = 'dialogRowValue'
@initUserList = 'initGetUserList'/>
子组件
// 需要引入defineProps
import { defineProps } from 'vue'
// 定义一个变量拿到父组件传来的值
const props = defineProps({
dialogTitle: {
type: String,
default: '',
required: true
},
dialogRowValue: {
type: Object,
default: () => {}
}
})
// 使用:props.xxx即可拿到数据
console.log(props.dialogRowValue)
2.Provide / Inject
他两为依赖注入
Provide:指定提供给后代的数据
Inject:作为后代接收数据,不管有多少层都可以拿来使用
父组件
import { provide } from 'vue'
provide('name','张三')
后代组件
<script setup>
import { inject } from 'vue'
const name = inject('name')
console.log(name) // 张三
</script>
3.expose/ref
官方文档上说: expose:一个将暴露在公共组件实例上的 property 列表。
为了在 <script setup> 组件中明确要暴露出去的属性,使用 defineExpose
// 子组件
import { defineExpose } from 'vue'
defineExpose({
name:'子组件属性',
selectList() {
console.log('子组件方法')
}
})
// 父组件
<template>
<child ref="childcomp"/>
</template>
import { ref } from 'vue'
const childcomp = ref(null)
const clickBtn = () => {
console.log(childcomp.value.name) // 得到子组件属性
comp.value.selectList() // 得到子组件方法
}
子传父
1. emit方式和v-model的方式
在v-model的方式中 update:xxx是固定的写法 子组件
// 需要引入defineEmits
import { defineEmits } from 'vue'
// emit自定义事件,并传值或者不传值
const emits = defineEmits(['update:modelValue', 'initUserList'])
const handleClose = () => {
// v-model的方式
emits('update:modelValue', false)
}
// emit方式
emits('initUserList')
父组件
<addUserDialog
v-model="dialogFormVisible" // v-model
v-if="dialogFormVisible"
:dialogTitle = 'dialogTitle'
:dialogRowValue = 'dialogRowValue'
@initUserList = 'initGetUserList'/> // 接收事件
const initGetUserList = async () => {
const res = await getUserList(queryInfo.value)
tableData.value = res.rows
total.value = res.total
}
兄弟组件
在vue3中已经移除了事件总线。(虽然不推荐,但是简单粗暴,老爱用它。)
我目前想到的就是状态管理工具,Vuex和Pinia。比较复杂,有时间单独补补课。