Vue实现图书管理小案例


Posted in Vue.js onDecember 03, 2020

本文实例为大家分享了Vue实现图书管理的具体代码,供大家参考,具体内容如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
     .grid{
      margin:auto;
      width:500px;
      text-align:center;
     }
     .grid table{
      width:100%;
      border-collapse:collapse;
     }
     .grid th,td{
      padding:10px;
      border:1px solid orange;
      height:35px;
      line-height:35px;
     }
     .grid th{
      background-color:orange;
     }
     .book{
      background-color:orange;
      border-bottom:1px solid #ccc;
      padding:5px;
     }
     input{
      width:150px;
      outline:none;
     }
     .grid .total{
      height:30px;
      line-height:30px;
      background-color:orange;
      border-bottom:1px solid #ccc;
     }
  </style>
</head>
<body>
<div id="app">
  <div class="grid">
   <div>
     <h1>图书管理</h1>
     <div class="book">
      <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='handle' :disabled='submitFlag'>提交</button>
     </div>
   </div>
   <div class="total">
     <span>图书总数:</span>
     <span>{{total}}</span>
   </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='deleteBook(item.id)'>删除</a>
       </td>
     </tr>
     </tbody>
   </table>
</div>
<script src="js/vue.js"></script>
<script>
  //自定义指令
  Vue.directive('focus',{
    inserted:function(el){
      el.focus();
    }
  })
  //过滤器(格式化日期)
  Vue.filter('format', function(value, arg) {
      function dataFormat(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 dataFormat(value, arg);
    })

    var vm=new Vue({
      el:'#app',
      data:{
       flag:false,
       submitFlag:false,
       id:'',
       name:'',
       books:[]
      },
      methods:{
       handle:function(){
         if(this.flag){
          //修改操作:就是根据当前的id去更新数组中对应的数据
          //箭头函数的this不是window
          //some方法判断什么时候终止循环
          this.books.some((item)=>{
            if(item.id==this.id){
              item.name=item.name;
              //完成更新操作之后,要终止循环
              return true;
            }
          });
          this.flag=false;
         }else{
          //添加操作
          //添加图书
          var book={};
          book.id=this.id;
          book.name=this.name;
          book.date=new Date();
          this.books.push(book);
         }
         //清空表单
         this.id='';
         this.name='';
       },//handle结束
       toEdit:function(id){
         //禁止修改id
         this.flag=true;
         //根据id查询出要编辑的数据
         var book=this.books.filter(function(item){
           return item.id==id;
         });
         //把获取的信息填充到表单
         this.id=book[0].id;
         this.name=book[0].name;
       },//toEdit结束
       deleteBook:function(id){
         //删除图书
         //根据id从数组中查找元素的索引
         var index=this.books.findIndex(function(item){
           return item.id==id;
         });
         //根据索引删除数组元素
         this.books.splice(index,1);
         
         //方法二:通过filter方法进行删除
         //this.books=this.books.filter(function(item){
          //return item.id!=id;
         //});
       }//deleteBook结束
      },
      computed:{
       total:function(){
         //计算图书的总数
         return this.books.length;
       }
      },//computed结束
      watch:{
       name:function(val){
         //验证图书名称是否已经存在
         var flag=this.books.some(function(item){
          return item.name==val;
         });
         if(flag){
          //图书名称存在
          this.submitFlag=true;
         }else{
          this.submitFlag=false;
         }
       }
      },//watch结束
      mounted:function(){
       //该生命周期钩子函数被触发的时候,模板已经可以使用
       //一般用于获取后台数据,然后把数据填充到模板
       //模拟接口
       var data=[{
         id:1,
         name:'三国演义',
         date:1585609975000
       },{
         id:2,
         name:'水浒传',
         date:1586609975000
       },{
         id:3,
         name:'红楼梦',
         date:1587609975000
       },{
         id:4,
         name:'西游记',
         date:1588609975000
       }];
       this.books=data;
      }
    });
</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
vue3弹出层V3Popup实例详解
Jan 04 Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
关于Vue Router的10条高级技巧总结
May 06 Vue.js
Vue实现动态查询规则生成组件
May 27 Vue.js
详解Vue项目的打包方式(生成dist文件)
Jan 18 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue elementUI表格控制对应列
Apr 13 Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
May 06 Vue.js
Vue router安装及使用方法解析
Dec 02 #Vue.js
vue3.0中setup使用(两种用法)
Dec 02 #Vue.js
vue3.0+vue-router+element-plus初实践
Dec 02 #Vue.js
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 #Vue.js
详解Vue3 Teleport 的实践及原理
Dec 02 #Vue.js
vue $router和$route的区别详解
Dec 02 #Vue.js
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 #Vue.js
You might like
mysql 字段类型说明
2007/04/27 PHP
使用PHP的日期与时间函数技巧
2008/04/24 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
php表单处理操作
2017/11/16 PHP
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
学习vue.js计算属性
2016/12/03 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
python小技巧之批量抓取美女图片
2014/06/06 Python
Python缩进和冒号详解
2016/06/01 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
护理自我鉴定范文
2013/10/06 职场文书
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
移动通信专业自荐信范文
2013/11/12 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
教师听课评语大全
2014/12/31 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
小学毕业感言100字
2015/07/30 职场文书
学习经验交流会策划书
2015/11/02 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
Python中Selenium对Cookie的操作方法
2021/07/09 Python
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android
MySQL 服务和数据库管理
2021/11/11 MySQL
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers