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 相关文章推荐
js控制div及网页相关属性的代码
Dec 19 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
Dec 10 Javascript
JS文本框不能输入空格验证方法
Mar 19 Javascript
JQuery实现表格中相同单元格合并示例代码
Jun 26 Javascript
JS中表单的使用小结
Jan 11 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 Javascript
DOM基础教程之使用DOM设置文本框
Jan 20 Javascript
AngularJS 霸道的过滤器小结
Apr 26 Javascript
JS按条件 serialize() 对应标签的使用方法
Jul 24 Javascript
node结合swig渲染摸板的方法
Apr 11 Javascript
JS使用正则表达式判断输入框失去焦点事件
Oct 16 Javascript
javascript的hashCode函数实现代码小结
Aug 11 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编码规范-php coding standard
2007/03/16 PHP
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
浅谈开发eslint规则
2018/10/01 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
python线程池threadpool使用篇
2018/04/27 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
python通过http下载文件的方法详解
2019/07/26 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
医药代表个人求职信范本
2013/12/19 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2016年暑期教师培训心得体会
2016/01/09 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python