【Vue3从零开始-第三章】3-4 vue组件中你不了解的Non-Props属性

简介: 【Vue3从零开始-第三章】3-4 vue组件中你不了解的Non-Props属性

]UWOD(KIB9LJS9~S[T{QHM9.png



前言


上一章的文章中,我们了解了vue组件单项数据流的方式,今天我们继续深入了解一下vue组件中你不了解的Non-Props属性


回顾


通过前面几篇文章的学习,我们知道组件传值的时候,是通过props去接收的,但是当我们在子组件中不使用props中的值时,页面上的DOM元素并不会显示父组件传递过来的属性。


<script>
  const app = Vue.createApp({
    template: `
      <div>
        <hello msg="Juejin" />
      </div>
    `
  });
  app.component('hello', {
    props: ['msg'],
    template: `
      <div>Hello World</div>
    `
  })
  const vm = app.mount('#root');
</script>
复制代码


WC[]6)0RP298UDR68}9XIOK.png


也就是在DOM元素上只有一层又一层的div标签。


Non-Props


疑问❓什么是Non-Props属性呢?


  • 父组件给子组件传递内容的时候,子组件不通过props去接收。


<script>
  const app = Vue.createApp({
    template: `
      <div>
        <hello msg="Juejin" />
      </div>
    `
  });
  app.component('hello', {
    template: `
      <div>Hello World</div>
    `
  })
  const vm = app.mount('#root');
</script>
复制代码


B592N6URY2WQGNL8$N8]2MP.png


把子组件中的props删除之后,在浏览器控制台DOM元素中会发现,子组件Hello World所在的标签上多了一个msg属性,而这个属性正是父组件中写在子组件标签上的。


如果不想在子组件中接收这种Non-Props属性带来的结果,可以在子组件中加上inheritAttrs属性。


app.component('hello', {
    inheritAttrs: false,
    template: `
      <div>Hello World</div>
    `
})
复制代码


A~OYDVFBD]UL(ZPZ[)_AY8V.png


inheritAttrs属性表示子组件不继承父组件中传递过来的Non-Props属性


从上面的案例中会发现,我们子组件中只有一个根元素,那如果子组件中有多个根元素会怎样呢?


  • 在以前的内容中也简单讲过一点点,下面就来详细讲解一下。


app.component('hello', {
    template: `
      <div>Hello</div>
      <div>JueJin</div>
      <div>Bug</div>
    `
})
复制代码


L)B1(4UL]II_DS`KG~@K)%4.png


在浏览器控制台元素中会看到子组件中的标签上好像都没有父组件传递过来的msg属性值。


想要获取到父组件传递过来的属性值,有以下几种方法去实现:


  • v-bind="$attrs"


app.component('hello', {
    template: `
      <div>Hello</div>
      <div v-bind="$attrs">JueJin</div>
      <div>Bug</div>
    `
})


`7NG54V8]))FS]~I[P)Y4[D.png


通过v-bind指令并绑定$attrs值,就会告诉vue底层,我们想要获取父组件中传递过来的属性,并且要放在JueJin所在的div标签上。


这个方法并不只是拿到父组件中的一个属性值,是可以拿到所有属性值的。


const app = Vue.createApp({
    template: `
      <div>
        <hello msg="Juejin" msg1="World" />
      </div>
    `
});
复制代码


7G3IA@2DYML0%@X8(R[6}92.png


  • 在父组件中传递过来的所有属性值都会被v-bind指令中绑定的$attrs所接收。



  • v-bind:xxx="$attrs.xxx"


app.component('hello', {
    template: `
      <div v-bind:msg="$attrs.msg">Hello</div>
      <div v-bind="$attrs">JueJin</div>
      <div>Bug</div>
    `
})
复制代码


[~$@GMM2WHV]HKI`3_5}I39.png


如果想要拿到父组件中的某一个Non-props属性,可以通过$attrs绑定父组件中的Non-Props属性,然后通过v-bind指令绑定到div元素上。


app.component('hello', {
    template: `
      <div v-bind:msg="$attrs.msg">Hello</div>
      <div v-bind="$attrs">JueJin</div>
      <div v-bind:title="$attrs.msg1">Bug</div>
    `
})
复制代码


~9B@FUG]R6Q2MLE69OV)%CR.png


  • v-bind指令绑定的属性名称可以自定义,但是$attrs绑定的Non-Props属性必须是父组件中传递过来的属性名称。



父组件中传递给子组件的Non-Props属性除了可以在子组件的模板中使用,还可以在子组件中的生命周期函数里面使用。


app.component('hello', {
    mounted(){
      console.log('这是mounted生命周期打印的数据:', this.$attrs.msg)
    },
    template: `
      <div v-bind:msg="$attrs.msg">Hello</div>
      <div v-bind="$attrs">JueJin</div>
      <div v-bind:title="$attrs.msg1">Bug</div>
    `
})
复制代码


V)AOP_GZ$BFQ%F2ZDP)15_O.png


在生命周期函数中,我们可以通过this.$attrs获取到父组件传递给子组件的Non-Props属性。


总结


本篇文章主要讲解了vue组件中的Non-Props属性,虽然在实际项目中运用的地方不是很多,但是也需要理解其中的含义和用法。

相关文章
|
10月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
793 2
|
9月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
1185 139
|
9月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
604 1
|
10月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
1079 11
|
9月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
683 0
|
11月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
1110 1
|
11月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
554 0
|
9月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
663 137
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
1341 0
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能