需求:父子组件同步数据
实现方式:sync或者v-model
一、sync
原理:
通常我们要父子组件中的数据时刻保持同步,可以这样:
父组件中的template:
<sycn-son :foo="fatherFoo"></sycn-son>
 
子组件注册foo数据:
props:{
foo: String
},
 
子组件改变:通过点击按钮,触发update事件,将值传入
<button @click="updateFoo">点击改变</button>
 
methods:{
updateFoo(){
this.$emit('update','foo被子组件改变啦')
}
}
 
父组件接收:
<sycn-son :foo="fatherFoo" v-on:update="sonFoo => fatherFoo = sonFoo"></sycn-son>
 
效果:
未点击:
 
点击改变:
父组件来点击改变:
 
这样就实现了父子组件同步数据,sync就是这样的原理,vue提供了sync修饰符简化了上面的代码
因此就可以这样写:
父组件:
<sycn-son :foo.sync="fatherFoo"></sycn-son>
 
子组件:
updateFoo(){
this.$emit('update:foo','foo被子组件改变啦')
}
 
效果:依旧如上图
代码:
父组件:
<template>
<div>
<sycn-son :foo.sync="fatherFoo"></sycn-son>
<br>
父组件的foo:{{fatherFoo}}
<button @click="syncFatherUpdate">父组件来点击改变</button>
</div> </template> <script>
import sycnSon from './sycnSon'
export default {
name: 'sycnFather',
components:{
  sycnSon
},
data () {
  return {
    fatherFoo:'我是一开始的foo'
  }
},
methods:{
  syncFatherUpdate (){
    this.fatherFoo = '被父组件改变'
  }  }
}
</script>
 
子组件:
<template>
<div>
子组件的foo:{{foo}}
<button @click="updateFoo">点击改变</button>
</div>
</template> <script>
export default {
name: 'sycnSon',
props:{
foo: String
}, methods:{
updateFoo(){
this.$emit('update:foo','foo被子组件改变啦')
}
}
}
</script>
 
注意:
当sync修饰的prop是个对象或者数组,虽然对象/数组是引用类型的,你直接修改子组件,会同时修改父组件的数据,但是会让数据流变得更加难以分析!所以要深度复制对象给一个新值,再改变新值传给父组件。
JSON.parse(JSON.stringify(this.analysisData))
 
 
二、v-model---只介绍父子组件双向绑定
v-model通常用于表单元素的双向绑定,v-model 是 .sync的一种体现。约定俗成是用于表单类型的双向绑定。可不可以用于其他的组件呢,当然可以,只是没有sync这么直观
1. 表单类型的双向绑定:
子组件:
<input :value="value" @input="$emit('input', $event.target.value)">
@input是自带的oninput事件,当输入框改变时,调用里面的事件。
 
父组件:
<model-son v-model="fatherMsg"></model-son>
相当于:
 
效果:
未改变输入框:
改变输入框:
点击父组件来点击改变:
 完整代码:
父组件:
<template>
<div>
<model-son v-model="fatherMsg"></model-son>
<br>
父组件:{{fatherMsg}}
<button @click="modelFatherUpdate">父组件来点击改变</button> </div> </template> <script>
import modelSon from './modelSon'
export default {
name: 'modelFather',
components:{
modelSon
},
data () {
return {
fatherMsg:'父组件一开始定义的fatherMsg'
}
},
methods:{
modelFatherUpdate (){
this.fatherMsg = 'fatherMsg被父组件改变'
} }
}
</script>

子组件:

<template>
<div>
子组件的msg:
<input :value="value" @input="$emit('input', $event.target.value)">
</div> </template> <script>
export default {
name: 'modelSon',
// 必须是value
props:{
value:String
},
}
</script>

注意:注册必须是value

 
2.自定义组件v-model双向绑定
官网:
子组件:首先要注册,和说明model
model: {
prop: 'msg',
event: 'change'
},
props:{
msg:String
},
使用model解释:prop属性说,我要将msg作为该组件被使用时v-model能取到的值,也就是一开始的值
event说,我emit ‘change’ 的时候,传入的参数值就是父组件v-model要收到的值。
 
父组件:使用v-model绑定自己的数据
<model-son v-model="fatherMsg"></model-son>
 
效果:
未点击时:
 
点击改变:
 
父组件来点击改变:
完整代码:
父组件:
<template>
<div>
<model-son v-model="fatherMsg"></model-son>
<br>
父组件:{{fatherMsg}}
<button @click="modelFatherUpdate">父组件来点击改变</button> </div> </template> <script>
import modelSon from './modelSon'
export default {
name: 'modelFather',
components:{
modelSon
},
data () {
return {
fatherMsg:'父组件一开始定义的fatherMsg'
}
},
methods:{
modelFatherUpdate (){
this.fatherMsg = 'fatherMsg被父组件改变'
} }
}
</script>
子组件:
<template>
<div>
子组件的msg:{{msg}}
<button @click="modelUpdate">点击改变</button>
</div> </template> <script>
export default {
name: 'modelSon',
model: {
prop: 'msg',
event: 'change'
},
props:{
msg:String
},
methods:{
modelUpdate (){
this.$emit('change','msg被子组件改变了!')
} }
}
</script>
 
待补充。。。
 
 
 
 
 
 
 
 
 
 

vue中sync,v-model----双向数据绑定的更多相关文章

  1. 怎样在 Vue 中使用 v-model 实现双向数据绑定?

    1. 所谓 双向数据绑定, 可以理解为: 修改 A , B 会跟着被修改, 修改 B , A 会跟着被修改. 常用在需要 进行用户输入的地方, 比如 这些 html 标签:  input.select ...

  2. Vue中.sync修饰符

    Vue 中 sync的作用 <FatherComponent :a.sync = 'b'><FatherComponent /> 子组件中emit('update:a',... ...

  3. vue.js--基础 事件结合双向数据绑定实现todolist 待办事项 已经完成 和进行中,键盘事件

    <template> <div id="app"> <h1>{{ msg }}</h1> <input type=" ...

  4. Vue指令之`v-model`和`双向数据绑定

     v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定 <input type="text" v-bind:value="msg& ...

  5. Vue学习笔记【7】——Vue指令之v-model和双向数据绑定

    v-model是唯一可以实现双向数据绑定的vue指令 单向数据绑定:修改内存中的数据,页面上同步更改.v-bind <!-- v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法 ...

  6. vue中v-model的数据双向绑定(重要)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. angular4.0中form表单双向数据绑定正确姿势

    issue:用[(ngModel)]="property"指令双向数据绑定,报错. reason1:使用ngModel绑定数据需要注入FormsModule模块,在app.modu ...

  8. angular,vue,react的基本语法—双向数据绑定、条件渲染、列表渲染、angular小案例

    基本语法: 1.双向数据绑定 vue 指令:v-model="msg" react constructor(){ this.state{ msg:"双向数据绑定" ...

  9. vue.js--基础 事件结合双向数据绑定实现todolist,增加和删除功能

    原理很简单,写一个input框,定义一个空的list,当在input中增加数据时,就往list中添加数据,然后在循环这个list的数据,删除数据就是调用list中的splice <templat ...

随机推荐

  1. MVC系统学习5——验证

    其实关于Mvc的验证在上一篇已经有讲过一些了,可以通过在我们定义的Model上面添加相应的System.ComponentModel.DataAnnotations空间下的验证属性.在服务器端通过Mo ...

  2. hdu 3691最小割将一个图分成两部分

    转载地址:http://blog.csdn.net/xdu_truth/article/details/8104721 题意:题给出一个无向图和一个源点,让你求从这个点出发到某个点最大流的最小值.由最 ...

  3. Rikka with Phi 线段树

    Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...

  4. POJ3295 Tautology 解题报告

    直接上分析: 首先 弄清各种大写字母的操作的实质 K 明显 是 and   & A 是 or      | N 是 not   ! C  由表格注意到 当 w<=x 时 值为1 E  当 ...

  5. Linux下tmp文件夹的文件自动删除的问题(转)

    场景: 近日发现有一台机器tmp文件夹下放置的文件无辜丢失,而且排查发现是自动丢失,并且,只是删除10天之前的文件. 本来以为是哪位写了一个自动执行脚本, find了一下10天前的文件删除了. 结果, ...

  6. JAVA分布式架构

  7. MongoDB小结01 - MongoDB简介

    我们为什么要去学习MongoDB MongoDB是一种强大.灵活.可扩展的数据存储方式. 丰富的数据模型 MongoDB是面向文档的数据库,不是关系型数据库.它将原来'行'(row)的概念换成了更加灵 ...

  8. linux 硬件中断调节

    什么是中断 中断interrupts是指硬件主动的来告诉CPU去做某些事情.比如网卡收到数据后可能主动的告诉CPU来处理自己接受到的数据,键盘有了按键输入后会主动告知CPU来读取输入. 硬件主动的打扰 ...

  9. 物理内存、虚拟内存、buffers、cached、共享内存、swap

    物理内存: 实际使用的内存: 虚拟内存: 虚拟内存是操作系统内核为了对进程地址空间进行管理(process address space management)而精心设计的一个逻辑意义上的内存空间概念. ...

  10. 『NSOperation、NSOperationQueue』详解

    1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...