vue3.js
总结: 此处涉及的vue3新特性<br /> 1, vue3中的组件使用字面量对象创建<br /> 2, vue3中的组件不能直接在父组件使用,需要在父组件components字段中定义后,方可使用<br /> 3, vue3中组件支持多个根标签<br /> 4, setup函数的第一个参数props用于接收父组件传值<br /> 5, setup函数的第二个参数context.emit用于向父组件传值<br /> 6, 子组件发射的自定义事件需要在emits字段中提前声明<br /> 7, 组件发射的自定义事件名,定义时可用小驼峰,绑定时用小写<br /> 8, 组件标签上没有在props中声明的属性会被传入context.attrs中<br /> 9, 在vue3中组件传值, 插槽传值, props属性传值, emit事件传值和vue2结构原理基本一致, 但vue3不能用总线传值
<body>
<script src='./vue3.js'></script>
<div id='myApp'>
<!-- 子传父发射的自定义事件名可以是小驼峰,绑定时用小写 -->
<my-com :child-arr="fatherArr" @my-event="getData" myid="250">
<i>插槽数据</i>
</my-com>
</div>
<template id="com">
<div>
子组件 : <slot>插槽传值和vue2一样</slot>
<ul>
<li v-for="item in childArr">{{item}}</li>
</ul>
</div>
<!-- vue2要求组件模板有且仅有一个根标签, vue3支持多个根标签 -->
<slot></slot>
<div v-for="item in childArr">{{item}}</div>
</template>
<script>
// vue2创建组件的写法, 在vue3中已废除
// Vue.component("myCom",{ template: "<h1></h1>" })
// vue3中直接用字面量对象创建组件
var myCom = {
template: "#com",
props: ['childArr'],
// vue3中要求组件发射的自定义事件,在emits字段中声明
emits: ["myEvent"],
setup(props, context) {
// setup第一个参数是props自定义属性所在的对象
console.log(this, props, props.childArr[0])
// setup第二个参数是context上下文信息对象, 他不是组件对象this, 但可以用它进行发射自定义事件
console.log(context, context.attrs.myid)
// 组件标签上没有在props中声明的属性会被传入context.attrs中
// vue3发射的自定义事件名支持大写
context.emit("myEvent", "子组件发送的数据")
}
}
var vm = {
// vue3要求子组件必须在父组件的components中定义才能使用
components: {
myCom
},
setup() {
var fatherArr = Vue.reactive(['a','b','c','d'])
function getData(data){
console.log("子传父:", data)
}
return {
fatherArr, getData
}
}
}
Vue.createApp(vm).mount('#myApp')
</script>
</body>