Understand .sync in Vue
Preface
The first time I met .sync modifier, I didn't know it very well. So, I seldom use that. Today, I am going to get it.
Main
In the past, I use “two-way binding” like this:
```<div class="app" id="app">
<button-counter :child-count="parCount" @add="add"></button-counter>
<p>parent component {{parCount}}</p>
</div>
```
let app = new Vue({
el: '#app',
data: {
parCount: 0
},
methods: {
add() {
this.parCount++
}
},
components: {
'button-counter': {
template:
'<button @click="add">You clicked me {{ childCount }} times.</button>',
props: ['childCount'],
methods: {
add() {
this.$emit('add')
}
}
}
}
})
It was easy to understand except a little inconvenient. I need to listen and handle event in child and parent component. Also
true two-way binding can create maintenance issues, because child components can mutate the parent without the source of that mutation being obvious in both the parent and the child.
So, Vue recommends emitting events in the pattern of update:myPropName. For example:
```<div class="app" id="app">
<button-counter :child-count="parCount" @update:child-count="parCount=$event"></button-counter>
<p>parent component {{parCount}}</p>
</div>
```
let app = new Vue({
el: '#app',
data: {
parCount: 0
},
methods: {},
components: {
'button-counter': {
template:
'<button @click="add">You clicked me {{ childCount }} times.</button>',
props: ['childCount'],
methods: {
add() {
this.$emit('update:child-count', this.childCount + 1) // child-count is right while childCount won't work
}
}
}
}
})
See? In this case, we don't have to add event callback in parent component because vue have done that. And this is the principle of .sync. For convenience, Vue offers a shorthand for this pattern with the .sync modifier which would make the code above like:
```<div class="app" id="app">
<button-counter :child-count.sync="parCount"></button-counter>
<p>parent component {{parCount}}</p>
</div>
```
let app = new Vue({
el: '#app',
data: {
parCount: 0
},
methods: {},
components: {
'button-counter': {
template:
'<button @click="add">You clicked me {{ childCount }} times.</button>',
props: ['childCount'],
methods: {
add() {
this.$emit('update:childCount', this.childCount + 1) // childCount is right while child-count won't work
}
}
}
}
})
Also,
The .sync modifier can also be used with v-bind when using an object to set multiple props at once:
```<text-document v-bind.sync="doc"></text-document>
```
This passes each property in the doc object (e.g. title) as an individual prop, then adds v-on update listeners for each one.
For more information, go Vue.js
原文地址:https://segmentfault.com/a/1190000017107941
Understand .sync in Vue的更多相关文章
- 深入理解vue 修饰符sync【 vue sync修饰符示例】
在说vue 修饰符sync前,我们先看下官方文档:vue .sync 修饰符,里面说vue .sync 修饰符以前存在于vue1.0版本里,但是在在 2.0 中移除了 .sync .但是在 2.0 发 ...
- Vue 开发技巧或者说Vue知识点梳理(转,自个学习)
Vue 组件通讯 ——常见使用场景可以分为三类: 父子通信: 父向子传递数据是通过 props,子向父是通过 events($emit):通过父链 / 子链也可以通信($parent / $child ...
- 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据
前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰符做父子组件数据双向 ...
- vue学习:props,scope,slot,ref,is,slot,sync等知识点
1.ref :为子组件指定一个索引 ID,给元素或者组件注册引用信息.refs是一个对象,包含所有的ref组件. <div id="parent"> <user- ...
- 理解vue 修饰符sync
也是在vux中看到了这个sync 现在我们来看看vue中的sync 我们先看下官方文档:vue .sync 修饰符,里面说vue .sync 修饰符以前存在于vue1.0版本里,但是在在 2.0 中移 ...
- vue 之 .sync 修饰符
在一些情况下,我们可能会需要对一个 prop (父子组件传递数据的属性) 进行“双向绑定”. 在vue 1.x 中的 .sync 修饰符所提供的功能.当一个子组件改变了一个带 .sync 的prop的 ...
- vue中.sync 修饰符
一直以来,都不太明白.sync的用法,归根结底原因在于,没有仔细阅读“.sync修饰符”. 正好,最近在拿一个项目练手,然后使用了elment-ui,然后在用到dialog的时候,属性visible是 ...
- Vue自定义指令,ref ,sync,slot
一.自定义指令 vue中可以自己设置指令,通过directive来实现,有2种创建方式,一种是局部创建,一种是全局创建. 第一种:局部创建 如果想注册局部指令,组件中也接受一个 directives ...
- Vue sync修饰符的使用
父子组件传值,父组件可以给子组件传值,但是子组件是不能修改组件提供的值,这里vue提供了sync修饰符,以前父组件点击子组件显示,子组件关闭按钮,父组件再点击子组件就无法让子组件显示.因为子组件点击关 ...
随机推荐
- vue报错之Duplicate keys detected: '0'. This may cause an update error.
昨天运行vue项目的时候,出现了[Vue warn]: Duplicate keys detected: '0'. This may cause an update error(错误,检测到重复的ke ...
- Truck History(最小生成树)
poj——Truck History Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27703 Accepted: 10 ...
- Network | NAT
在计算机网络中,网络地址转换(Network Address Translation或简称NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP封包通过路由器或防火墙时重 ...
- Android 动态生成对话框和EditText
/** * (获取输入) */ private void showInputDialog() { ScrollView scrollview = getInitView() ; final Linea ...
- Android --修改arr文件
1. 改为zip文件 2. 修改 3. 改后缀
- 详解在Visual Studio中使用git版本系统(图文)
http://www.codesky.net/article/201111/123474.html 这篇教程的预期,是希望没有任何版本使用基础的新手也可以掌握,所以细节较多,不当之处,欢迎指正. 第一 ...
- .Net ToString Format [转]
源文 :http://blog.csdn.net/luyifeiniu/article/category/25663/2 stringstr1 =string.Format("{0:N1}& ...
- utuntu16.04安装tensorflow1.4-gpu
之前一直在windows下使用tensorflow,对cpu和gpu的安装都是比较顺利,都是使用anaconda环境下,创建虚拟conda环境,这样方便不同python版本的管理. 一直也想尝试使用u ...
- C++精华笔记
牛客微信推送的C++笔记:2016-12-12 14:23:26 1.C++不仅支持面向对象,也可以像C一样支持面向过程. 2.OOP三大特性:封装 继承 多态 3.函数重载依据:函数类型and形 ...
- 大型视频网站YouTube架构学习笔记
http://www.kaiyuanba.cn/html/1/131/147/7540.htm这几天一直在关注和学习一些大型网站的架构,希望有一天自己也能设计一个高并发.高容错的系统并能应用在实践上. ...