前言
本文适用于还在使用传统js原生和jquery方式操作dom的小伙伴,以及还在困惑,究竟是传统js/jqurry开发效率高对开发者友好还是vue表现得更好。那么废话少说,让我们一起来对比以下jquery和vue实现同一个示例代码,看看究竟谁更简单易用。
在这之前,先让我们介绍以下参赛的双方选手:vue和jquery。
简单介绍一下vue
vue一套用于构建用户界面的框架,vue的核心库只关注视图层,方便与第三方库整合。
vue必须要有html/css/js作为基础。
再介绍一下jquery
jquery是老牌js工具库,用于简化js代码。jquery提供了许多简化js操作的方法,比如dom选择器,事件监听,ajax等
介绍完选手,就直接开始吧,我们直接使用vue官方得几个示例来简单说明。
第一个示例:编写hello word!,绑定修改元素text属性
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
</head>
<body>
<div id="app">
{{ message }}
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
<html>
这个代码主要演示了vue的主要功能:”声明式渲染“,数据和 DOM 已经被建立了关联。
类似模板引擎一样,在前端页面对页面元素进行渲染。
吐槽:官方文档里讲的没有与#app元素交互也是扯淡,我们眼都不瞎,这明显是绑定#app元素并修改其内容了啊。
让我们来看看jquery版本:
与jquery版本示例对比
<html>
<head>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<div id="app"></div>
</body>
<script>
$("#app").text("hello jqeury!");
</script>
<html>
显然,第一个示例,vue并没有体现出优势,对于刚上手vue的开发者来说,比起jqeury只需要一个选择器,vue得绑定显得有些臃肿和复杂。当然,这只是第一个示例,下面让我们继续看下去,看看后面得结果是否会有所改观。
为了防止文章篇幅过于冗长,后面我们不再放全量代码,只放增量代码。
第二个示例,绑定修改元素属性
<div id="app-2">
<span v-bind:title="message">
鼠标悬停几秒钟查看此处动态绑定的提示信息!
</span>
</div>
var app2 = new Vue({
el: '#app-2',
data: { message: '页面加载于 ' + new Date().toLocaleString()}
})
第二个示例是演示vue中的指令:v-bind attribute 用于绑定元素中的属性,代码中我们绑定了app-2下面的span元素的title属性。
我们再来看看jquery版本的示例对比一下:
与jquery版本示例对比
<div id="app2">
<span>
鼠标悬停几秒钟查看此处动态绑定的提示信息!
</span>
</div>
$("#app2 span").mouseover(function(){
$("#app2 span").attr('title','页面加载于 ' + new Date().toLocaleString());
});
到这一段,jquery涉及到了选择器和事件监听,vue的指令依然没有表现出特别的优势,看起来两者似乎有点旗鼓相当。让我们继续比下去,看看后面还会不会有所变化。
第三个示例:切换元素显示
<div id="app-3">
<p v-if="seen">现在你看到我了</p>
</div>
var app3 = new Vue({
el: '#app-3',
data: {
seen: true
}
})
在控制台中app3.seen = false就可以隐藏元素
与jquery版本示例对比
<div id="app-3">
<p>现在你看到我了</p>
</div>
$("#app3 p").show();
调用$("#app3 p").hide();
就可以隐藏元素
看到这里,似乎jquery给人感觉更简单直接,vue似乎没有体现出任何优势。按照这个节奏,vue不会要翻车了吧,为vue捏把汗,让我们继续下一个示例。
第四个示例:v-for 指令渲染列表
v-for 指令可以绑定数组的数据来渲染一个项目列表
<div id="app-4">
<ol>
<li v-for="todo in todos">
{{ todo.text }}
</li>
</ol>
</div>
var app4 = new Vue({
el: '#app-4',
data: {
todos: [
{ text: '学习 JavaScript' },
{ text: '学习 Vue' },
{ text: '整个牛项目' }
]
}
})
在控制台里,输入app4.todos.push({ text: '新项目' })
,会发现多了一个li列表
与jquery版本示例对比
<div id="app-4">
<ol>
</ol>
</div>
var todos= [
{ text: '学习 JavaScript' },
{ text: '学习 Vue' },
{ text: '整个牛项目' }
]
for(i in todos){
let li="<li>"+todos[i].text+"</li>";
$("#app-4 ol").append(li);
}
到这里,终于发现vue动态生成dom确实更简洁了,明显比jquery生成dom节点更简单。vue的虚拟dom操作的特性优势有些凸显出来了,但是不知道下面事件监听vue能否稳住局面。
第五个示例:绑定鼠标事件
<div id="app-5">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">反转消息</button>
</div>
var app5 = new Vue({
el: '#app-5',
data: {
message: 'Hello Vue.js!'
},
methods: {
reverseMessage: function () {
this.message = this.message.split('').reverse().join('')
}
}
})
与jquery版本示例对比
<div id="app-5">
<p></p>
<button>反转消息</button>
</div>
var app5=$("#app-5 p");
app5.text("hello jquery!");
$("#app-5 button").click(function(){
app5.text(app5.text().split('').reverse().join(''));
})
到这里大家差不多看出来点什么了,二者复杂度其实差不多。jquery明显开始多次重复操作同一个dom,vue则只绑定一次,且没有对dom进行操作。可以初步得出结论就是对dom操作越多,vue的优势越大。
下面我们再来看看双向绑定:
第六个示例:双向绑定
<div id="app-6">
<p>{{ message }}</p>
<input v-model="message">
</div>
var app6 = new Vue({
el: '#app-6',
data: {
message: 'Hello Vue!'
}
})
与jquery版本示例对比
<div id="app-6">
<p></p>
<input>
</div>
$("#app-6 input").val("hello world!");
$("#app-6 p").text($("#app-6 input").val());
$("#app-6 input").keyup(function(){
$("#app-6 p").text($("#app-6 input").val());
});
到这里,我想大家应该比第五个示例看的更加明白了,vue几乎没增加什么代码,jqeury在疯狂的操作dom。应对对于这种稍微麻烦点的dom双向绑定操作,vue比jqeury方式要轻松得多。
结论
对于多个dom操作和各种双向绑定等复杂dom操作来说,显然vue更胜一筹,代码更加简洁,对于简单代码,vue也不会显得过于冗余。而对于页面动效比较简单的页面,jquery显然优势更明显。