iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue3$attrs和inheritAttrs的用法说明
  • 211
分享到

vue3$attrs和inheritAttrs的用法说明

2024-04-02 19:04:59 211人浏览 八月长安
摘要

目录$attrs和inheritAttrs用法在父组件app.Vue中子组件 myInput.vue 设置 inheritAttrs: true(默认)子组件 myInput.vue

$attrs和inheritAttrs用法

  • $attrs属性解释:包含了父作用域中不作为组件 props 或自定义事件的 attribute 绑定和事件。当一个组件没有声明任何prop 时,这里会包含所有父作用域的绑定,并且可以通过 v-bind="$attrs" 传入内部组件——这在创建高阶的组件时会非常有用。
  • inheritAttrs属性解释:如果你不希望组件的根元素继承特性,你可以在组件的选项中设置 inheritAttrs: false

可能不是很好理解,我们可以举个例子来验证一下。

在父组件app.vue中

<template>
  <div>
    <MyInput type="text" placeholder="输入用户名" v-model="state.text" />
    <MyInput type="passWord" placeholder="输入密码"  v-model="state.pass"  />
  </div>
</template>
<script setup>
import MyInput from "@/components/myInput.vue";
import { Reactive } from "vue";
const state = reactive({
  text: "",
  pass: "",
});
</script>

子组件 myInput.vue 设置 inheritAttrs: true(默认)

<template>
  <div class="input">
    <input v-bind="$attrs" v-model="modelValue" />
  </div>
</template>
<script>
export default {
  props: {
    modelValue: [String, Number],
  },
};
</script>

子组件 myInput.vue 设置 inheritAttrs: false

<template>
  <div class="input">
    <input v-bind="$attrs" v-model="modelValue"/>
  </div>
</template>
<script>
export default {
  inheritAttrs: false,
  props: {
    modelValue: [String, Number],
  },
};
</script>

小结:

由上述例子可以看出,子组件的props中未注册父组件传递过来的属性。

  • 当设置inheritAttrs:true时,子组件的顶层标签元素中会渲染出父组件传递过来的属性(例如:type="text"等)
  • 当设置inheritAttrs: false时,子组件的顶层标签元素中不会渲染出父组件传递过来的属性
  • 不管inheritAttrs为true或者false,子组件中都能通过$attrs属性获取到父组件中传递过来的属性。

$attrs和inheritAttrs实例

官网的文档简短而又不清晰,实在是看不懂,只好自己找代码验证来看看是什么意思:

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.1.5/vue.global.js"></script>
</head>
 
<body>
    <div id="app">
        <father :v1="'value1'" :v2="'value2'" :v3="'value3'"></father>
    </div>
</body>
 
</html>
<script>
const app = Vue.createApp({
    data() {
        return {}
    },
})
app.component('father', {
 // inheritAttrs: false,
    props: ['v1'],
    template: ` <div><p>v1 is {{v1}}</p>
		  <son v-bind='$attrs' :some="1"></son>
	       </div>`,
    created() {
        console.log('father:', this.$attrs)
    }
})
app.component('son', {
    // inheritAttrs: false,
    props: ['v2'],
    template: `<div><p>v2 is {{v2}}</p>
                     <grandSon v-bind='$attrs'></grandSon>
              </div>`,
    created() {
        console.log('son:', this.$attrs)
    }
})
app.component('grandSon', {
    props: ['v3'],
    template: `<p>v3 is {{v3}}</p>`,
    created() {
        console.log('grandSon:', this.$attrs)
    }
})
app.mount('#app')
</script>

页面显示的结果:

v1 is value1 

v2 is value2 

v3 is value3

页面源代码:

<div id="app" data-v-app="">
   <div v2="value2" v3="value3"> <!-- 这是father -->
      <p>v1 is value1</p>
      <div v3="value3" some="1">  <!-- 这是 son-->
          <p>v2 is value2</p>
           <p some="1">v3 is value3</p>  <!-- 这是 grandSon -->
      </div>
   </div>
</div>

控制台打印是当前组件的$attrs:

father: Proxy {v2: "value2", v3: "value3", __vInternal: 1}

son: Proxy {v3: "value3", some: 1, __vInternal: 1}

grandSon: Proxy {some: 1, __vInternal: 1}

首选,father组件被传入了3个值,但是实际使用props接收的只有v1,v2和v3作为attributes在DOM里面渲染了。

上图的devtool 也可以说明,另外就是控制台也同时证明了。

同样son组件只是接收v2作为prop:

grandSon组件只是接收v3作为prop

father prop:v1,attributes: v2,v3

son prop:v2 ,attributes:v3,some

grandSon prop:v3,,attributes: some

发现无论是father传入的3个值v1,v2,v3还是son又传入的值':some=1',

只要不被prop传入下一层组件,那么一定是在下一层组件的$attrs,也就是说不被作为prop的值会传入下一个组件作为attrs的一员。一个组件的attrs由父组件传递以及自己自带的组合而成。

上面说的是$attrs,那么inheritAttrs则说的是attrs继承,这里的继承是控制DOM渲染,不继承也就是不渲染了,但是实际还是存在这个attrs的。

`inheritAttrs`属性默认是true,所以能看到上面的结论,attrs会往下传,当设置为false的时候就不会在DOM渲染从上一层继承来的attrs。

修改一下代码:

app.component('father', {
   inheritAttrs: false,    // 不继承
    props: ['v1'],
    template: ` <div><p>v1 is {{v1}}</p>
		  <son v-bind='$attrs' :some="1"></son>
	       </div>`,
    created() {
        console.log('father:', this.$attrs)
    }
})

father组件这不继承attrs,控制台的打印没变:

father: Proxy {v2: "value2", v3: "value3", __vInternal: 1}

son: Proxy {v3: "value3", some: 1, __vInternal: 1}

grandSon: Proxy {some: 1, __vInternal: 1}

devtool这里依然可以看到attrs

但是看源代码:

<div id="app" data-v-app="">
  <div>                          <!-- 这里是 father --> <!-- 看这行 -->
    <p>v1 is value1</p>
    <div v3="value3" some="1">     <!-- 这里是 son-->
      <p>v2 is value2</p>
      <p some="1">v3 is value3</p>   <!-- 这里是 grandSon-->
      </div>
    </div>
</div>

DOM渲染里面的v2,v3 attrs都不存在了。

所以综合总结一下:

$attrs就是给组件传值排除了作为prop的那部分(比如father的v2,v3),包括了(class,id)inheritAttrs只是用来控制attrs是否在DOM中渲染。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: vue3$attrs和inheritAttrs的用法说明

本文链接: https://www.lsjlt.com/news/147685.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue3$attrs和inheritAttrs的用法说明
    目录$attrs和inheritAttrs用法在父组件app.vue中子组件 myInput.vue 设置 inheritAttrs: true(默认)子组件 myInput.vue...
    99+
    2024-04-02
  • vue3 $attrs和inheritAttrs怎么用
    今天小编给大家分享一下vue3 $attrs和inheritAttrs怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-30
  • vue3中$attrs的变化与inheritAttrs的使用详解
    目录在vue3中的$attrs的变化在vue2中的$attrs父组件的属性直接渲染在根节点上在vue3中的$attrs的变化 $listeners已被删除合并到$attrs中。 $a...
    99+
    2022-11-13
    vue3 $attrs与inheritAttrs的使用 vue3 inheritAttrs使用
  • vue3中proxy的基本用法说明
    目录vue3 proxy基本用法新的改变基本使用vue3中proxy代理理解Proxy代理vue3 proxy基本用法 新的改变 我们的vue3 使用proxy 来代替vue2 的 ...
    99+
    2024-04-02
  • vue3中Vant的使用及说明
    目录vue3中Vant的使用一. 安装Vant组件库二. 引入组件(推荐)三. 引入组件 另外还有两种方法 vue2,vue3引入vantvue2引入vant&n...
    99+
    2023-01-16
    vue3 Vant使用 vue3中Vant vue3中Vant使用
  • python sys.stdin和sys.stdout的用法说明
    1、sys.stdin.readline()与input import sys # sys.stdin.readline() 相当于input,区别在于input不会读入'\n'...
    99+
    2024-04-02
  • vue3响应式原理之Ref用法及说明
    目录一. Ref 用法二. 实现1. ref 函数2. createRef 函数3. RefImpl 类的实现4. trackRefValue 依赖收集5. createDep 创建...
    99+
    2022-12-03
    vue3响应式原理 vue3 Ref vue3响应式
  • vue中的addEventListener和removeEventListener用法说明
    目录addEventListener和removeEventListener用法说明1、添加监听事件(addEventListener)2、移出监听事件(removeEventLis...
    99+
    2024-04-02
  • vuex在vite&vue3中的简单使用说明
    目录vuex在vite&vue3的使用一、说明二、使用vue3.x之vite初体验一、项目搭建二、附项目结构三、附项目启动成功图vuex在vite&vue3的使用 注...
    99+
    2024-04-02
  • Java Scanner的使用和hasNextXXX()的用法说明
    目录输入输出输出输入使用Scanner读取使用Scanner循环读取N个数字/字符串关于Scanner中nextxxx()须注意的一点输入输出 输出 基本语法 System.ou...
    99+
    2024-04-02
  • mysql sum(if())和count(if())的用法说明
    目录mysql sum(if())和count(if())的用法解析mysql 聚合函数 根据条件求和 sum(if())mysql sum(if())...
    99+
    2024-04-02
  • Python中的lambda和apply用法及说明
    目录1 lambda1.1 举最简单的例子1.2 再举一个普通的例子2 Apply2.1 举例2.2 下面的例子是DataFrame中apply的用法总结1 lambda lambd...
    99+
    2022-12-21
    Python中lambda用法 Python中apply用法 lambda和apply用法
  • 浅谈numpy.where() 的用法和np.argsort()的用法说明
    numpy.where() 有两种用法: 1. np.where(condition, x, y) 满足条件(condition),输出x,不满足输出y。 如果是...
    99+
    2024-04-02
  • python的partial()用法说明
    在functools模块中有一个工具partial(),可以用来"冻结"一个函数的参数,并返回"冻结"参数后的新函数。 很简单的解释,也是官方手册给的示例。对于int()函数,它可以将给定的数值转换成十进制整数,转换时可以指定以几进制的方...
    99+
    2023-01-30
    python partial
  • cmd del命令的说明和具体用法
    这篇文章主要介绍“cmd del命令的说明和具体用法”,在日常操作中,相信很多人在cmd del命令的说明和具体用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”cmd del命令的说明和具体用法”的疑惑有所...
    99+
    2023-06-08
  • Lambda表达式的说明和实例用法
    本篇内容介绍了“Lambda表达式的说明和实例用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lambda表达式,一种简单的匿名内部类(但...
    99+
    2023-06-02
  • Python中sub()的用法说明
    Python来进行查询和替换一个文本字符串? 可以使用sub()方法来进行查询和替换,sub方法的格式为: sub(replacement, string[, count=0])...
    99+
    2024-04-02
  • pytorch中[..., 0]的用法说明
    在看程序的时候看到了x[…, 0]的语句不是很理解,后来自己做实验略微了解,以此记录方便自己查看。 b=torch.Tensor([[[[10,2],[4,5],[7,8]],[...
    99+
    2024-04-02
  • Mybatis-plus:${ew.sqlselect}用法说明
    目录Mybatis-plus:${ew.sqlselect}使用步骤Mybatis-plus ${ew.sqlSegment}踩坑Mybatis-plus:${ew.sql...
    99+
    2024-04-02
  • c# delegate和event的使用说明
    delegate是什么 委托(delegate) 是存有对某个方法的引用的一种引用类型变量,引用可在运行时被改变。如果不好理解,可以把委托理解成为函数指针,但它们是有区别的。 del...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作