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+iview分页组件的封装
Nov 17 Vue.js
Vue组件生命周期运行原理解析
Nov 25 Vue.js
Vue实现图书管理小案例
Dec 03 Vue.js
vue实现两个区域滚动条同步滚动
Dec 13 Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
vue递归实现树形组件
Jul 15 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
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
竞选班干部演讲稿300字
2014/08/20 职场文书
群教班子对照检查材料
2014/08/26 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
护理见习报告范文
2014/11/03 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL
JavaScript实现音乐播放器
2022/08/14 Javascript