Vuejs第十篇之vuejs父子组件通信


Posted in Javascript onSeptember 06, 2016

本篇文章是小编结合官方文档整理的一套更加细致,代码更多更全的教程,非常不错,比较适合新手阅读。

本篇资料来于官方文档:

http://cn.vuejs.org/guide/components.html#u7236_u5B50_u7EC4_u4EF6_u901A_u4FE1

父子组件通信

①访问子组件、父组件、根组件;

this.$parent 访问父组件

this.$children 访问子组件(是一个数组)

this.$root 根实例的后代访问根实例

示例代码:

<div id="app"> 
父组件: 
<input v-model="val"><br/> 
子组件: 
<test :test="val"></test> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
val: 1 
}, 
components: { 
test: { 
props: ['test'], 
template: "<input @keyup='findParent' v-model='test'/>", 
methods: { 
findParent: function () { 
console.log(this.$parent); //访问根组件 
console.log(this.$parent.val); //访问根组件的val属性 
console.log(this.$parent.$children.indexOf(this)); //查看当前能否在其父组件的子组件中找到索引 
console.log(this.$parent === this.$root); //查看父组件和根组件是不是全等的(因为他的父组件就是根组件) 
} 
} 
} 
} 
}); 
</script>

当在子组件的输入框按键弹起时,显示内容依次为:

父组件、父组件的输入框的值(默认情况是1)、0(表示是父组件的children属性中的第一个元素)、true(由于父组件就是根组件,所以是全等的);

通过这样的方法,可以在组件树中进行互动。

②自定义事件:

首先,事件需要放置在events属性之中,而不是放置在methods属性中(新手很容易犯的错误),只能触发events属性中的事件,而methods属性中的事件是无法触发的。

其次,向上派发和向下广播有所区别:向上派发会触发自身同名事件,而向下广播不会;

第三,向上派发和向下广播默认只会触发直系(子或者父,不包括祖先和孙)的事件,除非事件返回值为true,才会继续在这一条线上继续。

第四,事件不能显式的通过 this.事件名 来调用它。

示例代码:

<div id="app"> 
父组件: 
<button @click="parentClick">点击向下传播broadcast</button> 
<br/> 
子组件1: 
<children1></children1> 
<br/> 
另一个子组件1: 
<another-children1></another-children1> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
val: 1 
}, 
methods: { 
parentClick: function () { 
this.$broadcast("parentClick", "abc"); 
} 
}, 
events: { 
childrenClick: function () { 
console.log("childrenClick-Parent"); 
}, 
parentClick: function () { 
console.log("parentClick-Parent"); 
return true; 
} 
}, 
components: { 
children1: { //这个无返回值,不会继续派发 
props: ['test'], 
template: "<button>children1</button></br>子组件2:<children2></children2>", 
events: { 
childrenClick: function () { 
console.log("childrenClick-children1"); 
}, 
parentClick: function (msg) { 
console.log("parentClick-Children1"); 
console.log("message:" + msg); 
} 
}, 
components: { 
children2: { 
props: ['test'], 
template: "<button @click='findParent'>children-Click</button>", 
methods: { 
findParent: function () { 
this.$dispatch('childrenClick'); 
} 
}, 
events: { 
childrenClick: function () { 
console.log("childrenClick-children2"); 
}, 
parentClick: function (msg) { 
console.log("parentClick-Children2"); 
console.log("message:" + msg); 
} 
} 
} 
} 
}, 
anotherChildren1: { //这个是返回值为true,会继续向子组件的子组件派发 
props: ['test'], 
template: "<button>anotherChildren1</button></br>另一个子组件2:<another-children2></another-children2>", 
events: { 
childrenClick: function () { 
console.log("childrenClick-anotherChildren1"); 
return true; 
}, 
parentClick: function (msg) { 
console.log("parentClick-anotherChildren1"); 
console.log("message:" + msg); 
return true; 
} 
}, 
components: { 
anotherChildren2: { 
props: ['test'], 
template: "<button @click='findParent'>anotherChildren2-Click</button>", 
methods: { 
findParent: function () { 
this.$dispatch('childrenClick'); 
} 
}, 
events: { 
childrenClick: function () { 
console.log("childrenClick-anotherChildren2"); 
}, 
parentClick: function (msg) { 
console.log("parentClick-anotherChildren2"); 
console.log("message:" + msg); 
} 
} 
} 
} 
} 

} 
}); 
</script> 
}, 
parentClick: function () { 
console.log("parentClick-anotherChildren2"); 
} 
} 
} 
} 
} 

} 
}); 
</script>

说明:

【1】点击父组件的按钮,会向下广播,然后触发子组件1本身,另外一个子组件1,以及另一个子组件2;

【2】点击子组件2的按钮,会触发子组件2的事件和子组件1的事件,但不会触发父组件的按钮;

【3】点击另一个子组件2的按钮,会触发另一个子组件2的事件,另一个子组件1的事件和父组件的事件(因为另一个子组件1的事件的返回值为true);

③使用v-on绑定自定义事件:

【1】简单来说,子组件触发某个事件(events里的方法)时,父组件也会执行某个方法(父组件methods里的方法)。

【2】触发的绑定写在模板之中(即被替换的那个template模板中),可以多个子组件的事件绑定一个父组件的方法,或者不同子组件的事情绑定不同父组件的方法,但是不能同一个子组件事件绑定多个父组件的方法。

【3】子组件派发消息传递的参数,即使子组件的事件没有参数,也不影响将参数传递给父组件的方法(即父组件的方法可以接受到子组件方法获取的参数)

如示例:

<div id="app"> 
父组件: 
<button>点击向下传播broadcast</button> 
<br/> 
子组件1: 
<!--绑定写在这里,可以多个绑定同一个,或者不同绑定不同的,但不能一个绑定多个--> 
<children v-on:test="parent" @test2="another"></children> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
val: 1 
}, 
methods: { 
parent: function (arg) { 
console.log(arg); 
console.log("the first method with test event"); 
}, 
another: function () { 
console.log("another method"); 
} 
}, 
components: { 
children: { //这个无返回值,不会继续派发 
props: ['test'], 
template: "<button @click='childClick'>children1</button></br><button @click='childClick2'>children1</button>", 
methods: { 
childClick: function () { 
this.$emit("test", 'the argument for dispatch'); 
}, 
childClick2: function () { 
this.$emit("test2"); 
} 
}, 
events: { 
test: function () { 
console.log("test"); 
}, 
test2: function () { 
console.log("test2"); 
} 
} 
} 
} 
}); 
</script>

④子组件索引

简单来说:就是可以直接从索引获取到子组件,然后就可以调用各个子组件的方法了。

添加索引方法是:在标签里添加v-ref:索引名

调用组件方法是:vm.$ref.索引名

也可以直接在父组件中使用this.$ref.索引名

这个时候,就可以获得组件了,然后通过组件可以调用他的方法,或者是使用其数据。

示例代码:

<div id="app"> 
父组件: 
<button @click="todo">触发子组件的事件</button> 
<br/> 
子组件1: 
<!--绑定写在这里,可以多个绑定同一个,或者不同绑定不同的,但不能一个绑定多个--> 
<children v-ref:child></children> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
methods: { 
todo: function () { 
this.$refs.child.fromParent(); //通过索引调用子组件的fromParent方法 
} 
}, 
components: { 
children: { //这个无返回值,不会继续派发 
props: ['test'], 
template: "<button>children1</button>", 
methods: { 
fromParent: function () { 
console.log("happened fromParent by ref"); 
} 
} 
} 
} 
}); 
</script>

以上所述是小编给大家介绍的Vuejs第十篇之vuejs父子组件通信,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
Oct 24 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
Jan 06 Javascript
raphael.js绘制中国地图 地图绘制方法
Feb 12 Javascript
node+express+ejs制作简单页面上手指南
Nov 26 Javascript
JavaScript中实现sprintf、printf函数
Jan 27 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
JS实现样式清新的横排下拉菜单效果
Oct 09 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
May 08 jQuery
Vue.js项目部署到服务器的详细步骤
Jul 17 Javascript
BootStrap TreeView使用实例详解
Nov 01 Javascript
JavaScript设计模式之建造者模式实例教程
Jul 02 Javascript
webpack4.x打包过程详解
Jul 18 Javascript
Vue.js每天必学之方法与事件处理器
Sep 06 #Javascript
基于JavaScript实现购物网站商品放大镜效果
Sep 06 #Javascript
AngularGauge 属性解析详解
Sep 06 #Javascript
AngularJS 面试题集锦
Sep 06 #Javascript
BootStrap glyphicon图标无法显示的解决方法
Sep 06 #Javascript
JS原型链 详解及示例代码
Sep 06 #Javascript
JavaScript中push(),join() 函数 实例详解
Sep 06 #Javascript
You might like
php中批量替换文件名的实现代码
2011/07/20 PHP
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
js正确获取元素样式详解
2009/08/07 Javascript
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
brook javascript框架介绍
2011/10/10 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
React Router基础使用
2017/01/17 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
Javascript继承机制详解
2017/05/30 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
python实现Flappy Bird源码
2018/12/24 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
学校门卫管理制度
2014/01/30 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
公司介绍信范文
2015/01/31 职场文书
旷工辞退通知书
2015/04/17 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
如何用Python搭建gRPC服务
2021/06/30 Python