一、前言

前几日使用微信网页版时,好奇这个网页用了什么前端框架。用Chrome的开发人员模式一探到底,发现原来用了一个名叫 Angular 的框架。好吧,既然微信用了。那我也最好还是看看。等等,你这篇文章的标题不是“初探Vue”吗?鬼扯什么Angular呢?

好吧,我承认有些跑题。

是的,我原本是要学着用Angular的,可是翻看网贴和资料后。发现有很多类似的框架,着力解决“在浏览器端怎样以优雅的方式动态生成html网页”的问题。当中就有前Google员工,咱大中华子民@youyuxi 尤小右同学开创的框架
Vue。

OK,总算回到正题了。

于是借着这个由头。翻看了一些对照各类流行前端框架优劣的文章。终于。我选择先拿 Vue 用用,试着改造我的部分已有业务。

我选择Vue的原因是:它似乎可以优雅而且简单地解决我的问题——页面布局和数据模型可以有非常清晰的边界,而且可以以松散的方式结合或关联。这里还要插一句:我觉得前端的展现,最后能和js 百分百的兼容。

我讨厌、反感使用jsp标签,使用s:iterator,使用el表达式!所以。可以使用js语法来实现渲染,是我梦寐以求的!

好吧,实际体验又是怎样?

二、列表的渲染

当然,一般的体验都是关于Hello, world 怎样实现。

但那个太0基础,我们直接上高级一些的。

假如我有一个表格须要呈现。该怎样做?

1. 首先要引入 vue 库的 js,參见后文链接;注意:开发期间一定要引入开发版,否则查起问题来全然找不到北。

2. 要渲染的表格(略去table头),形如:

    <tbody id="dataList" >
<tr v-for="item in items" id="row_{{$index}}" >
<td>{{item.dataId}}</td>
<td>{{item.appKey}}</td>
....
</tr>
</tbody>

3. js的部分,须要创建 vue 对象,来关联DOM元素和数据。并终于实现数据同步。

比方下面代码:

	vueItems = new Vue({
el: '#dataList',
data: {
items: [
]
}
});

4. OK。到眼下为止。我们的 vueItems 对象已经和 id 为 "dataList" 的 DOM 元素挂钩了。而且。通过在 html 里面 tr 一节的 "v-for" 属性。表明了要通过对 vueItems 对象的 数组元素进行遍历来渲染出表格的行数据。

5. 因此,接下来就是往 vueItems.items 里面放入数据的过程。稍等一下,为何是 vueItems.items, 而不是 vlueItems.data.items 呢?假设你和我一样有这个想法。那么非常不幸你被误导了。构建 vue 对象时,传入的 对象的 data 属性,并不在兴许的 vue 对象中真实存在。

要訪问数组的模型,必须用
vueItems.items。

6. OK。不论数据来源于动态网页的生成过程,还是ajax 请求得到,总归会有一个 JS 的数组对象作为原始的数据。

如果它就是 list 对象。那么。这时须要对list进行遍历。将list对象经过处理后。形成 vueItems 的真正用来渲染的数据。我的惯例是我宁愿用js来实现。而不愿意把这个过程放到模版里。

所以就有类似下面的代码:

for (var key in list) {

<span style="white-space:pre">	</span>var vueItem = {};

	var dataItem = list[key];

	vueItem.app_name = dataItem.app_name == null ?

"--" : dataItem.app_name;
vueItem.app_key = dataItem.app_key == "" ? "--" : dataItem.app_key;
vueItem.consume_fund = dataItem.consume_fund / 1000;
vueItem.reason = dataItem.reason == 0 ? "成功" : "错误码(" + dataItem.reason + ")"; vueItems.items.push(vueItem);
}

当中,最要紧的是就是最后一句 :

vueItems.items.push(vueItem);

这是Vue 这个框架奇妙的地方:将页面渲染的细节隐藏起来。代码简洁、优雅。

我调试了代码,表格的行依照要求渲染出来,大功告成!除了有个细节以外,即包括 {{}}内容的模版行会显示一下,然后隐藏。这个好解决。就是把tbody先设为隐藏,等数据载入好了。再显示就可以。所以改进后的数据模版是这种:

    <tbody id="dataList" style="display:none;">
<tr v-for="item in items" id="row_{{$index}}" >
<td>{{item.dataId}}</td>
<td>{{item.appKey}}</td>
....
</tr>
</tbody>

然后js代码里要加上一句:

$("#dataList").show();

一切显得非常完美。

正当我准备收工的时候,坏了。

由此也引出下一个章节。

三、意料之外的异常

我突然发现,当我页面上的条件更改后。又一次获取数据,再次使用vue做渲染,结果竟然抛出了异常。

这个异常不是在我的js里面抛出,而是在另外的线程。在
vue 的延时更新的定时器里抛出的。

Uncaught TypeError: Cannot read property 'removeChild' of null
remove @ vue.js:1176
(anonymous function) @ vue.js:1028
applyTransition @ vue.js:1056
removeWithTransition @ vue.js:1027
singleRemove @ vue.js:4483
remove @ vue.js:4985
diff @ vue.js:4816
update @ vue.js:4728
Directive._bind._update @ vue.js:7708
Watcher.run @ vue.js:3257
runBatcherQueue @ vue.js:2990
flushBatcherQueue @ vue.js:2964
nextTickHandler @ vue.js:434

看到这个错误,我一下傻了。

老革命遇到新问题了。

这,,。这框架怎么了?不是非常行的嘛?不是大牛开发的吗?。!

我重复看了代码。没问题啊。难道真的是框架的问题。

OK,我弄一个干净的列表的Demo,试试。

结果,新做的Demo没问题。

这下没辙了。又怀疑其它,,,,,,折腾了十几分钟。。。。

。这里略去N字以及苦水若干升。

绝望之中,我细致看了看这个异常的内容:Cannot
read property 'removeChild' of null

我似乎悟到一些什么。

我一拍大腿。明确了。NND(我TM猪头啊,...这里又略去N字)。

原来,我改造代码时。忘记将原先的一行代码去掉了,这行代码是直接訪问DOM将表格的数据清除。由于当用户再次点击查询时,须要将原数据删除。然后又一次append新的行。

我将上述这句代码删除。这回最终OK 了!

原来,在Vue里面。假设DOM元素已经绑定了Vue框架,则不能再通过DOM直接进行删除,必需要通过Vue的对象来删除。至少我使用的Vue 1.0.13 版本号是这个情况。

好吧。切切!

以后不能再犯这样的低级错误了。

四、后记

前述那个异常。究竟是要容错还是应该抛出异常?似乎容错也说得通。所以我将这个情况发了个推告知给作者。让他评估一下。由于时差的关系,他还没有回复我。

前端框架 Vue 初探的更多相关文章

  1. 前端框架vue.js系列(9):Vue.extend、Vue.component与new Vue

    前端框架vue.js系列(9):Vue.extend.Vue.component与new Vue 本文链接:https://blog.csdn.net/zeping891103/article/det ...

  2. (转)2018几大主流的UI/JS框架——前端框架 [Vue.js(目前市场上的主流)]

    https://blog.csdn.net/hu_belif/article/details/81258961 2016年开始应该是互联网飞速发展的几年,同时也是Web前端开发非常火爆的一年,Web ...

  3. 前端框架 vue 和 react 的区别

    前言:最近需要使用 react,以前用过 vue,故来总结两者的区别. 首先React与vue有几点相同之处 1.都使用了Virtual DOM 2.提供了响应式(Reactive)和组件化(Comp ...

  4. 可能是目前最完整的前端框架 Vue.js 全面介绍

    Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架. 摘要 2016年最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angul ...

  5. 微前端框架single-spa初探

    前言 最近入职的一家公司采用single-spa这个微前端框架,所以自学了此框架. single-spa这个微前端框架虽然有中文文档,但是有些零散和晦涩. 所以我想在学习之余,写篇博客拉平一下这个学习 ...

  6. 前端框架VUE——安装及初始化

    本篇文章适合,想要学习 vue,但对 vue 又没有接触过的同学阅读,是非常基础的内容.告诉大家使用 vue 时的安装方式,及如何创建实例,展示内容. 一.安装方式 vue 是一种前端框架,所以使用前 ...

  7. 前端框架Vue.js——vue-i18n ,vue项目中如何实现国际化

    本项目利用  VueI18n 组件进行国际化,使用之前,需要进行安装 $ npm install vue-i18n 一.框架引入步骤: 1. 先在 main.js 中引入 vue-i18n. // 国 ...

  8. 前端框架VUE

    Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vu ...

  9. 【入门篇】前端框架Vue.js知识介绍

    一.Vue.js介绍 1.什么是MVVM? MVVM(Model-View-ViewModel)是一种软件架构设计模式,它源于MVC(Model-View-Controller)模式,它是一种思想,一 ...

随机推荐

  1. Mac 10.12使用free命令(fish)

    前提:要使用free命令,可以安装fish shell,然后在里面安装free插件. 安装fish brew install fish 安装free fish fisher free 使用 fish ...

  2. 強大的jQuery Chart组件-Highcharts

    Highcharts是一个制作图表的纯Javascript类库,主要特性如下: 兼容性:兼容当今所有的浏览器,包括iPhone.IE和火狐等等: 对个人用户完全免费: 纯JS,无BS: 支持大部分的图 ...

  3. HDU 4759 Poker Shuffle(2013长春网络赛1001题)

    Poker Shuffle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. Sublime Text 2搭建Go开发环境,代码提示+补全+调试

    本文在已安装Go环境的前提下继续. 1.安装Sublime Text 2 2.安装Package Control. 运行Sublime,按下 Ctrl+`(`在Tab键上边),然后输入以下内容: im ...

  5. C#编程(十八)----------C#中的结构

    C#中的结构 假设有一个类: class Dimensions { public double Length; public double Width; } 定义了一个类,它只存储某一项的长度和宽度. ...

  6. 【工具类】根据IP获取IP归属地,国家,城市信息

    使用淘宝的IP归属地查询接口: http://ip.taobao.com/service/getIpInfo.php?ip=192.168.92.130 通过新浪的IP归属地查询接口: http:// ...

  7. Java 如何实现在线预览文档及修改(Office文件)

    测试地址: https://sms.idxkj.cn 用户名:aa 密码:123456

  8. ios成长之每日一遍(day 7)

    今天到UITabBarController 结合 UIPickView, 这里一共有5个实现, 由浅到易. 其实在IB上面使用UITabBarController很简单, 就像平常拖控件一样拖到界面上 ...

  9. c#录音和放音,超简单!不用DirectX

    最近在做android与C#录音并互相通信的小东西.但是卡在C#录音这儿了.找了好久,说的都是DirectX,可是我总是安装不上,这才找到了这个简单的录音方法.当然,如果你想要录得好并且处理音频,那还 ...

  10. Java比较两个Date日期的大小

    import java.util.*; import java.text.ParseException; import java.text.SimpleDateFormat; class Test{ ...