Vue.js是什么
Vue.js 是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
Vue 的一些语法和 AngularJS 的很相似 (例如 v-if
vs ng-if
)。因为 AngularJS 是 Vue 早期开发的灵感来源。然而,AngularJS 中存在的许多问题,在 Vue 中已经得到解决。AngularJS 使用双向绑定,Vue 在不同组件间强制使用单向数据流,这使应用中的数据流更加清晰易懂。相比于Angular.js,Vue.js提供了更加简洁、更易于理解的API,可以让你快速地掌握它的全部特性并投入开发。
1声明式渲染
Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
这是我们生成的第一个Vue应用,数据和 DOM 已经被绑定在一起,所有的元素都是响应式的。打开你的浏览器的控制台 ,并修改 app.message的内容
,你将看到内容也相应地更新。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <!-- Vue.js使用{{}}绑定表达式,用于将表达式的内容输出到页面中。 表达式可以是文字,运算符,变量等,也可以在表达式中进行运算输出结果 --> {{message}} </div> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> //声明式渲染 var app = new Vue({ //创建Vue对象 el:"#app", //把当前Vue对象挂载到div标签上,#app是ID选择器 data:{ message:"Hello Vue!",//message是自定义的数据 } }); </script> </body> </html>
下边这种方式也可以实现同样的效果,当vue.js文件放在页面的下方时,这种方式在页面刷新时不会看到{{ }}表达式的原样
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> /* 如果vue.js文件放在页面的下方,在页面刷新时会看到{{}}表达式原样,所以使用v-cloak指令代替表达式。 在css中设置[v-cloak]{display:none} */ [v-cloak]{display:none;} </style> </head> <body> <div id="app" v-cloak v-html="message"> </div> </body> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> //声明式渲染 var app = new Vue({ //创建Vue对象 el:"#app", //把当前Vue对象挂载到div标签上,#app是ID选择器 data:{ message:"Hello Vue!",//message是自定义的数据 } }); </script> </html>
2双向数据绑定
首先我们先解释一下什么是双向绑定, Vue框架很核心的功能就是双向的数据绑定。双向是指:HTML标签数据绑定到Vue对象,另外反方向数据也是绑定的。
通俗点说,Vue对象会改变会直接影响到HTML标签的变化,而且标签的变化也会反过来影响Vue对象的属性变化。
Vue中可以使用 v-model 指令在 input 输入框中创建双向数据绑定。
将message绑定到文本框,当更改文本框的值时,{{ message }}
中的内容也会被更新。反之,如果改变message的值,文本框的值也会被更新。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> {{message}} <!-- 在表单控件元素(input等)上创建双向数据绑定(数据源);跟Angular中ng-model用法一样。 --> <input v-model="message" /> </div> </body> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> //声明式渲染 var app = new Vue({ el:"#app", data:{ message:"Hello Vue", } }); </script> </html>
Vue.js中的常用指令
Vue中的指令是带有 v- 前缀的特殊属性。指令用于在表达式的值改变时,将某些行为应用到 DOM 上。
接下来就给大家介绍几个Vue中的常用指令
3v-if 指令
我们使用v-if来控制切换一个元素的显示。这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。
这个例子演示了我们不仅可以绑定 DOM 文本到数据,也可以绑定 DOM 结构到数据。
数据的seen属性为true时,内容会被输出
数据的seen属性为false时,内容不会被输出
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <p v-if="seen">现在你看到我了</p> </div> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> //声明式渲染 var app = new Vue({ el:"#app", data:{ seen:true } }); </script> </body> </html>
5v-else 指令
可以用 v-else 指令给 v-if 添加一个 "else" 块,条件都不符合时渲染。v-else元素必须跟在v-if
或v-show
元素的后面——否则它不能被识别。
判断num值是否大于22,大于则输出apple,否则输出bananer
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <div v-if="num>22"> {{apple}} </div> <div v-else> {{bananer}} </div> </div> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var app = new Vue({ el: "#app", data:{ num:25, apple:"苹果很好吃!", bananer:"香蕉也很好吃!" } }); </script> </body> </html>
6v-for 指令
v-for 指令可以绑定数组的数据来渲染一个项目列表。
v-for 指令需要以 fruit in fruits 形式的特殊语法, fruits 是源数据数组并且 fruit 是数组元素迭代的别名。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <ol> <li v-for="fruit in fruits"> {{ fruit.name }} </li> </ol> </div> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var app = new Vue({ el: "#app", data:{ fruits: [ { name: '苹果' }, { name: '香蕉' }, { name: '西瓜' } ] } }); </script> </body> </html>
7v-bind 指令
HTML 属性中的值应使用 v-bind 指令。主要是用来操作元素的class列表和他的内联样式。和用JS直接操作dom节点功能一样,但是,要比js简单的多。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .a{ width: 100px; height: 100px; background-color: red; } .b{ width: 200px; height: 200px; background-color: yellow; } </style> </head> <body> <div id="app"> <div v-bind:class="myClass1" onclick="app.func()">点击变化</div> </div> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var app = new Vue({ el: "#app", data:{ myColor:"red", myWidth:, myHeight:, myClass1:"a", func:function(){ if(this.myClass1=="a"){ this.myClass1="b"; }else{ this.myClass1="a"; } } } }); </script> </body> </html>
8v-on 指令
为了让用户和你的应用进行互动,我们可以用 v-on
指令绑定一个事件监听器,通过它调用我们 Vue 实例中定义的方法。
在reverseMessage 方法中,当我们更新了应用的状态,但没有触碰 DOM,因为所有的 DOM 操作都由 Vue 来处理。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!--事件监听可以使用v-on指令--> <div id="app"> <button v-on:click="counter+=1">点击加1</button> <p>{{counter}}</p> <p>{{ message }}</p> <button v-on:click="reverseMessage">反转信息</button> <button v-on:click="func">点击弹出</button> </div> </body> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var vm=new Vue({ el:'#app', data:{ counter:, message: 'Hello Vue.js!' }, //在methods中定义方法 methods:{ reverseMessage: function () { this.message = this.message.split('').reverse().join('') }, func:function(event){ alert("川宝宝"); } } }) </script> </html>
9综合 小Demo
现在我们已经介绍了一些Vue.js的基础知识了,结合以上知识我们可以来做个小Demo吧。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>综合实例</title> <link rel="stylesheet" href="css/bootstrap.css" /> <style type="text/css"> .table{ width: 500px; } </style> </head> <body> <div id="app"> <div class="form-group"> <label for="group">姓名</label> <input type="text" v-model="person1.name"> </div> <div class="form-group"> <label for="author">学号</label> <input type="text" v-model="person1.num"> </div> <div class="form-group"> <label for="price">成绩</label> <input type="text" v-model="person1.score"> </div> <button class="btn btn-success" v-on:click="addPerson()">添加</button> <table class="table table-bordered" class="table"> <thead> <tr> <th>姓名</th> <th>学号</th> <th>成绩</th> <th>删除</th> </tr> </thead> <tbody> <tr v-for="person in people"> <td>{{person.name}}</td> <td>{{person.num}}</td> <td>{{person.score}}</td> <td><button class="btn btn-warning" @click="delPerson(person)">删除</button></td> </tr> </tbody> </table> </div> </body> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var vm=new Vue({ el:'#app', data:{ person1:{ name: '', num: '', score: '' }, people:[{ name: '张三', num: '123456', score: '8' }, { name: '李四', num: '151515', score: '7' }, { name: '王二', num: '181818', score: '6' }, ] }, //在methods中定义方法 methods:{ //新增成员信息 addPerson: function () { this.person1.id=this.people.length+1; this.people.push(this.person1); this.person1={}; }, //删除成员信息 delPerson: function(person){ this.people.splice(this.people.indexOf(person),1); } } }) </script> </html>
编者按
Vue.js是数据驱动的,无需手动操作DOM。它通过一些特殊的HTML语法,将DOM和数据绑定起来。一旦你创建了绑定,DOM将和数据保持同步,当数据变更了,DOM也会相应地更新。如果你之前有过其他框架的使用经验对于学习 Vue.js 是有帮助的,但这不是必需的。最后希望这篇文章能对您学习前端开发有所帮助。