当前位置: 首页 > news >正文

Vue——$attrs和$listeners

$attrs

Vue2官方文档的解释如下:
在这里插入图片描述

作用

简单来说就是 组件向下传递数据 的,是props通信的补充方案,避免了组件中props过多的窘境。

使用场景

在孙子或更深层后代组件访问祖辈组件中的数据

使用

祖父组件GrandPa如下:
传给Parent组件的数据有name,age, gender

<template>
    <div>
        我是祖父: 下面是爸爸
        <Parent v-bind="$attrs" :name="'佩奇爸爸'" :age="age" :sex="sex" />
    </div>
</template>

<script>
import Parent from "./Parent.vue"
export default {
    name: "GrandPa",
    components: {
        Parent
    },
    data() {
        return {
            age: 65,
            sex: '男'
        }
    }    
}
</script>

父亲组件Parent如下:
Parent组件中定义的props只有name

<template>
    <div>
        我是爸爸:叫 {{ name }}, 下面是儿子
        <Son :name="'佩奇'" />
    </div>
</template>

<script>
import Son from "./Son.vue"
export default {
    name: "Parent",
    components: {
        Son
    },
    props: {
        name: {
            type: String,
            default: ""
        }
    },
    data() {
        return {
            age: 40,
            gender: '男'
        }
    },
    created() {
        console.log(this.$attrs);
    }    
}
</script>

GrandPa传进来的age和gender在哪儿?嗯,就在$attrs里,created中打印的 $attrs 如下

{ age: 65, gender: "男" }

上面演示的是父组件不通过props向子组件传递数据,除了这种还可以使用$parent直接访问父组件数据

儿子组件Son如下:

<template>
    <div>
        我是儿子:叫{{ name }}
    </div>
</template>

<script>
export default {
    name: "Son",
    props: {
        name: {
            type: String,
            default: ''
        }
    },
    data() {
        return {
            age: 18,
            sex: '男'
        }
    },
    created() {
        console.log(this.$attrs);
    }    
}
</script>

定义的props只有name,如果要通过$attrs访问父组件数据,在父组件使用Son组件时吧数据传进来即可,那如果要访问祖父组件GrandPa的数据呢?在Parent组件中使用儿子组件时加上 v-bind=" $attrs " 即可。

<template>
    <div>
        我是爸爸:叫 {{ name }}, 下面是儿子
        <Son v-bind="$attrs" :name="'佩奇'" />
    </div>
</template>

如果数据要往更深层组件使用 v-bind=" $attrs " 逐层传递即可。

$listeners

官方文档解释如下:
在这里插入图片描述

作用

简单来说就是组件跨代传递函数的桥梁

使用场景

在孙子或更深层后代组件访问祖辈组件中定义的函数

使用

祖辈组件如下:

<template>
    <div>
        我是祖父: 下面是爸爸
        <Parent @printGrandPaAge="printGrandPaAge" />
    </div>
</template>

<script>
import Parent from "./Parent.vue"
export default {
    name: "GrandPa",
    components: {
        Parent
    },
    data() {
        return {
            age: 65,
        }
    },
    methods: {
        printGrandPaAge() {
            console.log(this.age);
        }
    }    
}
</script>

祖辈组件中定义了printGrandPaAge方法,同时监听了关键字printGrandPaAge作为子代触发该方法的条件
parent组件如下:

<template>
    <div>
        我是爸爸: 下面是儿子
        <Son v-on="$listeners" />
    </div>
</template>

<script>
import Son from "./Son.vue"
export default {
    name: "Parent",
    components: {
        Son
    },
    data() {},   
}
</script>

使用 v-on=" $listeners "即可把祖辈定义的方法传递到子组件Son中
子组件Son如下:

<template>
    <div>
        我是儿子:
        <el-button @click="test">打印祖父的年龄</el-button>
    </div>
</template>

<script>
export default {
    name: "Son",
    data() {},
    methods: {
        test() {
            this.$emit("printGrandPaAge")
        }
    }    
}
</script>

在Son组件中使用printGrandPaAge关键字即可调用父组件函数

相关文章:

  • JS代码优化技巧——持续更新
  • 文字居于div底部的方式
  • Element——el-table设置单元格间距
  • Vue——插槽语法
  • Element——给el-table表头添加*
  • Element——tooltip无效和自定义内容
  • Vue——provide/inject的使用
  • windows注册表自定义添加右键菜单
  • 请求正常执行但是js语法报错Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘code‘)
  • 使用图片做背景并设置充满固定屏幕
  • Vue——组件间数据访问方式与通信方式的一点总结思考
  • git-错误合并或错误删除文件并推送如何回退
  • 面试——常用的设计模式
  • VUE全局使用element-ui组件
  • express创建项目
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Computed property XXX was assigned to but it has no setter
  • CSS实用技巧
  • Git的一些常用操作
  • Markdown 语法简单说明
  • npx命令介绍
  • Python学习之路16-使用API
  • Spark RDD学习: aggregate函数
  • vue的全局变量和全局拦截请求器
  • vue数据传递--我有特殊的实现技巧
  • 编写高质量JavaScript代码之并发
  • 从伪并行的 Python 多线程说起
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 对象管理器(defineProperty)学习笔记
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于for循环的简单归纳
  • 观察者模式实现非直接耦合
  • 规范化安全开发 KOA 手脚架
  • 配置 PM2 实现代码自动发布
  • 软件开发学习的5大技巧,你知道吗?
  • 使用parted解决大于2T的磁盘分区
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • NLPIR智能语义技术让大数据挖掘更简单
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (42)STM32——LCD显示屏实验笔记
  • (办公)springboot配置aop处理请求.
  • (强烈推荐)移动端音视频从零到上手(下)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)原始图像数据和PDF中的图像数据
  • (转)重识new
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .describe() python_Python-Win32com-Excel
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET Standard 支持的 .NET Framework 和 .NET Core