Vue.js—快速入门及实现图书管理系统

  前  言

今天我们主要一起来学习一个新框架的使用——Vue.js,之前我们也讲过AngularJS是如何使用的,而今天要讲的Vue.js的语法和AngularJS很相似,因为 AngularJS 是 Vue 早期开发的灵感来源。然而,AngularJS 中存在的许多问题,在 Vue 中已经得到解决。AngularJS 使用双向绑定,Vue 在不同组件间强制使用单向数据流,这使应用中的数据流更加清晰易懂。

在实现图书馆系统之前,我们先学习一下Vue.js的一些基础语法的使用。

 

 

 

1   第一个Vue实例

 

每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的,当创建一个 Vue 实例时,你可以传入一个选项对象

一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,以及可选的嵌套的、可复用的组件树组成。

 Vue.js使用{{ }}绑定表达式,用于将表达式的内容输出到页面中。表达式可以是文字,运算符,变量等,也可以在表达式中进行运算输出结果
          

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <div id="app">
 9            {{message}}    
10         </div>
11         
12         <script type="text/javascript" src="js/vue.js" ></script>
13         <script type="text/javascript">
14             //声明式渲染
15             var app = new Vue({   //创建Vue对象
16                 el:"#app",   //把当前Vue对象挂载到div标签上,#app是ID选择器  
17                 data:{
18                     message:"Hello Vue!",//message是自定义的数据
19                 }
20             
21             });
22         </script>
23     </body>
24 </html>

 

在创建Vue实例时,需要传入一个选项对象,选项对象可以包含数据、挂载元素、方法、模生命周期钩子等等。

在这个示例中,选项对象el属性指向View,el: '#app'表示该Vue实例将挂载到<div id="app">...</div>这个元素;

data属性指向Model,data: message表示我们的Model是message对象。
Vue.js有多种数据绑定的语法,最基础的形式是文本插值,使用一对大括号语法,在运行时{{ message }}会被数据对象的message属性替换,所以页面上会输出"Hello World!"。

 

 

2   双向绑定实例

 

首先我们先解释一下什么是双向绑定, Vue框架很核心的功能就是双向的数据绑定。双向是指:HTML标签数据绑定到Vue对象,另外反方向数据也是绑定的。MVVM模式本身是实现了双向绑定的,在Vue.js中可以使用v-model指令在表单元素上创建双向数据绑定。将message绑定到文本框,当更改文本框的值时,{{ message }} 中的内容也会被更新。反之,如果改变message的值,文本框的值也会被更新。反过来,如果改变message的值,文本框的值也会被更新,我们可以在Chrome控制台进行尝试。

下面的栗子是在表单控件元素(input等)上创建双向数据绑定(数据源);跟Angular中ng-model用法一样。

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <div id="app">
 9             {{message}}
10        
11 
13             <input v-model="message" />
14         </div>
15     </body>
16     <script type="text/javascript" src="js/vue.js" ></script>
17         <script type="text/javascript">
18             //声明式渲染
19             var app = new Vue({  
20                 el:"#app",   
21                 data:{
22                     message:"Hello Vue",
23                 }
24             
25             });
26     </script>
27 </html>

 

 

 

3   Vue.js的常用指令

 

上面用到的v-model是Vue.js常用的一个指令,那什么是指令呢?

Vue.js的指令是以v-开头的,它们作用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为,我们可以将指令看作特殊的HTML特性。

Vue.js提供了一些常用的内置指令,接下来就给大家介绍几个Vue中的常用指令:

1、v-if指令

2、v-else指令

3、v-show指令

4、v-for指令

5、v-on指令

6、v-bind 指令

 

 

3.1v-if指令

 

v-if是条件渲染指令,它根据表达式的真假来删除和插入元素,这个例子演示了我们不仅可以绑定 DOM 文本到数据,也可以绑定 DOM 结构到数据。

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <div id="app">
 9             <h1>Hello, Vue.js!</h1>
10             <h1 v-if="yes">Yes</h1>
11             <h1 v-if="no">No</h1>
12             <h1 v-if="age >= 12">Age: {{ age }}</h1>
13         </div>
14     </body>
15     <script src="js/vue.js"></script>
16     <script>
17         
18         var vm = new Vue({
19             el: '#app',
20             data: {
21                 yes: true,
22                 no: false,
23                 age: 20,           
24         }
25         })
26     </script>
27 </html>

 

 

 

 

 

3.2v-else指令

 

可以用 v-else 指令给 v-if 添加一个 "else" 块,条件都不符合时渲染。v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <div id="app">
 9             <div v-if="num>90">
10                 {{score1}}
11             </div>
12             <div v-else>
13                 {{bananer}}
14             </div>
15         </div>
16         
17    <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
18         <script type="text/javascript">
19             var app = new Vue({
20                 el: "#app",
21                 data:{
22                     num:98,
23                     score1:"恭喜你是优秀哦!",
24                     score2:"需要继续努力哦!"
25                 }
26             });
27         </script>
28     </body>
29 </html>

 

 

3.3v-show指令

 

v-show也是条件渲染指令,和v-if指令不同的是,使用v-show指令的元素始终会被渲染到HTML,它只是简单地为元素设置CSS的style属性。值得我们注意的是,v-show 不支持 <template> 元素,也不支持 v-else

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>综合实例</title>
 6     </head>
 7     <body>
 8     <div id="app">
 9         <h1 v-show="teng">这是个真理!</h1>
10             <template v-show="false">
11                 <div>我好漂亮!</div>
12                 <div>我非常漂亮!</div>
13                 <div>我特别漂亮!</div>
14             </template>
15     </div>
16     </body>
17  <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
18     <script type="text/javascript">
19         var vm=new Vue({
20             el:'#app',
21             data:{
22                 teng:true
23             }
24         })
25     </script>
26 </html>

 

 

 

3.4v-for指令

 

循环使用 v-for 指令,v-for 指令可以绑定数组的数据来渲染一个项目列表。

 

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <div id="app">
 9             <ol>
10                 <li v-for="teng in shuai">
11                   {{ teng.name }}
12                 </li>
13             </ol>
14         </div>
15         
16         <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
17         <script type="text/javascript">
18             var app = new Vue({
19                 el: "#app",
20                 data:{
21                     shuai: [
22                       { name: '帅!' },
23                       { name: '真帅!' },
24                       { name: '特别帅!' }
25                     ]
26                 }
27             });
28         </script>
29     </body>
30 </html>

 

 

 

 

3.5v-on指令

 

事件监听可以使用 v-on 指令。

通常情况下,我们需要使用一个方法来调用 JavaScript 方法。v-on 可以接收一个定义的方法来调用。除了直接绑定到一个方法,也可以用内联 JavaScript 语句.

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <div id="app">
 9             <p><input type="text" v-model="message"></p>
10             <p>
11                 <!--click事件直接绑定一个方法-->
12                 <button v-on:click="teng"></button>
13             </p>
14             <p>
15                 <!--click事件使用内联语句-->
16                 <button v-on:click="say('帅!')"></button>
17             </p>
18         </div>
19     </body>
20    <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
21     <script>
22         var vm = new Vue({
23             el: '#app',
24             data: {
25                 message: 'Hello, Vue.js'
26             },
27            
28             methods: {
29                 teng: function() {
30                 
31                     alert(this.message)
32                 },
33                 say: function(msg) {
34                     alert(msg)
35                 }
36             }
37         })
38     </script>
39 </html>

 

 

 

3.6v-bind 指令

 

 

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
 6 <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
 7 <style>
 8 .red {
 9     width: 100px;
10     height: 100px;
11     background: green;
12 }
13 .style {
14     background: red;
15 }
16 </style>
17 </head>
18 <body>
19 <div id="app">
20   <div v-bind:class="class1"></div>
21 </div>
22 
23 <script>
24 new Vue({
25   el: '#app',
26   data: {
27     class1: {
28       red: true,
29       'style': true
30     }
31   }
32 })
33 </script>
34 </body>
35 </html>

 

 

4图书系统管理

 

根据上面我们所学习Vue的内容,我们来做一个图书管理系统进一步熟悉Vue.js的使用。

 

  1 <!DOCTYPE html>
  2 <html>
  3     <head>
  4         <meta charset="UTF-8">
  5         <title>Document</title>
  6          <link rel="stylesheet" type="text/css" href="css/bootstrap.css"/>
  7         <script src="js/vue.js"></script>
  8         <style type="text/css">
  9             #update-book{
 10                 display: none;
 11             }
 12         </style>
 13     </head>
 14      <body>
 15         <div class="container">
 16             <div class="col-md-6 col-md-offset-3">
 17                 <h1>Vue demo</h1>
 18                  
 19                 <div id="app">
 20                     <table class="table table-hover ">
 21                         <br />
 22                         <thead>
 23                             <tr>
 24                                 <th>序号</th>
 25                                 <th>书名</th>
 26                                 <th>作者</th>
 27                                 <th>价格</th>
 28                                 <th>操作</th>
 29                             </tr>
 30                         </thead>
 31                         <tbody>
 32                             <tr v-for="book in filterBooks">
 33                                 <td>{{book.id}}</td>
 34                                 <td>{{book.name}}</td>
 35                                 <td>{{book.author}}</td>
 36                                 <td>{{book.price}}</td>
 37                                 <template v-if="book.id%2==0">
 38                                     <td class="text-left">
 39                                         <button type="button" class="btn btn-success" class="del" @click="delBook(book)">删除</button>
 40                                         <button type="button" class="btn btn-success" @click="updataBook(book)">修改</button>
 41                                     </td>
 42                                 </template>
 43                                 <template v-else>
 44                                     <td class="text-left">
 45                                         <button type="button" class="btn btn-danger" class="del" @click="delBook(book)">删除</button>
 46                                         <button type="button" class="btn btn-danger" @click="updataBook(book)">修改</button>
 47                                     </td>
 48                                 </template>
 49                             </tr>
 50                         </tbody>
 51                     </table>
 52                  
 53                     <div id="add-book">
 54                         <div class="row" style="margin-bottom: 30px;">
 55                             <div class="col-md-3"style="text-align: right;font-size: 16px;line-height: 30px;">
 56                                 请输入书名
 57                             </div>
 58                             <div class="col-md-5">
 59                                 <input type="text"class="form-control" v-model="search"/>
 60                             </div>
 61                         </div>
 62 
 63                         <h3>添加书籍</h3>
 64                         <hr />
 65                         <div class="form-group">
 66                             <label for="group">书名</label>
 67                             <input type="text" class="form-control" id="group" v-model="book.name">
 68                         </div>
 69                         <div class="form-group">
 70                             <label for="author">作者</label>
 71                             <input type="text" class="form-control" id="author" v-model="book.author">
 72                         </div>
 73                         <div class="form-group">
 74                             <label for="price">价格</label>
 75                             <input type="text" class="form-control" id="price" v-model="book.price">
 76                         </div>
 77                         <button class="btn btn-primary btn-block" v-on:click="addBook()">添加</button>
 78                     </div>
 79                     
 80                     <div id="update-book">
 81                         <h3>修改书籍</h3>
 82                         <hr />
 83                         <div class="form-group">
 84                             <label for="group1">书名</label>
 85                             <input type="text" class="form-control" id="group1" v-model="book.name">
 86                         </div>
 87                         <div class="form-group">
 88                             <label for="author1">作者</label>
 89                             <input type="text" class="form-control" id="author1" v-model="book.author">
 90                         </div>
 91                         <div class="form-group">
 92                             <label for="price1">价格</label>
 93                             <input type="text" class="form-control" id="price1" v-model="book.price">
 94                         </div>
 95                         <button class="btn btn-primary btn-block" @click="updatasBook()">完成</button>
 96                     </div>
 97                 </div>
 98             </div>
 99         </div>
100         <script type="text/javascript" src="js/jquery-3.1.1.min.js"></script>
101         <script type="text/javascript" src="js/tushu.js" ></script>
102      </body>
103 </html>

 

JS代码:

 

 1 var id=0;
 2 new Vue({
 3     el:'#app',
 4     methods:{
 5         addBook:function(){
 6             this.book.id=this.books.length+1;
 7             this.books.push(this.book);
 8             this.book={};
 9         },
10         delBook:function(book){
11         var blength=this.books.length;
12         this.books.splice(book.id-1,1);
13             for(var i=0;i<blength;i++){
14                 if(book.id<this.books[i].id){
15                     this.books[i].id-=1;
16                 }
17             }
18     },
19         updataBook:function(book){
20             $("#add-book").css("display","none");
21             $("#update-book").css("display","block");
22             id=book.id;
23         },
24         updatasBook:function(){
25             this.book.id=id;
26             this.books.splice(id-1,1,this.book);
27             $("#add-book").css("display","block");
28             $("#update-book").css("display","none");
29             this.book = {};
30         },
31     },
32     computed:{
33         filterBooks:function(){
34             var books=this.books;
35             var search=this.search;
36 //            if(!search){
37 //                return books;
38 //            }
39 //            var arr=[];
40 //            for(var i=0;i<books.length;i++){
41 //                var index=books[i].name.indexOf(search);
42 //                if(index>-1){
43 //                    arr.push(books[i]);
44 //                }
45 //            }
46 //            return arr;
47             
48             return books.filter(function(book){
49                 return book.name.toLowerCase().indexOf(search.toLowerCase())!=-1;
50             })
51         }
52     },
53         data:{
54         book:{
55             id:"",
56             author:"",
57             name:"",
58             price:""
59         },
60         books:[{
61             id:1,
62             author:"张三",
63             name:"张三自传漫画",
64             price:12.0
65         },
66         {
67             id:2,
68             author:"李四",
69             name:"李四自传漫画",
70             price:12.0
71         },
72         {
73             id:3,
74             author:"张三",
75             name:"张三自传漫画",
76             price:12.0
77         }
78         ],
79         search:""
80     }
81         
82 })

 

 增加数据:

 

 修改数据:

 

查询和删除:

 

posted @ 2017-11-19 22:44  白菜白  阅读(10042)  评论(1编辑  收藏  举报