需求:父子组件同步数据
实现方式: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. 牛客网小白月赛1 B,I

    #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> ...

  2. 无权二分图最大匹配 HDU2063 匈牙利算法 || Hopcroft-Karp

    参考两篇比较好的博客 http://www.renfei.org/blog/bipartite-matching.html http://blog.csdn.net/thundermrbird/art ...

  3. 【进击后端】Ubuntu 命令行 安装nginx

    一.安装nginx apt-get install nginx 安装路径为:/etc/nginx/conf.d 二.配置nginx,在conf.d目录下新建test.conf 新建文件的命令是vi t ...

  4. Redis集群方案之Twemproxy+HAProxy+Keepalived+Sentinel+主从复制(待实践)

    首先说明一下,Twemproxy+HAProxy+Keepalived+Sentinel+主从复制-这里提到的技术不一定全部都用上,但是全部用上之后可以达到高可用. 主从复制:实现数据一式多份的保障. ...

  5. TensorFlow-GPU环境配置之二——CUDA环境配置

    1.安装最新显卡驱动 到系统设置->软件和更新->附加驱动中选中最新的显卡驱动,并应用 2.下载CUDA8.0 https://developer.nvidia.com/cuda-down ...

  6. Java正则表达式过滤出字母、数字和中文

    原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A ...

  7. C#代码读写XML

    <1> 创建XML文档 using System; using System.Collections.Generic; using System.Linq; using System.Te ...

  8. Application特征

    1.位置:服务器内存,执行速度快2.使用范围:整个应用程序3.类型:任意类型4.声明周期:应用程序开始创建到销毁

  9. AutoCAD如何方便截图放到Word文档,改成白底黑字

    将模型视图切换到布局2即可   比如下图所示的效果   先回到模型视图把所有线条颜色都改成白色,然后添加适当的标注(比如要受力分析,则在CAD中绘制箭头也很方便的),文字说明.然后切换到布局2就OK ...

  10. Vijos 1451 圆环取数 【区间DP】

    背景 小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主…… 描述 守护者拿出被划分为n个格子的一个圆环,每个 ...