Vue.js-----轻量高效的MVVM框架(十、父子组件通信)
#1、父链
html:
<h3>#父链</h3>
<div>
<div>子组件可以用 this.$parent 访问它的父组件。根实例的后代可以用 this.$root 访问它。父组件有一个数组 this.$children,包含它所有的子元素。</div>
<div>
尽管可以访问父链上任意的实例,不过子组件应当避免直接依赖父组件的数据,尽量显式地使用 props 传递数据。另外,在子组件中修改父组件的状态是非常糟糕的做法,因为:
<ul>
<li>这让父组件与子组件紧密地耦合;</li>
<li>只看父组件,很难理解父组件的状态。因为它可能被任意子组件修改!理想情况下,只有组件自己能修改它的状态。
</li>
</ul>
</div>
<div id="dr01">
<child01></child01>
</div>
</div>
js: dr01作为父代组件,child01作为子代组件,grandson01作为孙代组件
//***************************************************************
//父链
//自定义子代组件child01
Vue.component("child01", {
data: function() {
return {
cMsg: "this is child msg!",
cParentMsg: this.$parent.dr01Msg, //child01的上级信息就是dr01的dr01Msg
cRootMsg: this.$root.rootMsg, //child01的根信息就是dr01的rootMsg
}
},
template: "<div>cMsg: {{cMsg}}, cParentMsg: {{cParentMsg}}, cRootMsg: {{cRootMsg}}</div>"
+"<grandson01 :s-parent-msg='cMsg'></grandson01>"
});
//自定义孙代组件grandson01,
Vue.component("grandson01", {
data: function() {
return {
sMsg: "this is grandsonMsg1",
sRootMsg: this.$root.rootMsg, //grandson01根信息就是dr01的rootMsg
}
},
//grandson01上级信息就是child01的cMsg,
//在这里使用props属性,将子代cMsg赋给孙代的“sParentMsg”,示例:在子代模板中:<grandson01 :s-parent-msg='cMsg'></grandson01>
props:["sParentMsg"],
template: "<div>sMsg: {{sMsg}}, sParentMsg: {{sParentMsg}}, sRootMsg: {{sRootMsg}}</div>"
})
var dr01 = new Vue({
el: "#dr01",
data: {
dr01Msg: "this is dr01Msg!",
rootMsg: "this is rootMsg!",
},
});
结果:

#2、自定义事件
html:
<h3>#自定义事件</h3>
<template id="dr02-temp">
<input v-model="msg" placeholder="please input your message!" />
<button @click="notifyAdd(msg)">Dispatche Event</button>
</template>
<div id="dr02">
<div>
<span>每个 Vue 实例都是一个事件触发器:</span>
<ol>
<li>使用 $on() 监听事件;</li>
<li>使用 $emit() 在它上面触发事件;</li>
<li>使用 $dispatch() 派发事件,事件沿着父链冒泡;</li>
<li>使用 $broadcast() 广播事件,事件向下传导给所有的后代。</li>
</ol>
</div>
<p>Messages: {{messages|json}}</p>
<child02></child02>
</div>
js:
//***************************************************************
//自定义事件
Vue.component("child02", {
//定义模板中初始化的值
data: function() {
return {
msg: "hello",
}
},
//指定模板为id为"dr02-temp"标签
template: "#dr02-temp",
methods: {
//当点击按钮时会触发的事件
notifyAdd: function(msg) {
console.log("invoke notifyAdd()");
if (msg.trim()) {
//将事件分发到vm实例中的"addMsg"事件中
this.$dispatch("addMsg", msg);
this.msg = "";
}
}
}
});
var dr02 = new Vue({
el: "#dr02",
//初始化messages数组
data: {
messages: [],
},
events: {
//分发事件到vm实例中, 在创建实例时 `events` 选项简单地调用 `$on`
addMsg: function(msg) {
console.log("invoke events's addMsg()");
this.messages.push(msg);
}
},
});
结果:

#3、使用v-on绑定自定义事件
html:
<h3>使用v-on绑定自定义事件</h3>
<template id="dr03-temp">
<input v-model="msg" placeholder="input msg..." />
<button @click="dispatchMsg(msg)">处理msg</button>
</template>
<div id="dr03">
<p>Messages: {{messages|json}}</p>
<child03 v-on:dispatchMsg="addMsg"></child03>
</div>
js:
//***************************************************************
//使用v-on绑定自定义事件(在这里测试的时候发现,在dispatchMsg方法中依然要写this.$dispatch,不然只能监听到dispatchMsg方法,并不能向上冒泡)
//这里哪儿不对,问题出现在哪里????
//这里选择使用局部注册组件的方式测试。
var child03 = Vue.extend({
data: function() {
return {
msg: 'hello, child03!',
}
},
template: "#dr03-temp",
methods: {
dispatchMsg: function() {
console.log("invoke dispatchMsg()");
if (this.msg.trim()) {
//尽管使用了v-on绑定了自定义事件dispatchMsg到vm实例中的addMsg方法中,但是依然不会向上冒泡,这里事实上是有问题的。
this.$dispatch("addMsg", this.msg);
this.msg = '';
}
}
}
});
var dr03 = new Vue({
el: "#dr03",
data: {
messages: [],
},
events: {
addMsg: function(msg) {
console.log("invoke addMsg() msg: " + msg);
this.messages.push(msg);
}
},
components: {
"child03": child03,
}
});
结果与上面类似,只是多了控制台的输出

#子组件索引
html:
<h3>子组件索引</h3>
<div id="dr04">
<div>
尽管有 props 和 events,但是有时仍然需要在 JavaScript 中直接访问子组件。为此可以使用 v-ref 为子组件指定一个索引 ID。
</div>
<child03 v-ref:c03></child03>
<child04 v-ref:c04></child04>
</div>
js:
//***************************************************************
//字组件索引
Vue.component("child03", {
template: "<div>this is child03</div>"
});
Vue.component("child04", {
template: "<div>this is child04</div>"
});
var dr04 = new Vue({
el: "#dr04"
});
var child03 = dr04.$refs.c03;
var child04 = dr04.$refs.c04;
console.log("child03.$el: ");
console.log(child03.$el);
console.log("child04.$el: ");
console.log(child04.$el);
结果展示:

Vue.js-----轻量高效的MVVM框架(十、父子组件通信)的更多相关文章
- Vue.js-----轻量高效的MVVM框架(一、初识Vue.js)
1.什么是Vue.js? 众所周知,最近几年前端发展非常的迅猛,除各种框架如:backbone.angular.reactjs外,还有模块化开发思想的实现库:sea.js .require.js .w ...
- Vue.js-----轻量高效的MVVM框架(二、Vue.js的简单入门)
1.hello vue.js! (1)引入vue.js <script type="text/javascript" src="js/vue.js"> ...
- Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据)
#使用props传递数据 html:传递普通的字符串 <h3>#使用props传递数据</h3> <div id="dr01"> <div ...
- Vue.js-----轻量高效的MVVM框架(七、表单控件绑定)
话不多说,先上完整代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- Vue.js-----轻量高效的MVVM框架(八、使用组件)
什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有 ...
- Vue.js-----轻量高效的MVVM框架(六、Class与Style绑定)
这个相对来说简单,看一遍代码就懂. 一.完整片段: <!DOCTYPE html> <html> <head> <meta charset="UTF ...
- Vue.js-----轻量高效的MVVM框架(五、计算属性)
#基础例子 <div id="dr01"> <h4>#基础例子</h4> <div> num01={{num01}}, num02= ...
- Vue.js-----轻量高效的MVVM框架(四、指令)
Vue指令 指令 (Directives) 是特殊的带有前缀 v- 的特性.指令的值限定为绑定表达式,因此上面提到的 JavaScript 表达式及过滤器规则在这里也适用.指令的职责就是当其表达式的值 ...
- Vue.js-----轻量高效的MVVM框架(三、认识数据绑定)
插值 1.文本插值 (1)双向数据绑定 v-model="msg0101",一旦v-model中的数值发生变化,所有用vue表达式{{msg0101}}的数据都会更新. (2)单次 ...
- Vue.js-----轻量高效的MVVM框架(十二、组件动态切换)
在写html的过程中,我们经常会遇到要写tabs的切换,类似于这样: 在vue中,我们也有自己的组件和属性来实现这样的效果,这个东西我们叫做动态组件. html: <h3>动态组件< ...
随机推荐
- 在Oracle 12C中使用scott账号
在Oracle11g中默认是有scott账号的,但在Oracle 12C中则不能直接使用. 我的机器环境: 操作系统:Windows Server 2008 R2 64位 Oracle版本:Oracl ...
- Android 之 信息通知栏消息Notification
Notification是安卓手机顶部的消息提示 这里我们分别设置两个按钮,来实现顶部消息的发送和取消 功能实现 首先要在主Activity中设置一个通知控制类 NotificationManager ...
- ZROI2018提高day6t1
传送门 分析 我们发现这个四元组可以分解成一个逆序对拼上一个顺序对,这个线段树搞搞然后乘一下就可以求出来了,但是我们发现可能有(a,b)为逆序对且(b,c)为顺序对的情况,所以要进行容斥,我们只需要枚 ...
- ZROI2018普转提day2t4
传送门 分析 考场上暴力水过好评... 然后我的st表查询似乎是log的,然后log三方跑的比log方快,qwq. 我们发现如果一个区间的最小值就是这个区间的gcd,则这个区间合法.所以我们二分区间长 ...
- 树莓派研究笔记(7)-- lakka 《仙剑奇侠传》的完美移植
仙剑,这是我玩的第一个电脑游戏.真的太经典,无法超越.原来第一次玩的缺少开场动画,很多地方不明不白的.现在终于我们可以把这个梦想继续到树莓派中. LAKKA是支持DOS模拟器的,所以我们一定要下载DO ...
- C++面试笔记--单链表
1.编程实现单链表删除节点. 解析:如果删除的是头节点,如下图: 则把head指针指向头节点的下一个节点.同时free p1,如下图所示: 如果删除的是中间节点,如下图所示: 则用p2的n ...
- Win提权思路,方法,工具(小总结)[转]
Win提权思路,方法,工具(小总结)[转] 看到这个文章,感觉整理的不错,就收藏下了. 介绍 windows提权总是被归结为适当的枚举.但要完成适当的枚举,你需要知道要检查和查找的内容.这通常需要伴随 ...
- idea中解决spring配置文件命名空间(namespace)出现红色问题
在配置dubbo项目时,开始时经常出现dubbo错误,如下图: 修改方式已经出现在提示中了,具体这个更改: 1. 解压dubbo-2.5.4.jar这样的包(具体看你使用的版本),选择:META-IN ...
- 20169219《Linux内核原理与分析》第八周作业
网易云课堂学习 task_struct数据结构 struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标 ...
- javascript 字典类型的使用
javascript 字典类型的使用 1.使用Array: var arr = new Array(); arr["zs"] = "zhangsan"; ar ...