1. 参数 props
props是一个对象,蕴含父组件传递给子组件的所有数据。在子组件中应用 props 进行接管。蕴含配置申明并传入的所有的属性的对象。
也就是说,如果你想通过 props 的形式输入父组件传递给子组件的值。你须要应用 props 进行接管配置。即 props:{……}。如果你未通过 Props 进行承受配置,则输入的值是 undefined
<template>
<div class="box">
父组件
</div>
<no-cont :mytitle="msg"
othertitle="他人的题目"
@sonclick="sonclick">
</no-cont>
</template>
<script lang="ts">
import NoCont from "../components/NoCont.vue"
export default {setup () {
let msg={title:'父组件给子给子组件的数据'}
function sonclick(msss:string){console.log(msss)
}
return {msg,sonclick}
},
components:{NoCont}
}
</script>
为什么通过 props.mytitle 输入的值是 undefined 呢?
因为咱们没有应用 props 进行接管配置。即
props:{
mytitle:{type:Object}
}
2. 参数 context
第 2 个参数:context,是一个对象。外面有 attrs(获取以后标签上的所有属性的对象)。然而该属性是 props 中没有申明接管的所有的对象。如果你应用 props 去获取值,同时 props 中你申明了你要获取的值,则:获取的值是 undefined
留神点:
attrs获取值是不须要 props 中没有申明接管。第 1 个参数 props 获取值是须要 props 中申明接管的。有 emit 事件散发(传递给父组件须要应用该事件)
<template>
<div @click="sonHander">
我是子组件中的数据
</div>
</template>
<script lang="ts">
import {defineComponent,setup} from 'vue';
export default defineComponent({
name: 'NoCont',
props:{
mytitle:{type:Object}
},
setup(props,context){// 输入{title: 父组件传递的值}
console.log('props==>',props.mytitle);
// 输入他人的题目【应用 context 获取值,不须要应用 props 去承受】console.log('context==>',context.attrs.othertitle);
// 输入 undefined,因为 context 不须要应用 props 去承受。console.log('contextmytitle==>',context.attrs.mytitle);
function sonHander(){context.emit('sonclick','子组件传递给父组件')
}
return {sonHander}
}
});
</script>
3. 子组件向父组件派发事件
<template>
<div @click="sonHander">
我是子组件中的数据
</div>
</template>
<script lang="ts">
import {defineComponent,setup} from 'vue';
export default defineComponent({
name: 'NoCont',
props:{
mytitle:{type:Object}
},
setup(props,context){function sonHander(){context.emit('sonclick','子组件传递给父组件')
}
return {sonHander}
}
});
</script>
4. 优化事件派发
咱们晓得第 2 个参数 context 是一个对象,并且对象中有三个属性attrs,slots,emit,在事件派发的时候,间接应用 emit 就 ok 了
<template>
<div @click="sonHander">
我是子组件中的数据
</div>
</template>
<script lang="ts">
import {defineComponent,setup} from 'vue';
export default defineComponent({
name: 'NoCont',
props:{
mytitle:{type:Object}
},
setup(props,{attrs,slots,emit}){
// 间接应用 emit 进行事件派发
function sonHander(){emit('sonclick','子组件传递给父组件')
}
return {sonHander}
}
});
</script>
5. 获取父组件传递的值
咱们将应用 props 参数获取值,以及应用 attrs 获取值
<template>
<hr/>
<h2> 子组件 </h2>
<div @click="sonHander">
我是子组件中的数据
</div>
<h2> 应用了 props 申明接管 ==>{{mytitle}}</h2>
<h2> 应用参数 attrs 获取 ==>{{attrs.othertitle}}</h2>
</template>
<script lang="ts">
import {defineComponent,setup} from 'vue';
export default defineComponent({
name: 'NoCont',
props:{
mytitle:{type:Object}
},
setup(props,{attrs,slots,emit}){function sonHander(){emit('sonclick','子组件传递给父组件')
}
return {sonHander,attrs}
}
});
</script>
附应用 setup 函数时须要留神几点:
- setup函数的执行机会是在 beforeCreate 和created之间
- 因为 setup 执行机会是在 created 之间,所以组件才刚刚被创立,而 data 和methods还没初始化好,所以无奈在 setup 中应用 data 和methods
- setup中 this 指向undefined
- setup只能是同步的,不能是异步的