技术点: 1,各种车其实都是放在列表[]中,所以,添加也是调用add()函数利用v-model进行添加进列表,this.list.push() 2,删除一个也是利用列表的功能,this.list.splice(index, 1) 3,全文检索,写一个search(keywords)函数,在函数里面定义一个新的NewList的空列表,然后在写一个函数返回被搜寻的字段(有两种方法),将这个search返回后在 v-for里面进行遍历
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="../css/bootstrap.min.css"> <script src="../js/vue-2.4.0 .js"></script> <title>品牌案例</title> </head> <body> <div id="app"> <div class="panel panel-primary"> <!-- panel-heading为面板的标题 --> <div class="panel-heading"> <!-- 带有title的面板标题 --> <h3 class="panel-title">添加品牌</h3> </div> <div class="panel-body form-inline"> <label> Id: <input type="text" class="form-control" v-model="id"> <!-- form-control为input定义了样式 --> </label> <label> Name: <!-- 这里的绑定@keyup键盘抬起事件,当按下Enter回车键后出发添加事件add --> <!-- @keyup.后面可以跟enter,tab,delete,esc,space,up,down,left,right,也可以跟键盘码 --> <!-- <input type="text" class="form-control" v-model='name' @keyup.enter = "add"> --> <input type="text" class="form-control" v-model='name' @keyup.f2 = "add"> </label> <input type="button" value="添加" class="btn btn-primay" @click="add()"> <label> 搜索名称关键字: <input type="text" class="form-control" v-model='keywords' v-focus id="Search"> </label> </div> </div> <!-- table-bordered为表格添加边框 --> <!-- table-hover 鼠标移上有效果 --> <!-- able-striped 斑马线表格 --> <table class="table table-bordered table-hover table-striped"> <thead> <tr> <th>Id</th> <th>Name</th> <th>Ctime</th> <th v-color = "'pink'">Operation</th> </tr> </thead> <tbody> <!-- 之前, v-for中的数据,都是直接从data上的list中直接渲染过来额的 --> <!-- <tr v-for="item in list" :key=item.id> --> <!-- 现在, 自定义一个search方法,同时把所有关键字,通过传参的形式,传递给search方法 --> <!-- 在search方法内部通过for吧所有符号关键字保存到一个新数组中,返回 --> <tr v-for="item in search(keywords)" :key=item.id> <td v-text='item.id'></td> <td v-text='item.name'></td> <td>{{ item.Ctime | dateFormat('yy-mm-dd') }}</td> <td> <a href="" @click.prevent="del(item.id)">删除</a> <!-- 阻止其默认行为 --> </td> </tr> </tbody> </table> </div> <script> // 全局的过滤器, 所谓的全局过滤器就是全局都可以共享 Vue.filter('dateFormat', function(dateStr, pattern) { // 根据给定的时间字符串,得到特定的时间 var dt = new Date(dateStr) // 将4:2:3 补充为4:02:03 // String.padStart(补充的位数,补充哪个数) padStart从前面补,padEnd从后面补 var y = dt.getFullYear().toString().padStart(2, '0') var m = (dt.getMonth() + 1).toString().padStart(2, '0') // 因为从零开始所以加1 var d = dt.getDate().toString().padStart(2, '0') // return y + '-' + m + '-' + d if (pattern.toLowerCase() === 'yyy-mm-dd'){ // toLowerCase() 用于把字符串转化为小写 return `${y}-${m}-${d}` }else{ var hh = dt.getHours().toString().padStart(2, '0') var mm = dt.getMinutes().toString().padStart(2, '0') var ss = dt.getSeconds().toString().padStart(2, '0') return `${y}-${m}-${d} ${hh}:${mm}:${ss}` } }) // 自定义全局案件修饰符 Vue.config.keyCodes.f2 = 113 // 前言:利用原生的JS来写 document.getElementById('Search').focus() 这样刷新之后输入框自动触发点击 // 用Vue来写的话,就得定义全局指令Vue.directive() 如定义: v-focus Vue.directive('focus', { // directive和过滤器的filter类似,全局不加s,局部加s,局部指的是vm的作用域的局部 bind: function (el){ // 这里的el 表示js原生封装的对象 // 每当指令绑定到这个元素上的时候,会立即执行这个bind函数,只执行一次 // 因为,一个元素只有插入DOM之后才能获取焦点,所以 el.focus() 不成功 }, inserted: function (el){ // inserted 表示元素插入到DOM中的时候,会执行inserted函数,【只触发一次】 el.focus() }, updated: function (el) { // 当VNode更新的时候,会执行update,可能会触发多次 }, }) // 自定义一个设置字体颜色的指令 Vue.directive('color', { // 可以和 filter一样,可以写进vm的局部里面去 bind: function (el, binding) { el.style.color = binding.value }, // 简写写法,相当于把 // 'fontSize': function (el){ // el.style.fontSize = parseInt(binding.value) + 'px' // } }) var vm = new Vue({ el: '#app', data: { id: '', name: '', keywords: '', list: [ { id: 1, name: '奔驰', Ctime: new Date() }, // new Data() 表示时间 { id: 2, name: '宝马', Ctime: new Date() }, ] }, methods: { add(){ var newList = this.list.push({id: this.id, name: this.name, Ctime: new Date()}) }, del(id){ // 删除的第一种方法 // some(value,index,array) 看是否满足()内条件之一,满足就返回true // this.list.some( (item, i)=> { // some方法就是看数组中是否有满足(item, i)的任意条件的,满足的话就返回true // if (item.id == id){ // this.list.splice(i, 1) // return true; // } // }) // 删除的第二种方法, 将被选中的ID进行返回 var index = this.list.findIndex(item => { if (item.id == id){ return true; } }) this.list.splice(index, 1) }, search(keywords){ // 第一种搜索的方法:forEach和indexOf一块实现 // var newListss = [] // this.list.forEach(item => { // 如果不等于-1就说明包含在里面 // if (item.name.indexOf(keywords) != -1){ // 看index.name中是否包含keywords // newListss.push(item) // } // }); // return newListss // 第二种搜索的方式:filter和include的方式 // forEach, some, filter, findIndex 这些都属于数组的新方法 // 都会对数组中的每一项进行遍历进行操作 var newListss = this.list.filter( item => { // ES6 中字符串提供了一个新方法,叫做String.prototype.include('要包含的字符串') // 如果包含,则返回true,否则返回false if(item.name.includes(keywords)){ return item } }) return newListss } }, }) </script> </body> </html>