Vue3的ref属性、expose属性、emits属性

120 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情juejin.cn/post/714765… 今天学习了在组件上如何使用ref属性,

模板引用ref属性

  • 讲的就是通过ref可以访问真实的节点。然后就可以通过this.$refs.ref属性值访问真实的DOM。
  • 注意:只能在组件挂载后方能访问引用。因为初次渲染时回事null,DOM还没有加载成。
  • 在v-for的元素上绑定ref=‘items’,访问this.$refs.items,它的值是个数组
  • ref数组并不保证与源数组顺序相同。

组件上使用ref属性

得到的就是组件实例。那么父组件就对子组件的属性和方法都有完全的访问权。但是建议慎用这种方法。否则会形成强耦合,父子组件无法分离使用。

子组件上的exposedefineExpose属性

给子组件添加ref属性,父组件可以访问子组件任何东西,可以通过给子组件添加expose属性。值为数组,成员是当前组件里的属性和方法,那么父组件只能访问该数组里规定的属性和方法。

import {expose/defineExpose ,ref , reactive} from 'vue'
const a=ref(1)
const b=reactive( [1,2,3] )

expose:{
  a,
  b
}
defineExpose({a})

事件

子向父传:利用自定义事件,组件触发的自定义事件没有冒泡机制。

emits属性

声明触发的事件

如果自定义事件和原生事件名相同,例如:子组件做了点击事件,不会经过this.$emit方法,而是直接把子组件身上自定义事件的事件对象存到了父组件的data上。

如何解决自定义事件名与原生事件同名现象呢?

  1. viewModel里添加emits属性,值为数组:第一个参数是事件名。
  2. 还可以对传的自定义参数进行验证。这时就要设置emits的值为对象,属性值为函数,该函数接收参数,就是this.$emit()传给父组件的参数

父组件中的代码:

父.png

子组件中的代码

子.png

如果子组件不添加emits属性的话,----后面输出的就是事件对象,页面显示效果如下:

3.png