Vuejs——(10)组件——父子组件通信
版权声明:出处http://blog.csdn.net/qq20004604
本篇资料来于官方文档:
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属性中的事件是无法触发的。
事件 |
说明 |
$on(事件名) |
事件名的类型是字符串(下同),调用它可以通过this.$on()来调用; |
$emit(事件名, 参数) |
用于触发事件,参数是用于传递给事件的参数。这个用于触发同级事件(当前组件的) |
$dispatch(事件名, 参数) |
①向上派发事件,用于向父组件传播。 ②会首先触发当前组件的同名事件(如果有); ③然后会向上冒泡,当遇到第一个符合的父组件的事件后触发并停止; ④当父组件的事件的返回值设为true会继续冒泡去找下一个。 |
$broadcast(事件名, 参数) |
①向下广播事件,用于向所有子组件传播。 ②默认情况是仅限子组件; ③子组件事件的返回值是true,才会继续向该子组件的孙组件派发; ④不会触发自身同名事件; |
其次,向上派发和向下广播有所区别:向上派发会触发自身同名事件,而向下广播不会;
第三,向上派发和向下广播默认只会触发直系(子或者父,不包括祖先和孙)的事件,除非事件返回值为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——(10)组件——父子组件通信的更多相关文章
- vue组件父子间通信之综合练习--假的聊天室
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- vue组件-构成组件-父子组件相互传递数据
组件对于vue来说非常重要,学习学习了基础vue后,再回过头来把组件弄透! 一.概念 组件意味着协同工作,通常父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B . 它们之间必然需要相互通信 ...
- vue组件父子组件传递引用类型数据
今天在写分页功能时,发现父子组件传值时,子组件监听不到父组件中数据的变化,传递的是一个引用类型的数据 其原因是引用类型共用一个内存地址,父子组件用的是同一个对象,故子组件监听不到变化,此时就需要做一个 ...
- vue组件父子间通信02
三.组件间通信($parent $refs) 父组件要想获取子组件的数据:①在调用子组件的时候,指定ref属性<child-component ref="mySon"> ...
- Vue组件父子间通信01
子组件传递数据 用户已经登录 父组件接收数据 并显示列表,未登录不显示列表 /* 有两个组件,分别是main-component,header-component.main-component是由he ...
- Angular组件——父子组件通讯
Angular组件间通讯 组件树,1号是根组件AppComponent. 组件之间松耦合,组件之间知道的越少越好. 组件4里面点击按钮,触发组件5的初始化逻辑. 传统做法:在按钮4的点击事件里调用组件 ...
- vue全局组件-父子组件传值
全局组件注册方式:Vue.component(组件名,{方法}) demo: 子组件:upload.vue <template> <div > <div class=&q ...
- vue组件父子组件之间传递数据
举个栗子: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- React之父子组件之间传值
1.新增知识点 /** React中的组件: 解决html 标签构建应用的不足. 使用组件的好处:把公共的功能单独抽离成一个文件作为一个组件,哪里里使用哪里引入. 父子组件:组件的相互调用中,我们把调 ...
随机推荐
- Java 身份证号码验证
身份证号码验证 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码 2.地址码(前 ...
- 小程序获取微信用户的openid
小程序获取微信用户的openid //index.js //获取应用实例 const app = getApp() Page({ globalData: { appid: '11121221a89e0 ...
- leetcode62
使用排列组合计算公式来计算,注意使用long long型数据保证计算不会溢出. class Solution { public: int M, N; ; //从根到叶子有多少个分支,就表示有多少种路径 ...
- 第一篇、Python初识
1.Python文件后缀是否可以任意? 单独执行的时候没关系,但当文件需要导入(即导入模块)的时候,如果不是py后缀的,会出错. 2.执行方法 1) python +文件路径 python + fil ...
- LeetCode OJ 102. Binary Tree Level Order Traversal
题目 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to rig ...
- 使用openpyxl复制整张sheet
通过无能的baidu逛了一圈,发现有两三段能用的代码,不过参考之下,发现还有不足的: 不能拷贝有合并格式的sheet.没有拷贝cell的相关格式(填充.边框.对齐)等参数 所以通过bing继续发掘,最 ...
- 自定义模块和grains
一.自定义模块 saltstack有很多模块,模块的源码文件是在salt项目的:salt/modules.py; salt linux-node2-computer sys.doc 查看有哪些mo ...
- JAVA字符串类
一.字符串类String1.String是一个类,位于java.lang包中2.创建一个字符串对象的2种方式: String 变量名=“值”; String 对象名=new String(“值”);3 ...
- texmaker报错:could not start command 解决
我当时文件命名加了邮箱,引入特殊字符@,然后就报错了
- 大数据入门到精通12--spark dataframe 注册成hive 的临时表
一.获得最初的数据并形成dataframe val ny= sc.textFile("data/new_york/")val header=ny.firstval filterNY ...