详解Vue中$props、$attrs和$listeners的使用方法


Posted in Vue.js onFebruary 18, 2022

背景

现在我们来讨论一种情况,父组件与孙子组件怎么通信,我们有多少种解决方案?

  • 我们使用VueX来进行数据管理,但是如果项目中多个组件共享状态比较少,项目比较小,并且全局状态比较少,那使用VueX来实现该功能,并没有发挥出VueX的威力。
  • 使用B来做中转站,当A组件需要把信息传给C组件时,B接受A组件的信息,然后利用属性传给C组件, 这是一种解决方案,但是如果嵌套的组件过多,会导致代码繁琐,代码维护比较困难;如果C中状态的改变需要传递给A, 使用事件系统一级级往上传递 。
  • 自定义一个Vue 中央数据总线,这个情况适合碰到组件跨级传递消息,但是缺点是 碰到多人合作时,代码的维护性较低,代码可读性低

一、文档描述

(1)$props:当前组件接收到的 props 对象。Vue 实例代理了对其 props 对象属性的访问。

(2)$attrs:包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。

(3)$listeners:包含了父作用域中(不含 .native 修饰器的)v-on事件监听器。他可以通过 v-on="listeners"传入内部组件

二、具体使用

1、父组件

<template>
  <div>
    <div>父亲组件</div>
    <Child
      :foo="foo"
      :zoo="zoo"
      @handle="handleFun"
    >
    </Child>
  </div>
</template>

<script>
import Child from './Child.vue'
export default {
  components: { Child },
  data() {
    return {
      foo: 'foo',
      zoo: 'zoo'
    }
  },
  methods: {
    // 传递事件
    handleFun(value) {
      this.zoo = value
      console.log('孙子组件发生了点击事件,我收到了')
    }
  }
}
</script>

2. 儿子组件(Child.vue)

中间层,作为父组件和孙子组件的传递中介,在儿子组件中给孙子组件添加v-bind="$attrs",这样孙子组件才能接收到数据。

$attrs是从父组件传过来的,且儿子组件未通过props接收的数据,例如zoo

<template>
  <div class='child-view'>
    <p>儿子组件--{{$props.foo}}与{{foo}}内容一样</p>
    <GrandChild v-bind="$attrs" v-on="$listeners"></GrandChild>
  </div>
</template>

<script>
import GrandChild from './GrandChild.vue'
export default {
  // 继承所有父组件的内容
  inheritAttrs: true,
  components: { GrandChild },
  props: ['foo'],
  data() {
    return {
    }
  }
}
</script>

3. 孙子组件(GrandChild.vue)

在孙子组件中一定要使用props接收从父组件传递过来的数据

<template>
  <div class='grand-child-view'>
    <p>孙子组件</p>
    <p>传给孙子组件的数据:{{zoo}}</p>
    <button @click="testFun">点我触发事件</button>
  </div>
</template>

<script>
export default {
  // 不想继承所有父组件的内容,同时也不在组件根元素dom上显示属性
  inheritAttrs: false,
  // 在本组件中需要接收从父组件传递过来的数据,注意props里的参数名称不能改变,必须和父组件传递过来的是一样的
  props: ['zoo'],
  methods: {
    testFun() {
      this.$emit('handle', '123')
    }
  }
}
</script>

三、总结

从上面的代码,可以看出使用attrsinheritAttrs属性 能够使用简洁的代码,将A组件的数据传递给C组件,该场景的使用范围还是挺广的。

通过listeners,我们在b组件上 绑定 v-on=”$listeners”, 在a组件中,监听c组件触发的事件。就能把c组件发出的数据,传递给a组件。

到此这篇关于详解Vue中$props、$attrs和$listeners的使用方法的文章就介绍到这了,更多相关Vue $props、$attrs和$listeners内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue + el-form 实现的多层循环表单验证
Nov 25 Vue.js
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 Vue.js
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
如何封装Vue Element的table表格组件
Feb 06 Vue.js
详解Vue的七种传值方式
Feb 08 Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 Vue.js
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
vue @ ~ 相对路径 路径别名设置方式
Jun 05 Vue.js
前端vue+express实现文件的上传下载示例
一篇文章告诉你如何实现Vue前端分页和后端分页
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 #Vue.js
vue3获取当前路由地址
Feb 18 #Vue.js
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 #Vue.js
vue项目支付功能代码详解
Feb 18 #Vue.js
Vue自定义铃声提示音组件的实现
Jan 22 #Vue.js
You might like
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
php上传中文文件名乱码问题处理方案
2015/02/03 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
PHP时间类完整代码实例
2021/02/26 PHP
javascript标签在页面中的位置探讨
2013/04/11 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
javascript学习笔记--数字格式类型
2014/05/22 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
jquery实现简单实用的打分程序实例
2015/07/23 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
深入理解javascript函数参数与闭包
2016/12/12 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
python实现将excel文件转化成CSV格式
2018/03/22 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
python实现音乐下载的统计
2018/06/20 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
Python中的延迟绑定原理详解
2019/10/11 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
python实现猜拳游戏
2020/03/04 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
SQL SERVER面试资料
2013/03/30 面试题
程序员机试试题汇总
2012/03/07 面试题
父亲的菜园教学反思
2014/02/13 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
解除处分决定书
2015/06/25 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS