首页 > 其他分享 >Vue2+Vue3 - $attrs 的几种用法(1个或多个根元素、Options API 和 Composition API)

Vue2+Vue3 - $attrs 的几种用法(1个或多个根元素、Options API 和 Composition API)

时间:2022-12-02 09:25:44浏览次数:45  
标签:vue API ChildCom Vue2 props msg attrs

使用 Vue 开发时,肯定会接触到 组件 的概念,无可避免的也会接触到 组件通讯 的概念。

Vue 2 中除了 $attrs 外,还有$listenersVue 3$listeners 合并到 $attrs 里了。

而本文的重点是讲解在 Vue 3 中如何使用$attrs

本文使用的 Vue 版本是 "vue": "^3.2.37"

本文关键字:

$attrs:在 template 中使用(单一根元素和多个根元素的情况)
useAttrs:在 js 中使用(1 种 Options API 和 2 种 Composition API 的用法)

attrs 的作用:

简单来说, attrs 主要接收没在 props 里定义,但父组件又传过来的属性。
<!-- 父组件 ParentCom.vue -->
<template>
  <ChildCom
    msg="雷猴"
    data="123"
  />
</template>

<script setup>
import ChildCom from './ChildCom.vue'
</script>



<!-- 子组件 ChildCom.vue -->
<template>
  <div>
    {{ msg }} - {{ $attrs }}
  </div>
</template>

<script setup>
defineProps({
  msg: {
    type: String
  }
})
</script>

可以看到,在子组件中,msg 使用了props接收,所以 {{ msg }} 可以直接输出 props 里接收的内容。

而没在props里接收的内容,全部都放到了$attrs里,并且存在一个对象里面。

接下来将展开讲解不同情况下 attrs 的使用方法。

attrs 在 template 中的用法

在前面简单的例子里其实已经大概知道 attrstemplate 的用法。但 Vue3template 不再要求只有一个根元素了。所以 attrstemplate 中分 2 种情况使用。

只有 1 个根元素的情况下

只有 1 个根元素的情况下,子组件中,没被 props 接收的属性,都会绑定在根元素上。

<!-- 父组件 ParentCom.vue -->
<template>
  <ChildCom
    msg="雷猴"
    data="123"
    name="鲨鱼辣椒"
    style="color: red;"
  />
</template>

<script setup>
import ChildCom from './ChildCom.vue'
</script>



<!-- 子组件 ChildCom.vue -->
<template>
  <div>
    {{ msg }}
  </div>
</template>

<script setup>
defineProps({
  msg: {
    type: String
  }
})
</script>

可以看到,没被 props 接收的属性都被绑定到根元素上了。

style 里传入的样式也被执行,文字变成红色了。

如果此时我们想在页面输出 name 的值,可以在子组件中这样操作

<!-- 这里省略 父组件代码 ...... -->



<!-- 子组件 ChildCom.vue -->
<template>
  <div>
    {{ $attrs.name }}
  </div>
</template>

<script setup>
defineProps({
  msg: {
    type: String
  }
})
</script>

使用 $attrs.xxx ,这里的 xxx 是对应的属性名。

有 2 个根元素的情况下

当子组件有 2 个根元素时,没被 props 接收的属性不会绑定到子组件的元素上。

<!-- 父组件 ParentCom.vue -->
<template>
  <ChildCom
    msg="雷猴"
    data="123"
    name="鲨鱼辣椒"
    style="color: red;"
  />
</template>

<script setup>
import ChildCom from './ChildCom.vue'
</script>



<!-- 子组件 ChildCom.vue -->
<template>
  <div>
    {{ msg }}
  </div>
  <div>
    {{ msg }}
  </div>
</template>

<script setup>
defineProps({
  msg: {
    type: String
  }
})
</script>

此时连父组件传入是 style 样式都不生效了。

如果我们此时希望第二个元素绑定所有没被 props 接收的属性,可以使用v-bind="$attrs"的方法实现

<!-- 父组件 ParentCom.vue -->
<template>
  <ChildCom
    msg="雷猴"
    data="123"
    name="鲨鱼辣椒"
    style="color: red;"
  />
</template>

<script setup>
import ChildCom from './ChildCom.vue'
</script>



<!-- 子组件 ChildCom.vue -->
<template>
  <div>
    {{ msg }}
  </div>
  <div v-bind="$attrs">
    {{ msg }}
  </div>
</template>

<script setup>
defineProps({
  msg: {
    type: String
  }
})
</script>

注意第二个元素,使用了 v-bind="$attrs" 绑定了所有没被 props 接收的属性。

如果只希望绑定部分属性,可以单独写

<!-- 这里省略 父组件代码 ...... -->



<!-- 子组件 ChildCom.vue -->
<template>
  <div>
    {{ msg }}
  </div>
  <div :style="$attrs.style">
    {{ msg }}
  </div>
</template>

<script setup>
defineProps({
  msg: {
    type: String
  }
})
</script>

attrs 在 js 中的用法

除了在 template 中可以访问到 $attrs ,在 JS 中也可以访问到。

vue 3 其实是兼容大部分 Vue 2 语法的,也就是 Options API 。而 attrsOptions APiComposition Api 中的使用方法会稍微有一丢丢区别。而 Composition API 又分为 Vue 3.2 前的语法和 3.2 后的语法。

接下来将分开讨论这 3 种情况。

<!-- 父组件 ParentCom.vue -->
<template>
  <ChildCom
    msg="雷猴"
    data="123"
    name="鲨鱼辣椒"
    style="color: red;"
  />
</template>

<script setup>
import ChildCom from './ChildCom.vue'
</script>



<!-- 子组件 ChildCom.vue 暂不关注 template 部分 -->
<script>
export default {
  props: {
    msg: {
      type: String
    }
  },
  mounted() {
    console.log(this.$attrs)
  }
}
</script>

此时控制台会输出没被 props 接收的属性。

Composition API 3.0 的语法

<!-- 父组件 ParentCom.vue -->
<template>
  <ChildCom
    msg="雷猴"
    data="123"
    name="鲨鱼辣椒"
    style="color: red;"
  />
</template>

<script setup>
import ChildCom from './ChildCom.vue'
</script>



<!-- 子组件 ChildCom.vue 暂不关注 template 部分 -->
<script>
export default {
  props: {
    msg: {
      type: String
    }
  },
  setup(props, context) {
    console.log('props: ', props)
    console.log('attrs: ', context.attrs)
  }
}
</script>

Vue 3.2 前的写法,需要在 setup 方法里接收 2 个参数,而 attrs 就在 context 参数里。

Composition API 3.2 的语法

Vue 3.2 后的语法,可以在 <script> 标签上添加 setup 属性。所以在代码里就不需要再调用 setup 方法了。

在这种情况下,props 成了默认的全局方法,而 attrs 则需要另外引入。

<!-- 父组件 ParentCom.vue -->
<template>
  <ChildCom
    msg="雷猴"
    data="123"
    name="鲨鱼辣椒"
    style="color: red;"
  />
</template>

<script setup>
import ChildCom from './ChildCom.vue'
</script>



<!-- 子组件 ChildCom.vue 暂不关注 template 部分 -->
<script setup>
import { useAttrs } from 'vue'

const props = defineProps({
  msg: {
    type: String
  }
})

const attrs = useAttrs()

console.log('props: ', props)
console.log('attrs: ', attrs)
</script>

需要引入 vue 中的 useAttrs ,在调用 useAttrs 后会返回当前未被 props 接收的属性。

重点是以下两句。

import { useAttrs } from 'vue'
const attrs = useAttrs()

之后在 js 代码里就可以使用 attrs.xxx 获取对应的属性值了。

标签:vue,API,ChildCom,Vue2,props,msg,attrs
From: https://www.cnblogs.com/zhengzhijian/p/16942230.html

相关文章

  • 微信小程序实战,基于vue2实现瀑布流
    1、什么是瀑布流呢?瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前......
  • Vue2(笔记08) - Vue核心 - 绑定Class样式、绑定Style样式
    绑定Class样式Vue里引入 ​​:class="xxx"​​ 来绑定样式,"xxx" 即可以是样式名,也可以是表达式,原有class 不动;​字符串写法适用于样式的类名不确定,需要动态指定​需求:......
  • WebApI
    WebApiwebapi_day011.1webapi认知DOM树又称为文档树模型,把文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面。文档:一个页面就是一个文档,DOM......
  • Vue2适用的视频组件
    Vue2适用的视频组件官方文档路径西瓜视频官方文档:http://v2.h5player.bytedance.com/gettingStarted/随笔制作参考:https://juejin.cn/post/7023547598724136990#hea......
  • .Net Core 5.0 通过Swagger Api上传文件大小被限制,报error: request entity too large
    1、在Startup中添加以下代码publicvoidConfigureServices(IServiceCollectionservices){services.Configure<FormOptions>(options=>{//Setth......
  • 1:Unit test and main function-Java API 实战
    (目录)1.抛出企业问题,脱离main测试,模块化编程main方法是什么?main方法就是进入程序的一扇门,而这个门只负责开和关,打开门可以实现某些功能,但这些功能只由门里面的东西来......
  • UE5 像素流送 与前端API 实践(二)—Navigate
        这篇主要讲的是相机视点的控制,从三维GIS的概念上来说叫导航(Navigate)控制。    主要用于记录开发一些效果,如果有感兴趣的可以一起交流    主要......
  • vue2 数组18 some erver filter reduce axios
    some: return true是固定写法,终止some循环 erver: filter:   优化写法:arr.filter(item=>item.state).reduce((累加的结果,当前循环项)=>{},初始值)拿上......
  • EMQX Enterprise 4.4.11 发布:CRL/OCSP Stapling、Google Cloud Pub/Sub 集成、预定义
    我们很高兴地告诉大家,​​EMQXEnterprise​​4.4.11版本正式发布!在此版本中,我们发布了CRL与OCSPStapling为客户端提供更灵活的安全防护,新增了GoogleCloudPub/Sub......
  • 前后端分离开发工具YAPI部署记录
    之前公司说要建立起前后端分离开发模式,而我只是刚毕业,让我负责建立起这个规范,虽然刚毕业还没去大厂待过,对我来说是个挑战,只能按我理解和网上的方案进行建立。在​​Go​​......