1. 程式人生 > >實用小專案——Vue.js 實現增刪查改功能

實用小專案——Vue.js 實現增刪查改功能

最近學習了vue.js框架,嘗試著做了一個增刪查改功能的小專案。

今天發博來跟大家交流交流經驗。整體效果如下動態圖:

首先,我使用的是Bootstrap搭建整體框架:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Vue Demo</title>
         <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/>
        <script src="js/vue.js"></script>
        <style type="text/css">
            #update-book{      // 先將修改頁面div隱藏,點選修改按鈕後顯示
                display: none;
            }
        </style>
    </head>
     <body>
        <div class="container">
            <div class="col-md-6 col-md-offset-3">
                <h1>Vue demo</h1>
                 
                <div id="app">
                    
                    <table class="table table-hover ">
                        <br />
                        <thead>
                            <tr>
                                <th>序號</th>
                                <th>書名</th>
                                <th>作者</th>
                                <th>價格</th>
                                <th>操作</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr v-for = 'book in filterBooks'>
                                <td>{{book.id}}</td>
                                <td>{{book.author}}</td>
                                <td>{{book.name}}</td>
                                <td>{{book.price}}</td>
                                
                            <!--模板標籤 v-if    v-else-->
                                
                            <template v-if = 'book.id %2 == 0'>
                                <td  class="text-left">
                                    <button type="button"  class="btn btn-success"  class="del" @click = "delBook(book)">刪除</button>
                                    <button type="button"  class="btn btn-success" @click = "updateBook(book)" >修改</button>
                                </td>
                            </template>    
                            <template v-else>
                                <td  class="text-left">
                                                      // 建立點選事件
                                    <button type="button"  class="btn btn-danger"  class="del" @click = "delBook(book)">刪除</button>
                                    <button type="button"  class="btn btn-danger"  @click = "updateBook(book)">修改</button>
                                </td>
                            </template>    
                                
                            </tr>
                        </tbody>
                        
                    </table>
                    
          <!--  新增書籍   -->                   
                    <div id="add-book">
                    
                    <!--查詢輸入框-->
                        <div class="row" style="margin-bottom: 30px;">
                            
                            <div class="col-md-4" style="text-align: left;font-size: 16px;line-height: 30px;">
                                請輸入查詢書名:
                            </div>
                            <div class="col-md-5"  style="text-align: left;">

                         // v-model :在表單控制元件元素(input等)上建立雙向資料繫結(資料來源);跟Angular中 ng-model 用法一樣。
                                <input type="text" class="form-control" v-model = "search" /> 
                            </div>
                                                  
                        </div>
                 
                        <h3>新增書籍</h3>
                        <hr />
                        <div class="form-group">
                            <label for="group">書名</label>
                            <input type="text" class="form-control" id="group" v-model = "book.name">
                        </div>
                        <div class="form-group">
                            <label for="author">作者</label>
                            <input type="text" class="form-control" id="author" v-model = "book.author">
                        </div>
                        <div class="form-group">
                            <label for="price">價格</label>
                            <input type="text" class="form-control" id="price" v-model = "book.price">
                        </div>
                        <button class="btn btn-primary btn-block" v-on:click = "addBook()">新增</button>
                    </div>
                    
          <!--  修改書籍   -->     
                    <div id="update-book">
                        <h3>修改書籍</h3>
                        <hr />
                        <div class="form-group">
                            <label for="group1">書名</label>
                            <input type="text" class="form-control" id="group1"  v-model = "book.name">
                        </div>
                        <div class="form-group">
                            <label for="author1">作者</label>
                            <input type="text" class="form-control" id="author1" v-model = "book.author">
                        </div>
                        <div class="form-group">
                            <label for="price1">價格</label>
                            <input type="text" class="form-control" id="price1" v-model = "book.price">
                        </div>
                        <button class="btn btn-primary btn-block" v-on:click = "updatedBook()">完成</button>
                    </div>                 
                    
                </div>
            </div>
        </div>
         
        // 匯入JQuery 框架
        <script type="text/javascript" src="js/jquery-3.1.1.min.js"></script>

        // 匯入自己的JS指令碼
        <script type="text/javascript" src="js/vue demo.js"></script>
        
     </body>
</html>

框架搭好了,先匯入一下資料(隨手寫的),在data中,最後的search是最後查詢功能要用到的,與查詢中 v-model = "search"繫結:

data : {
                    book : [{                        
                        id : 0,
                        author : '',
                        name : '',
                        price : ''                        
                    }],
                    
                    books : [{                        
                        id : 1,
                        author : '曹雪芹',
                        name : '紅樓夢',
                        price : 36.00                        
                    },{                        
                        id : 2,
                        author : '曹雪芹',
                        name : '三國演義',
                        price : 37.00        
                    },{                        
                        id : 3,
                        author : '曹雪芹',
                        name : 'Good boy',
                        price : 85.00                
                    },{                    
                        id : 4,
                        author : '曹雪芹',
                        name : '紅樓夢',
                        price : 39.00
                   
                    }],      
                    
                    search : ""      // 查詢功能使用,【注意】""中不能加空格,否則直接預設查詢空格
                    
                }

接下來,要開始做功能了,在methods 裡面寫新增、刪除、修改功能(函式):

var id = 0;      
var vm = new Vue({
                
                el : "#app",
        // 計算函式 動態變化的資料            
                
                methods : {     //   寫函式
                    
                    addBook : function(){
                        
                        this.book.id = this.books.length + 1;
                        this.books.push(this.book);
                        this.book = {};
                        
                    },
                    
                    delBook : function(book){
                        var blength = this.books.length;
                        this.books.splice(book.id-1,1 );
                        
                        for(var i = 0;i < blength;i++){
                            if(book.id < this.books[i].id){
                                this.books[i].id -= 1;                                
                            }                            
                        }    
                    },
                    
      // 修改按鈕                
                    updateBook : function(book){
                        
                        $("#add-book").css("display","none");
                        $("#update-book").css("display","block");
                        id = book.id;
                        
                    },
        
        // 修改完成後的 確認按鈕點選事件
                    updatedBook : function(){
                        
                        this.book.id = id;
                        this.books.splice(id-1,1,this.book);
                        $("#add-book").css("display","block");
                        $("#update-book").css("display","none");
                        this.book = {};
                        
                    }
                    
                },
})

然後在computed中,定義過濾器。利用 computed 計算屬性時,是將content和message繫結,只有當message發生變化時,才會觸發content。

// 計算屬性(過濾) 查詢功能
                
                computed : {
                    
                    filterBooks : function(){
                        var books = this.books;
                        var search = this.search;
                         
                        /*if(!search){         // 沒有輸入查詢內容 ( 手動寫的查詢功能 )     
                            return books;
                }                        
                        var arr = [];                  
                        for(var i = 0; i < books.length;i++){
                            var index =  books[i].name.indexOf( search );
                            if(index > -1){
                                arr.push(books[i]);
                            }
                        }                    
                        return arr;   
                        */

                    // vue 中的過濾器
                 
                        return books.filter(function(book){
                            return book.name.toLowerCase().indexOf(search.toLocaleLowerCase()) != -1  
                          //  不區分大小寫查詢                    
                        });        
                    }
                    
                },

這樣子我們的增刪改查功能就完成了,雖然還有些許不完善,但是基本的功能已經實現了。

區區100行JS程式碼,就可以實現原生JS洋洋灑灑好幾百行的程式碼功能,可以看出Vue.js確實很輕便、很好用。

但是,使用框架的前提也是在原生JS基礎之上的,不能忽視基礎的重要性!

今天的分享結束了,如有問題,可以提出來,小W同大家一起解決。如果有不妥的地方,歡迎拍磚~~

完整JS程式碼附上:

var id = 0;      
var vm = new Vue({
                
                el : "#app",
        // 計算函式 動態變化的資料            
                
                methods : {     //   寫函式
                    
                    addBook : function(){
                        
                        this.book.id = this.books.length + 1;
                        this.books.push(this.book);
                        this.book = {};
                        
                    },
                    
                    delBook : function(book){
                        var blength = this.books.length;
                        this.books.splice(book.id-1,1 );
                        
                        for(var i = 0;i < blength;i++){
                            if(book.id < this.books[i].id){
                                this.books[i].id -= 1;                                
                            }                            
                        }    
                    },
                    
      // 修改按鈕                
                    updateBook : function(book){
                        
                        $("#add-book").css("display","none");
                        $("#update-book").css("display","block");
                        id = book.id;
                        
                    },
        
        // 修改完成後的 確認按鈕點選事件
                    updatedBook : function(){
                        
                        this.book.id = id;
                        this.books.splice(id-1,1,this.book);
                        $("#add-book").css("display","block");
                        $("#update-book").css("display","none");
                        this.book = {};
                        
                    }
                    
                },
                
                // 計算屬性(過濾) 查詢功能
                
                computed : {
                    
                    filterBooks : function(){
                        var books = this.books;
                        var search = this.search;
                        
                        /*if(!search){         // 沒有輸入查詢內容        
                            return books;
                }                        
                        var arr = [];                  
                        for(var i = 0; i < books.length;i++){
                            var index =  books[i].name.indexOf( search );
                            if(index > -1){
                                arr.push(books[i]);
                            }
                        }                    
                        return arr;   
                        */
                    // vue 中的過濾器
                    
                        return books.filter(function(book){
                            return book.name.toLowerCase().indexOf(search.toLocaleLowerCase()) != -1                        
                        });        
                    }
                    
                },
                                
                data : {
                    book : [{                        
                        id : 0,
                        author : '',
                        name : '',
                        price : ''                        
                    }],
                    
                    books : [{                        
                        id : 1,
                        author : '曹雪芹',
                        name : '紅樓夢',
                        price : 36.00                        
                    },{                        
                        id : 2,
                        author : '曹雪芹',
                        name : '三國演義',
                        price : 37.00        
                    },{                        
                        id : 3,
                        author : '曹雪芹',
                        name : 'Good boy',
                        price : 85.00                
                    },{                    
                        id : 4,
                        author : '曹雪芹',
                        name : '紅樓夢',
                        price : 39.00
                   
                    }],      
                    
                    search : ""      // 查詢功能,""中不能加空格,否則預設查詢空格
                    
                }
                
                
            })