想知道Vue3与Vue2的区别?五千字教程助你快速上手Vue3!(中)
导读:attrs和listeners子组件使用$attrs可以获得父组件除了props传递的属性和特性绑定属性 (class和 style 之外的所有属性。子组件使用$listeners可以获得父组件(不含.native修饰器的 所有v-on事件...
attrs和listeners
子组件使用$attrs可以获得父组件除了props传递的属性和特性绑定属性 (class和 style)之外的所有属性。
子组件使用$listeners可以获得父组件(不含.native修饰器的)所有v-on事件监听器,在Vue3中已经不再使用;但是Vue3中的attrs不仅可以获得父组件传来的属性也可以获得父组件v-on事件监听器
- 选项式API
//父组件 template> div> Child @parentFun="parentFun" :msg1="msg1" :msg2="msg2" /> /div> /template> script> import Child from './Child' export default { components:{ Child } , data(){ return { msg1:'子组件msg1', msg2:'子组件msg2' } } , methods: { parentFun(val) { console.log(`父组件方法被调用,获得子组件传值:${ val} `) } } } /script> //子组件 template> div> button @click="getParentFun"> 调用父组件方法/button> /div> /template> script> export default { methods:{ getParentFun(){ this.$listeners.parentFun('我是子组件数据') } } , created(){ //获取父组件中所有绑定属性 console.log(this.$attrs) //{ "msg1": "子组件msg1","msg2": "子组件msg2"} //获取父组件中所有绑定方法 console.log(this.$listeners) //{ parentFun:f} } } /script>
- 组合式API
//父组件 template> div> Child @parentFun="parentFun" :msg1="msg1" :msg2="msg2" /> /div> /template> script> import Child from './Child' import { defineComponent,ref } from "vue"; export default defineComponent({ components: { Child } , setup() { const msg1 = ref('子组件msg1') const msg2 = ref('子组件msg2') const parentFun = (val) => { console.log(`父组件方法被调用,获得子组件传值:${ val} `) } return { parentFun, msg1, msg2 } ; } , } ); /script> //子组件 template> div> button @click="getParentFun"> 调用父组件方法/button> /div> /template> script> import { defineComponent } from "vue"; export default defineComponent({ emits: ['sendMsg'], setup(props, ctx) { //获取父组件方法和事件 console.log(ctx.attrs) //Proxy { "msg1": "子组件msg1","msg2": "子组件msg2"} const getParentFun = () => { //调用父组件方法 ctx.attrs.onParentFun('我是子组件数据') } return { getParentFun } ; } , } ); /script>
- setup语法糖
//父组件 template> div> Child @parentFun="parentFun" :msg1="msg1" :msg2="msg2" /> /div> /template> script setup> import Child from './Child' import { ref } from "vue"; const msg1 = ref('子组件msg1') const msg2 = ref('子组件msg2') const parentFun = (val) => { console.log(`父组件方法被调用,获得子组件传值:${ val} `) } /script> //子组件 template> div> button @click="getParentFun"> 调用父组件方法/button> /div> /template> script setup> import { useAttrs } from "vue"; const attrs = useAttrs() //获取父组件方法和事件 console.log(attrs) //Proxy { "msg1": "子组件msg1","msg2": "子组件msg2"} const getParentFun = () => { //调用父组件方法 attrs.onParentFun('我是子组件数据') } /script>
注意
Vue3中使用attrs调用父组件方法时,方法前需要加上on;如parentFun-> onParentFun
provide/inject
provide:是一个对象,或者是一个返回对象的函数。里面包含要给子孙后代属性
inject:一个字符串数组,或者是一个对象。获取父组件或更高层次的组件provide的值,既在任何后代组件都可以通过inject获得
- 选项式API
//父组件 script> import Child from './Child' export default { components: { Child } , data() { return { msg1: '子组件msg1', msg2: '子组件msg2' } } , provide() { return { msg1: this.msg1, msg2: this.msg2 } } } /script> //子组件 script> export default { inject:['msg1','msg2'], created(){ //获取高层级提供的属性 console.log(this.msg1) //子组件msg1 console.log(this.msg2) //子组件msg2 } } /script>
组合式API
//父组件 script> import Child from './Child' import { ref, defineComponent,provide } from "vue"; export default defineComponent({ components:{ Child } , setup() { const msg1 = ref('子组件msg1') const msg2 = ref('子组件msg2') provide("msg1", msg1) provide("msg2", msg2) return { } } , } ); /script> //子组件 template> div> button @click="getParentFun"> 调用父组件方法/button> /div> /template> script> import { inject, defineComponent } from "vue"; export default defineComponent({ setup() { console.log(inject('msg1').value) //子组件msg1 console.log(inject('msg2').value) //子组件msg2 } , } ); /script>
- setup语法糖
//父组件 script setup> import Child from './Child' import { ref,provide } from "vue"; const msg1 = ref('子组件msg1') const msg2 = ref('子组件msg2') provide("msg1",msg1) provide("msg2",msg2) /script> //子组件 script setup> import { inject } from "vue"; console.log(inject('msg1').value) //子组件msg1 console.log(inject('msg2').value) //子组件msg2 /script>
说明
provide/inject一般在深层组件嵌套中使用合适。一般在组件开发中用的居多。
parent/children
$parent: 子组件获取父组件Vue实例,可以获取父组件的属性方法等
$children: 父组件获取子组件Vue实例,是一个数组,是直接儿子的集合,但并不保证子组件的顺序
- Vue2
import Child from './Child' export default { components: { Child } , created(){ console.log(this.$children) //[Child实例] console.log(this.$parent)//父组件实例 } }
注意父组件获取到的$children
并不是响应式的
expose& ref
$refs可以直接获取元素属性,同时也可以直接获取子组件实例
- 选项式API
//父组件 template> div> Child ref="child" /> /div> /template> script> import Child from './Child' export default { components: { Child } , mounted(){ //获取子组件属性 console.log(this.$refs.child.msg) //子组件元素 //调用子组件方法 this.$refs.child.childFun('父组件信息') } } /script> //子组件 template> div> div> /div> /div> /template> script> export default { data(){ return { msg:'子组件元素' } } , methods:{ childFun(val){ console.log(`子组件方法被调用,值${ val} `) } } } /script>
- 组合式API
//父组件 template> div> Child ref="child" /> /div> /template> script> import Child from './Child' import { ref, defineComponent, onMounted } from "vue"; export default defineComponent({ components: { Child } , setup() { const child = ref() //注意命名需要和template中ref对应 onMounted(() => { //获取子组件属性 console.log(child.value.msg) //子组件元素 //调用子组件方法 child.value.childFun('父组件信息') } ) return { child //必须return出去 否则获取不到实例 } } , } ); /script> //子组件 template> div> /div> /template> script> import { defineComponent, ref } from "vue"; export default defineComponent({ setup() { const msg = ref('子组件元素') const childFun = (val) => { console.log(`子组件方法被调用,值${ val} `) } return { msg, childFun } } , } ); /script>
- setup语法糖
//父组件 template> div> Child ref="child" /> /div> /template> script setup> import Child from './Child' import { ref, onMounted } from "vue"; const child = ref() //注意命名需要和template中ref对应 onMounted(() => { //获取子组件属性 console.log(child.value.msg) //子组件元素 //调用子组件方法 child.value.childFun('父组件信息') } ) /script> //子组件 template> div> /div> /template> script setup> import { ref,defineExpose } from "vue"; const msg = ref('子组件元素') const childFun = (val) => { console.log(`子组件方法被调用,值${ val} `) } //必须暴露出去父组件才会获取到 defineExpose({ childFun, msg } ) /script>
注意
通过ref获取子组件实例必须在页面挂载完成后才能获取。
在使用setup语法糖时候,子组件必须元素或方法暴露出去父组件才能获取到
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 想知道Vue3与Vue2的区别?五千字教程助你快速上手Vue3!(中)
本文地址: https://pptw.com/jishu/340481.html