关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

想知道Vue3与Vue2的区别?五千字教程助你快速上手Vue3!(中)

发布时间:2023-06-26 15:00:45

attrs和listeners


子组件使用$attrs可以获得父组件除了props传递的属性和特性绑定属性 (class和 style)之外的所有属性。


子组件使用$listeners可以获得父组件(不含.native修饰器的)所有v-on事件监听器,在Vue3中已经不再使用;但是Vue3中的attrs不仅可以获得父组件传来的属性也可以获得父组件v-on事件监听器

  • 选项式API
//父组件    import Child from './Child' export default {  components:{  Child  },  data(){  return {  msg1:'子组件msg1',  msg2:'子组件msg2'  }  },  methods: {  parentFun(val) {  console.log(`父组件方法被调用,获得子组件传值:${val}`)  }  } } " _ue_custom_node_="true">//子组件   调用父组件方法 export default {  methods:{  getParentFun(){  this.$listeners.parentFun('我是子组件数据')  }  },  created(){  //获取父组件中所有绑定属性  console.log(this.$attrs) //{"msg1": "子组件msg1","msg2": "子组件msg2"}  //获取父组件中所有绑定方法  console.log(this.$listeners) //{parentFun:f}  } } " _ue_custom_node_="true">

   

  • 组合式API
//父组件    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  };  }, }); " _ue_custom_node_="true">//子组件   调用父组件方法 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  };  }, }); " _ue_custom_node_="true">

   

  • setup语法糖
//父组件    import Child from './Child' import { ref } from "vue"; const msg1 = ref('子组件msg1') const msg2 = ref('子组件msg2') const parentFun = (val) => {  console.log(`父组件方法被调用,获得子组件传值:${val}`) } " _ue_custom_node_="true">//子组件   调用父组件方法 import { useAttrs } from "vue"; const attrs = useAttrs() //获取父组件方法和事件 console.log(attrs) //Proxy {"msg1": "子组件msg1","msg2": "子组件msg2"} const getParentFun = () => {  //调用父组件方法  attrs.onParentFun('我是子组件数据') } " _ue_custom_node_="true">

   

注意

Vue3中使用attrs调用父组件方法时,方法前需要加上on;如parentFun->onParentFun


provide/inject


provide:是一个对象,或者是一个返回对象的函数。里面包含要给子孙后代属性

inject:一个字符串数组,或者是一个对象。获取父组件或更高层次的组件provide的值,既在任何后代组件都可以通过inject获得

  • 选项式API
//父组件 import Child from './Child' export default {  components: {  Child  },  data() {  return {  msg1: '子组件msg1',  msg2: '子组件msg2'  }  },  provide() {  return {  msg1: this.msg1,  msg2: this.msg2  }  } } " _ue_custom_node_="true">//子组件 export default {  inject:['msg1','msg2'],  created(){  //获取高层级提供的属性  console.log(this.msg1) //子组件msg1  console.log(this.msg2) //子组件msg2  } } " _ue_custom_node_="true">

   

组合式API

//父组件 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 {   }  }, }); " _ue_custom_node_="true">//子组件   调用父组件方法 import { inject, defineComponent } from "vue"; export default defineComponent({  setup() {  console.log(inject('msg1').value) //子组件msg1  console.log(inject('msg2').value) //子组件msg2  }, }); " _ue_custom_node_="true">

   

  • setup语法糖
//父组件 import Child from './Child' import { ref,provide } from "vue"; const msg1 = ref('子组件msg1') const msg2 = ref('子组件msg2') provide("msg1",msg1) provide("msg2",msg2) " _ue_custom_node_="true">//子组件 import { inject } from "vue"; console.log(inject('msg1').value) //子组件msg1 console.log(inject('msg2').value) //子组件msg2 " _ue_custom_node_="true">

   

说明

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
//父组件    import Child from './Child' export default {  components: {  Child  },  mounted(){  //获取子组件属性  console.log(this.$refs.child.msg) //子组件元素  //调用子组件方法  this.$refs.child.childFun('父组件信息')  } } " _ue_custom_node_="true">//子组件    export default {  data(){  return {  msg:'子组件元素'  }  },  methods:{  childFun(val){  console.log(`子组件方法被调用,值${val}`)  }  } } " _ue_custom_node_="true">

   

  • 组合式API
//父组件    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出去 否则获取不到实例  }  }, }); " _ue_custom_node_="true">//子组件   import { defineComponent, ref } from "vue"; export default defineComponent({  setup() {  const msg = ref('子组件元素')  const childFun = (val) => {  console.log(`子组件方法被调用,值${val}`)  }  return {  msg,  childFun  }  }, }); " _ue_custom_node_="true">

   

  • setup语法糖
//父组件    import Child from './Child' import { ref, onMounted } from "vue"; const child = ref() //注意命名需要和template中ref对应 onMounted(() => {  //获取子组件属性  console.log(child.value.msg) //子组件元素  //调用子组件方法  child.value.childFun('父组件信息') }) " _ue_custom_node_="true">//子组件   import { ref,defineExpose } from "vue"; const msg = ref('子组件元素') const childFun = (val) => {  console.log(`子组件方法被调用,值${val}`) } //必须暴露出去父组件才会获取到 defineExpose({  childFun,  msg }) " _ue_custom_node_="true">

   

注意

通过ref获取子组件实例必须在页面挂载完成后才能获取。

在使用setup语法糖时候,子组件必须元素或方法暴露出去父组件才能获取到



/template/Home/leiyu/PC/Static