一、父->子
1、单层
1、父组件
<template>
<div>
<el-button type="success" @click="change">打开子组件</el-button>
<Screen v-if="open" :name="name"/>
</div>
</template>
<script>
import { ref,reactive } from 'vue'
import Screen from '@/views/screen'
export default {
name: 'Home',
components: {Screen},
setup() {
let open=ref(false)
let name=ref('kimi')
function change(){
name.value='sally'
open.value=true
}
return {
open,
name,
change
}
}
}
</script>
2、子组件
import { ref } from 'vue'
export default {
name: "Screen",
props:{
name:{
type:String,
default:null
}
},
setup(props){
const username=ref(props.name)
return{
username
}
}
}
2、多层
- 父子通信单层使用props、emit,当多层嵌套时,孙子组件获取爷爷组件的值会很麻烦,需要层层传递
- 使用provide、inject可以解决这个问题,无论嵌套多深,所有的子孙组件都可以方便的获取祖籍组件提供的值
1、父组件
<template>
<div>
<Screen />
</div>
</template>
<script>
import { ref,reactive,provide } from 'vue'
import Screen from '@/views/screen'
export default {
name: 'Home',
components: {Screen},
setup() {
let user=reactive({
name: 'kimi',
age: 18
})
provide('user', user)
return {
user
}
}
}
</script>
2、孙子组件
import { inject } from 'vue'
export default {
name: "Screen",
setup(){
const user=inject('user')
return{
user
}
}
}
二、子->父
1、单层
1、父组件
<template>
<div>
<Screen @changeVal="changeVal"/>
</div>
</template>
<script>
import { ref } from 'vue'
import Screen from '@/views/screen'
export default {
name: 'Home',
components: {Screen},
setup() {
let name=ref('kimi')
function changeVal(val){
name.value=val
}
return {
name,
changeVal
}
}
}
</script>
2、子组件
import { ref } from 'vue'
export default {
name: "Screen",
emits: ['changeVal'],
setup(props,{emit}){
function changeParentVal(){
emit('changeVal','tony')
}
return{
changeParentVal
}
}
}