Vue双向绑定实例教程

Vue双向绑定实例教程

双向绑定简介

我们知道Vue是一个典型的MVVM框架,Vue在动态绑定这一块提供了丰富的API,让我们可以用简短的代码写出响应式的效果,我们只需关注数据对象,而视图层则通过双向绑定的形式进行更新,以下将通过四个方面介绍双向绑定在vue的使用及可能遇到的坑

  1. 双向绑定在实际项目中的运用
  2. 借助Vue调试工具定位问题
  3. 双向绑定与Getter/Setter器的关系,深入响应式原理
  4. 绑定失败问题的解决方案

双向绑定在项目的实际运用

在项目中,我们对element-ui做了一次再封装处理,以表单组件为例
在业务使用中很大的痛点在于表单各个不同组件的使用,在Jquery中,我们对不同的表单控件需要使用不同的取值形式,例如多选下拉和单选下拉、日期控件和范围日期控件,取值逻辑不尽相同,针对这种问题

我们创建了一个pm_form_item组件统一化处理 如下图


image.png

外部通过传入不同的参数决定控件的类型及逻辑,外部只关注绑定对象,无须关注取值设值的过程,未来拓展的过程中,假如有新的表单控件,只需增加新的参数类型,而对外部隐藏实现.

接下来就尝试新增一个表单组件试试吧!


image.png

设置组件的行数、宽度及控件类型等参数,设置是否可读,设置属性名,这里我们期望这个控件的值绑定到formModel的createTime属性上
观察下效果吧!


image.png

看起来好像一切顺利,现在我们可以进行业务开发了

假如这是一个新增页面,我期望在打开这个页面的时候给这个控件一个默认值,这似乎听起来并不难,只需要对formModel.createTime初始化值即可,如下 (created为Vue内置生命周期函数)


image.png

观察一下现象


image.png

默认值的确已经被初始化完成,但当我们想要再次修改控件的值时却失败了,这个控件现在对任何的输入值都不生效。双向绑定诡异的失败了。下面一节将介绍Vue的调试插件定位我们遇到的这个问题.

Vue调试工具 - Vue Devtools

Vue Devtools是Vue官方出品的一款Vue的调试工具,使用是通过Chrome的插件进行的,这里对安装插件等准备工作不做赘述


image.png

这里是Vue使用截图
总共分为3部分 Components,Vuex,Events
Components中左侧是组件树,右侧可以看到组件的data,props等,这个界面可以用以监控组件的内部状态,是最常用的功能

Vuex是一个Vue状态管理功能,我们可以在这里看到有关Vuex里的一些信息类似 state ,getters 等

Event界面我们可以看到Vue的事件触发,鼠标的点击移出移入输入等事件,都可以在这里看到

针对上述问题
我们观察Event,每次选择输入值时都会触发pick事件,我们可以看到我们选择的日期也在此事件参数中


image.png

看起来似乎是因为输入事件回调没有正常影响对象的值,我们尝试写监视器,监听对象的另一个属性然后打印该变量


image.png

我们拿这个对象与正常场景下的对象进行对比,发现异常场景下的对象少了createTime属性的getter/setter方法


image.png

看起来这就是造成双向绑定失败问题的真凶

双向绑定与Getter/Setter关系

在说双向绑定与Getter/Setter器的关系时,我们先讲一下Vue双向绑定实现的基本原理

在传统认知中,双向绑定通常使用引用传递或类似原理完成双向绑定,但这种方式通常会带来非常多的问题,子组件如果可以随意修改父组件的值,对开发人员是一个很大的心智负担,故在现代化的MVVW框架中,双向绑定都采用类似事件通知的形式进行。

不同于angularJs的 一处监听,全局检查,Vue使用的是点对点的订阅绑定模式,当子组件的值发生修改时,触发外部传入的回调函数修改外部的值
一个双向绑定实际的实现类似如下

而v-model关键字是对上述的一种语法糖封装

通过上述过程我们知道Vue需要在子组件绑定值childValue发生改变时触发回调函数,所以通过赋值模式进行改动是行不通的,需要通过Set方法,在Set方法中进行回调触发事件调用等,类似下面的伪代码

value{
    var val;
    get(){
        return this.val;
    }
    set(newVal){
        vue.$emit("parentEvent",newVal);
        this.val = newVal;
    }
}

这个Getter/Setter则是Vue为绑定变量动态生成的方法,Vue正是通过这种点对点的订阅行为完成双向绑定

绑定失败问题的解决方案

由于我们已经定位了问题是由于Setter/Getter问题引起,那么只要让Vue自己能够动态添加或我们自己手动添加即可

1.在声明formModel的 data对象时声明createTime属性


image.png

2.在初始化时不使用赋值初始化,转用Vue API
这种做法Vue会在赋值时为对象自动生成getter/setter


image.png

回顾我们第一节的内容我们可能会有些疑问,第一次我们没有进行赋值操作,但我们也没有对createTime进行声明或初始化getter/setter操作,但为什么结果是对的呢?

我们尝试在组件渲染完时,打印查看createTime属性不存在,同时也没有getter/setter,但当我们触发了子组件的选择事件后再尝试打印

此时vue已经为formModel对象添加了createTime和getter/setter方法,看来这个地方只是Vue为我们做了一次贴心的优化

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,043评论 0 29
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 3,320评论 0 25
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,181评论 0 25
  • 一:什么是闭包?闭包的用处? (1)闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就 是将函数内部和函数外...
    xuguibin阅读 9,476评论 1 52
  • 前言 您将在本文当中了解到,往网页中添加数据,从传统的dom操作过渡到数据层操作,实现同一个目标,两种不同的方式....
    itclanCoder阅读 25,717评论 1 12