vue父子组件通信
一、父子组件间通信
vue.js 2.0提供了一个ref 的属性: 可以为子组件指定一个索引id
父组件:
<template>
<div id='user-login'>
<h2 class='text-center'>用户登录</h2>
<form class='form-horizontal' role='form'>
<user-name ref='uname' placeholder='请输入你的用户名'></user-name>
<user-submit></user-submit>
</form>
</div>
</template>
<style>
#user-login{
margin-top: 50px;
}
</style> <script>
import username from './loginName.vue'
import usersubmit from './loginSubmit.vue'
export default{
components: {
'user-name': username,
'user-submit': usersubmit
}
}
</script>
子组件一:
<template>
<div>
<div class='form-group'>
<label>用户名</label>
<div>
<input type='text' class='form-control' v-model="username" :placeholder='username'>
</div>
</div>
</div>
</template> <script>
export default{
props: ['placeholder'],
data: function () {
return {username: '张三'}
}
}
</script>
子组件2:
<template>
<div class="form-group">
<div>
<button type="button" class="btn btn-default" v-on:click="test">提交</button>
</div>
</div>
</template>
<script>
export default{
data () {
},
methods: {
test () {
alert(this.$parent.$refs.uname.$data.username)
}
}
}
</script> 二、父子之间通信之自定义事件
父组件:
<template>
<div id='user-login'>
<h2 class='text-center'>用户登录</h2>
<form class='form-horizontal' role='form'>
<user-name placeholder='请输入你的用户名' @updateUserName="setUserName"></user-name>
<user-submit></user-submit>
</form>
</div>
</template>
<style>
#user-login{
margin-top: 50px;
}
</style> <script>
import username from './loginName.vue'
import usersubmit from './loginSubmit.vue'
export default{
components: {
'user-name': username,
'user-submit': usersubmit
},
data () {
return {
username: ''
}
},
methods: {
setUserName (uname) {
this.username = uname
}
}
}
</script> 子组件1:
<template>
<div>
<div class='form-group'>
<label>用户名</label>
<div>
<input type='text' class='form-control' v-model='username' :placeholder='username' @change='userNameChange'>
</div>
</div>
</div>
</template> <script>
export default{
props: ['placeholder'],
data: function () {
return {
username: '张三'
}
},
methods: {
userNameChange () {
// 调用父组件的方法
this.$emit('updateUserName', this.username)
}
}
}
</script> 子组件2:
<template>
<div class="form-group">
<div>
<button type="button" class="btn btn-default" v-on:click="test">提交</button>
</div>
</div>
</template>
<script>
export default{
data () {
return { }
},
methods: {
test () {
alert(this.$parent.$data.username)
}
}
}
</script>
三、子组件何时被挂载到父组件上的?动态绑定组件
在mounted时
父组件:
<template>
<div id='user-login'>
<h2 class='text-center'>用户登录</h2>
<form class='form-horizontal' role='form'>
<user-name placeholder='请输入你的用户名' @updateUserName='setUserName'></user-name>
<user-area></user-area>
<user-submit></user-submit>
</form>
</div>
</template>
<style>
#user-login{
margin-top: 50px;
}
</style> <script>
import username from './loginName.vue'
import usersubmit from './loginSubmit.vue'
import userArea from './loginArea.vue'
export default{
components: {
'user-name': username,
'user-submit': usersubmit,
'user-area': userArea
},
data () {
return {
username: ''
}
},
mounted () {
// alert(this.$children.length) // 结果为4,说明子组件到这里已经挂载上了
this.$children.forEach(function (cc) {
cc.$on('childChange', this.setValue)
}.bind(this))
},
methods: {
setUserName (uname) {
this.username = uname
},
setValue (key, value) {
this.$data[key] = value
alert(this.$data[key])
}
}
}
</script>
子组件1:
<template>
<div>
<div class='form-group'>
<label>用户名</label>
<div>
<input type='text' class='form-control' v-model='username' :placeholder='username' @change='userNameChange'>
</div>
</div>
</div>
</template> <script>
export default{
props: ['placeholder'],
data: function () {
return {
username: '张三'
}
},
methods: {
userNameChange () {
// 调用父组件的方法
this.$emit('updateUserName', this.username)
}
}
}
</script>
子组件2:
<template>
<div class='form-group'>
<label class='col-sm-2'>地区</label>
<div class='col-sm-10'>
<select v-model='selectedIndex' class='form-group' v-on:change='seletecChange'>
<option v-for='a in areas' v-bind:value='a.id'>{{a.text}}</option>
</select>
</div>
</div>
</template> <script>
export default{
data () {
return {
selectedIndex: 0,
areas: [
{'id': 0, 'text': '--请选择--'},
{'id': 1, 'text': '北京'},
{'id': 2, 'text': '上海'}
]
}
}, methods: {
seletecChange () {
this.$emit('childChange', 'userarea', this.selectedIndex)
}
}
}
</script>
子组件3:
<template>
<div class="form-group">
<div>
<button type="button" class="btn btn-default" v-on:click="test">提交</button>
</div>
</div>
</template>
<script>
export default{
data () {
return { }
},
methods: {
test () {
alert(this.$parent.$data.username)
}
}
}
</script>
四、搜索框功能
<template>
<div class='form-group'>
<label class='col-sm-2 control-label'>爱好</label>
<div class='col-sm-10'>
<input type='text' class='form-control' v-model='inputText'>
<br>
<table class='table table-bordered' v-if='showTable()'>
<thead>
<th>类别1</th>
<th>类别2</th>
</thead>
<tbody>
<tr v-for='f in favs'>
<td>{{f.class1}}</td>
<td>{{f.class2}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</template> <script>
export default{
data () {
return {
inputText: '',
favs: [
{'class1': '前端开发', 'class2': 'js'},
{'class1': '后端开发', 'class2': 'java'}
]
}
},
methods: {
showTable () {
if (this.inputText === '') return false
return true
}
},
computed: {
getFavs () {
return this.favs.filter(function (value) {
if (value.class2.indexOf(this.inputText) >= 0) {
return true
} else {
return false
}
}.bind(this))
}
}
}
</script>getFavs方法返回一个新的数组,array.filter(callback)回调函数内部做了判断,最后返回符合判断条件的新的数据。
vue父子组件通信的更多相关文章
- Vue父子组件通信(父级向子级传递数据、子级向父级传递数据、Vue父子组件存储到data数据的访问)
Vue父子组件通信(父级向子级传递数据.子级向父级传递数据.Vue父子组件存储到data数据的访问) 一.父级向子级传递数据[Prop]: ● Prop:子组件在自身标签上,使用自定义的属性来接收外界 ...
- vue 父子组件通信
算是初学vue,整理一下父子组件通信笔记. 父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息. 一.父组件向子组件下发数据: 1.在子组件中显式地用props选项声明它预期的数据 ...
- vue父子组件通信高级用法
vue项目的一大亮点就是组件化.使用组件可以极大地提高项目中代码的复用率,减少代码量.但是使用组件最大的难点就是父子组件之间的通信. 子通信父 父组件 <template> <div ...
- vue 父子组件通信详解
这是一篇详细讲解vue父子组件之间通信的文章,初始学习vue的时候,总是搞不清楚几个情况 通过props在父子组件传值时,v-bind:data="data",props接收的到底 ...
- vue 父子组件通信props/emit
props 1.父组件传递数据给子组件 父组件: <parent> <child :childMsg="msg"></child>//这里必须要 ...
- beego+vue父子组件通信(父子页面传值、父子组件传值、父子路由传值)
场景:有head和foot,为父组件 侧栏tree为子组件 点击tree,右侧孙组件根据点击tree的id,来更改表格内容. 首先是父子(本例中是子组件与孙组件)通信,目前是父传到子,暂时还没有子传到 ...
- vue父子组件通信传值
父组件 -> 子组件 通过props来进行通信 父组件代码: <Children :dataName = "dataContent" /> //dataName: ...
- Vue 父子组件通信入门
父组件向子组件传值 1.组件实例定义方式,注意:子组件一定要使用props属性来定义父组件传递过来的数据 <script type="text/javascript"> ...
- vue 父子组件通信-props
父组件:引用了ComBack组件 ComBack组件:引用了BasicInfor组件 先使用props获取父组件的headInfo这个对象,这里注意(default)默认返回值要用工厂形式返回 Bas ...
随机推荐
- 小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法
前言:在前两篇文章中分别介绍了动态代理.反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章.经过了前面两篇文章的铺垫,终于可以玩点真刀实弹的了,本篇将会通过 Hook 掉 s ...
- 【bzoj2819】Nim
Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游 ...
- 解决 lispbox macOS 不兼容问题
误打误撞,解决了很重要的入门级问题,简要记录下. lispbox 官网末尾说目前暂不兼容 10.4 以上系统: TODO: Compile on Mac OS X 10.4, for compatab ...
- Linux系统C语言socket tcp套接字编程
1.套接字的地址结构: typedef uint32_t in_addr_t; //32位无符号整数,用于表示网络地址 struct in_addr{ in_addr_t s_addr; //32位 ...
- 在 overlay 中运行容器 - 每天5分钟玩转 Docker 容器技术(51)
上一节我们创建了 overlay 网络 ov_net1,今天将运行一个 busybox 容器并连接到 ov_net1: 查看容器的网络配置: bbox1 有两个网络接口 eth0 和 eth1.eth ...
- python 分支语句 循环语句
分支语句 #if-else if a > b: print('aaa') else: print('bbb') #if-elif-else if a > b: print('a>b' ...
- Thinkphp5 实现悲观锁
悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依 ...
- Linux操作系统-命令-vmstat
叨叨两句 涉及监控服务器性能的命令,除了有vmstat之外,还有top.iostat.netstat.本文只是介绍一下这4个命令中的1个.剩下的3个命令可以参考以下网上的资料就差不多能会了. 推荐to ...
- getNextElement( )函数——获取下一个特定的元素节点
function getNextElement(node){ //定义getNextElement()函数 if (node.nodeType==){ //条件:如果node参数nodetype属性为 ...
- mysql中kill掉所有锁表的进程
--mysql中kill掉所有锁表的进程 --------------------------------2014/05/20 在数据库的管理中,我们经常会碰到锁表的问题,看一下进程列表. mysql ...