这里主要是对vue文档中的sync进行一个再解释:

如果自己尝试的话,最好在已经使用emit 和prop实现了双向绑定的组件中尝试,以免出现不必要的错误;

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<style type="text/css">
</style>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js" ></script>
<div id="app">
      <child v-bind:setname="name" v-on:update:setname="getNewName"></child>
你的名字:{{name}}
</div>
<script>
Vue.component('child',{
props: ['name'],
data: function(){
return {
newName: this.name
}
},
template:'<input type="text" @keyup="changeName" v-model="newName" />',
methods: {
changeName: function(){
this.$emit('update:setname',this.newName);
}
}
});
new Vue({
el:'#app',
data: {
name:'Jhon'
},
methods:{
getNewName: function(newName){
this.name = newName;
}
}
});
</script>
</html>

第一步:将子组件的emit事件修改为update形式

在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以修改父组件,且在父组件和子组件都没有明显的改动来源。

这也是为什么我们推荐以 update:myPropName 的模式触发事件取而代之。

this.$emit('update:title', newTitle)
emit都知道是子组件向父组件派发事件; 从 update:myPropName 我们可以得知 update:后的值是不固定的;

第二步: 改变父组件的v-bind

然后父组件可以监听那个事件并根据需要更新一个本地的数据属性。例如:

<text-document
v-bind:title="doc.title"
v-on:update:title="doc.title = $event"
></text-document>
在父组件中,v-bind:后的值title也是不固定的,而=后的“doc.title”则是父组件中存在的本地数据

为了方便起见,我们为这种模式提供一个缩写,即 .sync 修饰符:

<text-document v-bind:title.sync="doc.title"></text-document>
简写

注意带有 .sync 修饰符的 v-bind 不能和表达式一起使用 (例如 v-bind:title.sync=”doc.title + ‘!’” 是无效的)。取而代之的是,你只能提供你想要绑定的属性名,类似 v-model

如果子组件派发出来的事件,需要经过表达式的改写(如 取反之类的)都无法使用sync; 你可以使用比较好用的 emit 和prop来实现双向绑定

    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js" ></script>
<div id="app">
<child :setname.sync="name"></child>
你的名字:{{name}}
</div>
<script>
Vue.component('child',{
props: ['name'],
data: function(){
return {
newName: this.name
}
},
template:'<input type="text" @keyup="changeName" v-model="newName"/>',
methods: {
changeName: function(e){
this.$emit('update:setname',this.newName);
}
}
});
new Vue({
el:'#app',
data: {
name:'Jhon'
},
methods:{
getNewName: function(newName){
this.name = newName;
}
}
});
</script>

sync 简单实现 父子组件的双向绑定的更多相关文章

  1. Vue父子组件数据双向绑定,子组件可修改props

    第一种,子组件通过监听父组件数据,子组件改变数据之后通知给父组件 原文链接:https://blog.csdn.net/m0_37728716/article/details/81776929 父组件 ...

  2. Vue的父子组件v-model双向绑定,父组件修改子组件中绑定的v-model属性

    先来看下实现的效果,父组件中有个文本框,在点击下面按钮时弹出抽屉,抽屉里也有个文本框,文本框里的初始值要和父组件的文本框同步,并且修改抽屉里的文本框值时 父组件里的文本框值也要跟着改变 网上有大概三种 ...

  3. vue 父子组件数据双向绑定

    父组件 <find-search v-model="searchshow"></find-search> 子组件 props: { value: { typ ...

  4. [vue]实现父子组件数据双向绑定

    参考: http://www.cnblogs.com/xxcanghai/p/6124699.html <!DOCTYPE html> <html lang="en&quo ...

  5. vue 利用v-model实现父子组件数据双向绑定

    v-model父组件写法: v-model子组件写法: 子组件export default中的model:{}里面两个值,prop代表着我要和props的那个变量相对应,event表示着事件,我触发事 ...

  6. 7.vue组件(二)--双向绑定,父子组件访问

    本文主要说两件事 1. 如何实现父子组件之间的双向绑定 2. 父组件如何访问子组件的data,method, 子组件如何访问父组件的data,method等 一. 如何实现父子组件之间的双向绑定 案例 ...

  7. 如何在Vue2中实现组件props双向绑定

    Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用pr ...

  8. ionic3.x angular4.x ng4.x 自定义组件component双向绑定之自定义计数器

    本文主要示例在ionic3.x环境下实现一个自定义计数器,实现后最终效果如图: 1.使用命令创建一个component ionic g component CounterInput 类似的命令还有: ...

  9. vue 自定义组件 v-model双向绑定、 父子组件同步通信

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

随机推荐

  1. Ofbiz项目学习——阶段性小结——查询

    一.组装参数的学习 首先是查询条件,对于查询条件,需要判断是否从前端传递空值?——怎么处理查询空值? 当然可以一个一个进行判断,但是这样代码会导致很多,可以统一处理,形成一个公共方法. 1. 单个处理 ...

  2. Makefile 与tab

    Makefile文件由一系列规则(rules)构成.每条规则的形式如下. <target> : <prerequisites> [tab] <commands> 上 ...

  3. Nested List Weight Sum

    Description Given a nested list of integers, return the sum of all integers in the list weighted by ...

  4. count to any

    A small computer game, puzzle, decryption

  5. Mysql配置C3P0

    需要导入的包 c3p0-0.9.5.2.jar mchange-commons-0.2.15.jar mysql-connector.jar 1. 配置xml 创建c3p0-config.xml文件, ...

  6. cockroachdb docker-compose 本地集群运行以及prometheus监控

    cockroachdb 官方提供的是一个直接使用docker 运行的方式,但是使用docker-compose 会比较方便,可以快速搭建一个集群 同时官方也提供了prometheus 的metrics ...

  7. 【搜索】$P1092$虫食算

    题目链接 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同 ...

  8. 用户生命周期(User Lifetime)

    什么是用户生命周期? 用户生命周期是从用户开始接触产品到离开产品的整个过程.用户生命周期可分为:引入期.成长期.成熟期.休眠期.流失期.对应的是用户对产品不同的参与程度. 用户生命周期有什么用? 按照 ...

  9. BDE在 win7 找不到存储过程myproc;1

    BDE在 win7 找不到存储过程myproc;1 在odbc配置的完成的最后一步,有个使用ANSI引用的标识符,勾去掉试试 不行的话还有个执行字符串数据翻译勾去掉试试

  10. C/C++的内存对齐

    1.内存对齐之pragma pack语法 语法:#pragma pack( [show] | [push | pop] [, identifier], n )作用:指定结构,联合和类的包对齐方式(pa ...