vue中的$attrs和$listener简介

Vue中的$attrs和$listener

大家在组件开发中肯定遇到过父组件需要向子组件传递数据和事件的问题,以往我们是这样解决的:

父组件代码:

 1 <template>
 2   <div id="father">
 3     <child :tempdata="temp" @fatherFn="tempFn"><child>
 4   </div>
 5 </template>
 6 <script>
 7 export default {
 8   data() {
 9     temp: ‘click here!‘
10   },
11   method: {
12     tempFn: function(message) {
13       console.log(message);
14     }
15   }
16 }
17 </script>

子组件代码:

 1 <template>
 2   <div id="child">
 3     <span @click="childClick(message)">{{ tempdata }}</span>
 4   </div>
 5 </template>
 6 <script>
 7 export default {
 8   props: {
 9     tempdata: {
10       type: String,
11       default: ‘‘
12     }
13   },
14   data() {
15     return {
16       message: ‘i am child‘
17     }
18   },
19   methods: {
20     childClick: function(message) {
21       this.$emit(‘fatherFn‘, message);
22     }
23   }
24 }
25 </script>

这样我们完成了从父组件传递数据已经方法到子组件,但是如果是向子组件的子组件传递信息呢?显然我们需要换一种更加简单的方式实现祖孙组件之间的数据传输,小二上代码:

 1 // father组件
 2 <template>
 3   <div id="father">
 4     <child :temp="tempdata" @tempFn="fatherFn" :prop=‘$attrs不会传递prop
 5      值‘>
 6     </child>
 7   </div>
 8 </template>
 9 <script>
10 import Child from ‘./child‘
11 export default {
12    component: { Child },
13   data() {
14     tempdata: ‘i am father‘
15   },
16   methods: {
17     fatherFn: function() {
18       console.log(‘father function!‘);
19     }
20   }
21 }
22 </script>
23
24 // child组件
25 <template>
26   <div id="child">
27     <son v-bind="$attrs" v-on="$listener"></son>
28   </div>
29 </template>
30 <script>
31 import Son from ‘./son‘
32 export default {
33   component: {Son},
34   props: { ‘prop‘ },
35   data() {
36     return {}
37   },
38   mounted() {
39     // 结果显示为$attrs.temp,不包含prop
40     console.log(this.$attrs)
41     this.$emit(‘tempFn‘)
42   },
43   methods: {}
44 }
45 </script>
46
47 // son组件
48 <template>
49   <div id="son">
50     {{ $attrs.temp }}
51   </div>
52 </template>
53 <script>
54 export default {
55   prop: {},
56   data() {
57     return {}
58   },
59   mounted() {
60     this.$emit(‘tempFn‘)
61   },
62   methods: {}
63 }
64 </script>

综上,可知:

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

$attrs包含了父作用域中非props 特性绑定的属性 (class 和 style 除外)。当一个组件没有声明任何 props 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind=”$attrs” 传入内部组件。

原文地址:https://www.cnblogs.com/lsboom/p/11365293.html

时间: 2024-10-03 15:48:21

vue中的$attrs和$listener简介的相关文章

理解Vue中的Render渲染函数

VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数.比如如下我想要实现如下html: <div id="container"> <h1> <a href="#"> Hello world! </a> </h1> </div> 我们会如下使用: <!DOCTYPE html> <html

聊聊 Vue 中 axios 的封装

聊聊 Vue 中 axios 的封装 axios 是 Vue 官方推荐的一个 HTTP 库,用 axios 官方简介来介绍它,就是: Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 作为一个优秀的 HTTP 库,axios 打败了曾经由 Vue 官方团队维护的 vue-resource,获得了 Vue 作者尤小右的大力推荐,成为了 Vue 项目中 HTTP 库的最佳选择. 虽然,axios 是个优秀的 HTTP 库,但是,直接在项目中使用并不是那

vue中8种组件通信方式

一.props / $emit 下面通过一个例子说明父组件如何向子组件传递数据:在子组件article.vue中如何获取父组件section.vue中的数据articles:['红楼梦', '西游记','三国演义'] // section父组件 <template> <div class="section"> <com-article :articles="articleList"></com-article> <

【Vue】彻底理解Vue中render函数与template的区别

一.render函数与template对比 VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数. 以下我们来做一个需求跟根据level等级来编写对应等级的标题 template解析 <body>   <divid="app">       <h-titlelevel=1>           <p>li</p>       </

vue中自定义指令

在vue中自定义标签,首先要调用vue中一个directive的方法,具体方法:Vue.direction('指令名称',function(){ }); 例如我们要写一个关于颜色的指令,叫v-colorred: 1 Vue.directive('colorred',function(){ 2 3 this.el.style.color='red'; 4 }); 在html中,我直接用v-colorred指令就可以了,例如: 1 <p v-colorred>1234567890</p>

vue中的vue-cli

在前面的学习过程中我相信你们已经对vue有了一定的了解,现在我们来看一下vue中的vue-cli. 学习这个我们首先需要的是node环境的,如果你的网络环境慢的话建议安装淘宝镜像,在cmd中输入 npm install -g cnpm –registry=https://registry.npm.taobao.org 这个命令行,安装,安装之后检查cnpm的版本 cnpm -v 之后创建项目文件进入项目文件中,在comd中下载vue-cli cnpm install vue-cli -g --s

如何在Vue中建立全局引用或者全局命令

1 一般在vue中,有很多vue组件,这些组件每个都是一个文件.都可能需要引用到到相同模块.我们不想每个文件都import 一次模块. 如果是vue编写的插件我们可以用 Vue.use(...) 2 但是如果想添加一个全局命令,同时又让每个vue的文件都能用到怎么办? 第一步:最好建立一个全局的命令文件例如:directive/directive.js 第二步:利用Vue.directive()建立一个全局命令,并将它暴露出来,例如一个focus 让表单自动聚焦 第三部步:在main.js(入口

better-scroll在vue中的应用

在我们日常的移动端项目开发中,处理滚动列表是再常见不过的需求了,以滴滴为例,可以是这样竖向滚动的列表,如图所示: 微信 -> 钱包->滴滴出行"体验效果. 什么是 better-scroll better-scroll 是一个移动端滚动的解决方案,它是基于 iscroll 的重写,它和 iscroll 的主要区别在 这里 .better-scroll 也很强大,不仅可以做普通的滚动列表,还可以做轮播图.picker 等等. 不少同学可能用过 better-scroll,我收到反馈最多

Vue中如何使用axios发送jsonp跨域验证

https://cnodejs.org/topic/5930430f03dba3510d8a62c6 在使用axios发送请求时,服务器端设置 res.header("Access-Control-Allow-Origin", "*");可以正确得到结果 当服务器端不设置允许跨域时,使用jsonp方式发送就不行了,提示错误如下 XMLHttpRequest cannot load http://localhost:3000/axios?cb=cb. No 'Acce