详解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使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
Vue router安装及使用方法解析
Dec 02 Vue.js
Vue实现省市区三级联动
Dec 27 Vue.js
vue实现轮播图帧率播放
Jan 26 Vue.js
HTML+VUE分页实现炫酷物联网大屏功能
May 27 Vue.js
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
Vue监视数据的原理详解
Feb 24 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
vue中的可拖拽宽度div的实现示例
Apr 08 Vue.js
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 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
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
angular4应用中输入的最小值和最大值的方法
2019/05/17 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
python操作mysql代码总结
2018/06/01 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
python xlsxwriter模块的使用
2020/12/24 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
GWT的应用有哪两种部署模式
2012/12/21 面试题
本科毕业生自我鉴定
2013/11/02 职场文书
英语故事演讲稿
2014/04/29 职场文书
大学生村官考核材料
2014/05/23 职场文书
MySQL基础(二)
2021/04/05 MySQL
详解php中流行的rpc框架
2021/05/29 PHP