Vue实现简单图书管理例子

以下内容整理自网络。

说明

本例主要涵盖以下知识点:

  1. 数据绑定
  2. 条件与循环
  3. 计算属性
  4. 监听器
  5. 过滤器
  6. 常见数组和对象操作
  7. vue生命周期

示例演示

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>图书管理案例</title>

    <style type="text/css">
        .grid {
            margin: auto;
            width: 530px;
            text-align: center;
        }
        .grid table {
            border-top: 1px solid #C2D89A;
            width: 100%;
            border-collapse: collapse;
        }
        .grid th,td {
            padding: 10;
            border: 1px dashed #F3DCAB;
            height: 35px;
            line-height: 35px;
        }
        .grid th {
            background-color: #F3DCAB;
        }
        .grid .book {
            padding-bottom: 10px;
            padding-top: 5px;
            background-color: #F3DCAB;
        }

        .grid .total{
            margin-top: 10px;
        }
    </style>
</head>
<body>
    <div id='app'>
        <div class="grid">
            <div>
                <h1>图书管理</h1>
                <div class="book">
                <div>
                    <label for="id">
                    编号:
                    </label>
                    <input type="text" id="id" v-model='id' :disabled="flag" v-focus>
                    <label for="name">
                    名称:
                    </label>
                    <input type="text" id="name" v-model='name'>
                    <button @click='add' :disabled='submitFlag'>提交</button>
                </div>
                </div>
            </div>
            <table>
                <thead>
                <tr>
                    <th>编号</th>
                    <th>名称</th>
                    <th>时间</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                <tr :key='item.id' v-for='item in books'>
                    <td>{{item.id}}</td>
                    <td>{{item.name}}</td>
                    <td>{{item.date | format('yyyy-MM-dd hh:mm:ss')}}</td>
                    <td>
                    <a href="" @click.prevent='toEdit(item.id)'>修改</a>
                    <span>|</span>
                    <a href="" @click.prevent='toDelete(item.id)'>删除</a>
                    </td>
                </tr>
                </tbody>
            </table>
            <div class="total">
                <span>图书总数:</span>
                <span>{{total}}</span>
            </div>
        </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script type="text/javascript">
     // 聚焦指令
     Vue.directive('focus', {
      inserted: function (el) {
        el.focus();
      }
    });

    // 自定义日期过滤器
    Vue.filter('format', function(value, arg) {
      function dateFormat(date, format) {
        if (typeof date === "string") {
          var mts = date.match(/(\/Date\((\d+)\)\/)/);
          if (mts && mts.length >= 3) {
            date = parseInt(mts[2]);
          }
        }
        date = new Date(date);
        if (!date || date.toUTCString() == "Invalid Date") {
          return "";
        }
        var map = {
          "M": date.getMonth() + 1, //月份 
          "d": date.getDate(), //日 
          "h": date.getHours(), //小时 
          "m": date.getMinutes(), //分 
          "s": date.getSeconds(), //秒 
          "q": Math.floor((date.getMonth() + 3) / 3), //季度 
          "S": date.getMilliseconds() //毫秒 
        };
        format = format.replace(/([yMdhmsqS])+/g, function(all, t) {
          var v = map[t];
          if (v !== undefined) {
            if (all.length > 1) {
              v = '0' + v;
              v = v.substr(v.length - 2);
            }
            return v;
          } else if (t === 'y') {
            return (date.getFullYear() + '').substr(4 - all.length);
          }
          return all;
        });
        return format;
      }
      return dateFormat(value, arg);
    });

        var vm = new Vue({
            el: '#app',
            data: {
                submitFlag: false,
                flag: false,
                id:'',
                name:'',
                books:[]
            },
            methods: {
                add: function(){
                    // 修改
                    if(this.flag){
                       // 根据当前ID更新数值中的数据
                       this.books.some((item)=>{
                            if(item.id == this.id){
                                item.name=this.name;
                                item.date=new Date();
                                // 完成更新后终止循环
                                return true;
                            }
                        })
                        
                        this.flag=false
                    }else{
                        this.flag=false;
                        var book={};
                        book.id=this.id;
                        book.name=this.name;
                        book.date=new Date();
                        this.books.push(book);
                        
                    }
                    
                    this.id='';
                    this.name='';
                },
                toEdit: function(id){
                    // 根据id查询对象
                    var book= this.books.filter(function(item){
                        return item.id==id;
                    });

                    this.id=book[0].id;
                    this.name=book[0].name;
                    // 禁止修改id
                    this.flag=true;
                },
                toDelete: function(id){
                    // 方法一
                    var index = this.books.findIndex(function(item){
                        return item.id==id;
                    });
                    
                    this.books.splice(index, 1);
                    // 方法二
                    // this.books = this.books.filter(function(item){
                    //     return item.id != id;
                    // });
                }
            },
            computed: {
                total: function(){
                    // 计算图书的总数
                    return this.books.length;
                }
            },
            watch: {
                name: function(val){
                    var flag = this.books.some(function(item){
                        return item.name==val;
                    });

                    if(flag){
                        // 名称已存在,禁用提交按钮
                        this.submitFlag=true;
                    }else{
                        this.submitFlag=false;
                    }
                }
            },
            mounted:function() {
                // 模板可用
                var data = [{
                        id:1,
                        name:'大秦帝国',
                        date: new Date()
                    },
                    {
                        id:2,
                        name:'走出剧情',
                        date: new Date()
                    },
                    {
                        id:3,
                        name:'活着',
                        date: new Date()
                    }];
                this.books = data;
            }
        })
    </script>
</body>
</html>
发布了370 篇原创文章 · 获赞 676 · 访问量 208万+

猜你喜欢

转载自blog.csdn.net/IndexMan/article/details/104952736