网站首页 > 博客文章 正文
Vue3 属性穿透
Vue3 属性穿透包括自动穿透和属性绑定两种
- 自动穿透 如果子组件只有一个根节点,父组件上的属性(class,id,style,事件,属性)就会向下流转到子组件的根节点上。
- 属性绑定 如果子组件有多个根节点,父组件上的属性流转到子组件时,不确定绑定到哪个根节点上,这时就需要手动绑定属性到节点。
自动穿透
子组件只有一个根节点
简单样式穿透
<template>
<button>提交</button>
</template>
父组件调用改子组件并传递 css,该样式会自动流转到子组件中。
<template>
<div>
<my-button class="my-button-background-color"></my-button>
</div>
</template>
<script setup>
import MyButton from './components/my-button.vue'
</script>
<style>
.my-button-background-color{
background-color: red;
}
</style>
如上,my-button-background-color 样式被自动添加到子组件的根节点上。
样式合并
子组件不变,父组件增加行内样式。
<template>
<div>
<my-button class="my-button-background-color" style="border: 2px solid green;"></my-button>
</div>
</template>
<script setup>
import MyButton from './components/my-button.vue'
</script>
<style>
.my-button-background-color{
background-color: red;
}
</style>
如上,行内样式也增加到了根节点。
监听事件
子组件不变,父组件增加监听事件。
<template>
<div>
<my-button class="my-button-background-color" style="border: 2px solid green;" @click="handleClick"></my-button>
</div>
</template>
<script setup>
import MyButton from './components/my-button.vue'
const handleClick = () => {
alert('监听点击事件');
}
</script>
<style>
.my-button-background-color{
background-color: red;
}
</style>
click 监听器会被添加到子组件的根元素上。当原生的 button 被点击,会触发父组件的 onClick 方法。同样的,如果原生 button 元素自身也通过 v-on 绑定了一个事件监听器,则这个监听器和从父组件继承的监听器都会被触发。
隔代穿透
儿子根节点是另一个组件,属性会继续流转。 父组件不变
# 儿子组件
<template>
<base-button></base-button>
</template>
<script setup>
import BaseButton from './base-button.vue'
</script>
# 孙子组件
<template>
<button>孙子组件</button>
</template>
如上,属性通过儿子组件流转到孙子组件
注意:透传的属性不包含儿子组件上声明过的 props 或是针对 emits 声明事件的 v-on 侦听函数
禁用属性穿透
在某些情况下,你可能不希望子组件继承所有的属性,而是希望对属性的传递进行更精确的控制
<script setup>
defineOptions({
inheritAttrs: false
})
</script>
在儿子节点中增加如上代码
<template>
<base-button></base-button>
</template>
<script setup>
import BaseButton from './base-button.vue'
import {defineOptions} from 'vue'
defineOptions({
inheritAttrs: false
})
</script>
如上,属性没有流转到儿子节点。
注意:这些流转进来的属性可以在模板的表达式中直接用 $attrs 访问到
在儿子节点中增加模版代码
<template>
<span>流转进来的属性: {{ $attrs }}</span>
<base-button></base-button>
</template>
<script setup>
import BaseButton from './base-button.vue'
import {defineOptions} from 'vue'
defineOptions({
inheritAttrs: false
})
</script>
如上,可以显示传递进来的属性。
注意:
- 流转到儿子组件的属性在JavaScript中保留了它们原始的大小写,所以像 my-button-background-color 这样的一个属性需要通过 $attrs['my-button-background-color'] 来访问
- 事件会暴露出来一个函数 $attrs.handleClick
一般在模版中我们都会设置一个根节点
<template>
<div>
<base-button></base-button>
</div>
</template>
如上 这样流转进来的属性会默认绑定到根节点(div)上,如果需要绑定到 <base-button></base-button> 组件上,需要手动绑定。
<template>
<div>
<base-button v-bind="$attrs"></base-button>
</div>
</template>
<script setup>
import BaseButton from './base-button.vue'
import {defineOptions} from 'vue'
defineOptions({
inheritAttrs: false
})
</script>
多根节点属性流转
多个根节点的组件没有自动属性流转行为,需要手动绑定到一个节点。如果没有手动绑定某个节点,会有警告。
在JS中访问流转属性
使用 useAttrs() 来访问一个组件的所有流转属性。
<template>
<base-button></base-button>
</template>
<script setup>
import BaseButton from './base-button.vue'
import { useAttrs } from 'vue';
const attrs = useAttrs()
console.log(attrs)
</script>
结语
Vue3 中,属性穿透让父组件的非props属性自动传递给子组件根元素。通过设置inheritAttrs: false可禁用此功能以实现更精细控制。禁用后,利用$attrs手动绑定未声明的属性至所需位置,确保了属性传递的灵活性与可控性。
猜你喜欢
- 2024-10-27 Vue 3 大刀阔斧:告别旧爱,拥抱更简洁高效的新语法!
- 2024-10-27 深入剖析Vue源码 - 你了解v-model的语法糖吗?
- 2024-10-27 Vue3,Composition API(组合) setup、ref、reactive、toRefs案例
- 2024-10-27 Vue3数据传递$attrs(二)(vue三种传值方式)
- 2024-10-27 Vue2 到 Vue3,重学这 5 个常用的 API
- 2024-10-27 vue内置组件、特殊元素、组件api详解
- 2024-10-27 Vue 3最常用的函数或指令(备用查询)
- 2024-10-27 Vue 3新的API——Composition API组合函数(三)
- 2024-10-27 Vue3 - $attrs 的几种用法(1个或多个根元素、Vue3的两种语法)
- 2024-10-27 想知道Vue3与Vue2的区别?五千字教程助你快速上手Vue3
你 发表评论:
欢迎- 06-23MySQL合集-mysql5.7及mysql8的一些特性
- 06-23MySQL CREATE TABLE 简单设计模板交流
- 06-23MYSQL表设计规范(mysql设计表注意事项)
- 06-23MySQL数据库入门(四)数据类型简介
- 06-23数据丢失?别慌!MySQL备份恢复攻略
- 06-23MySQL设计规范(mysql 设计)
- 06-23MySQL数据实时增量同步到Elasticsearch
- 06-23MySQL 避坑指南之隐式数据类型转换
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)