详解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在图片上传的时候压缩图片
Nov 18 Vue.js
深入了解Vue3模板编译原理
Nov 19 Vue.js
8个非常实用的Vue自定义指令
Dec 15 Vue.js
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 Vue.js
vue自定义组件实现双向绑定
Jan 13 Vue.js
Vue中引入svg图标的两种方式
Jan 14 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
详解Vue的七种传值方式
Feb 08 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
vue 把二维或多维数组转一维数组
Apr 24 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
phpmyadmin操作流程
2006/10/09 PHP
一段php加密解密的代码
2006/10/09 PHP
php下过滤HTML代码的函数
2007/12/10 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
php文件上传类的分享
2017/07/06 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
vue中多路由表头吸顶实现的几种布局方式
2019/04/12 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
python根据出生日期返回年龄的方法
2015/03/26 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
Python遍历字典方式就实例详解
2019/12/28 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
优秀党员主要事迹
2014/01/19 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
开平碉楼导游词
2015/02/06 职场文书
新娘婚礼答谢词
2015/09/29 职场文书