vue 添加功能,根据id删除功能, 关键字实现数组过滤,私有过滤器和全局过滤器

854 阅读3分钟

品牌管理案例

添加新品牌, 删除品牌, 根据条件筛选品牌

首先引入两个包

<script src="./lib/vue.js"></script>
<link rel="stylesheet" href="./lib/bootstrap.css">

添加数据的框

<div class="panel-heading">
                <h3 class="panel-title">添加品牌</h3>
            </div>
            <div class="panel-body form-inline">
                <label>
                    ID:
                    <input type="text" class="form-control" v-model="id">
                </label>
                <label>
                    Name:
                    <input type="text" class="form-control" v-model="name">
                </label>
      <!-- 在vue中使用绑定机制,为元素指定处理函数的时候,如果加了小括号,就可以给函数传参了 -->
                <input type="button" value="添加" class="btn btn-primary" @click="add">
                

table表格

1.删除@click.prevent="del(item.id)" 点击事件

prevent阻止默认行为 item.id传的参数

2.搜索search方法传参数keywords

<table class="table table-bordered table-hover table-striped">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Name</th>
                    <th>Ctime</th>
                    <th>Operation</th>
                </tr>
            </thead>
            <tbody>
                <!-- 之前,v-for 中的数据,都是从 data 上的list 中直接渲染过来的
                现在,我们自定义了一个 search 方法,同时,把 所有关键字,通过传参的形式,传递给了
                search 方法 -->
                <!-- 在search 方法内部,通过执行 for循环,把所有符合 搜索关键字的数据,保存到一个新数组中,
                返回 -->
                <tr v-for="item in search(keywords)" :key="item.id">
                    <td>{{ item.id }}</td>
                    <td>{{item.name}}</td>
                    <td>{{item.ctime}}</td>
                    <td>
                        <a href="" @click.prevent="del(item.id)">删除</a>
                    </td>

                </tr>
            </tbody>
        </table>
data数据,以及methods方法

1.添加方法

分析:

1.获取到 id 和 name ,直接从 data 上面获取

2.组织出一个对象

3.把这个对象,调用 数组的相关方法,添加到 当前data 上的list 中

4.注意:在vue中,已经实现了数据的双向绑定,每当我们修改了data 中的数据,vue 会默认监听到数据的改动,自动把最新的数据,应用到页面上去;

5.当我们意识到上面的第四步的时候,就证明大家已经入门vue了,我们更多的是在进行 VM中Model 数据的操作,同时,在操作 Model 数据的时候,指定的业务逻辑操作

data: {
                id: '',
                name: '',
                keywords: '', //所搜的关键字
                list: [
                    { id: 1, name: '奔驰', ctime: new Date() },
                    { id: 2, name: '宝马', ctime: new Date() },
                ]

            },
            methods: {
                add() {
                    var car = { id: this.id, name: this.name, ctime: new Date() }
                    this.list.push(car)
                    this.id = this.name = ''
                }
       }

2.删除方法

根据ID删除数据

分析:

1.如何根据ID,找到要删除在这一项的索引

2.如果找到索引了,直接调用 数组的 splice 方法

  methods: {
       del(id) {

                    // this.list.some((item,i)=>{
                    //     if(item.id==id){
                    //         this.list.splice(i,1);
                    //         // 在数组的 some 方法中,如果return true ,就会立即终止这个数组的后续循环
                    //         return true;
                    //     }
                    // })
                    var index = this.list.findIndex(item => {
                        if (item.id == id) {
                            return true;
                        }
                    })
                    this.list.splice(index, 1);
                }
  }

3.数组过滤

filter和数组includes方法过滤

methods: {
        search(keywords) {//根据关键字,进行数据的搜索
              方法一
                    // var newList=[]
                    //  this.list.forEach(item=>{
                    //   if(item.name.indexOf(keywords) != -1) {
                    //       newList.push(item)
                    //   }
                    //   })
                    //   return newList

                    // 注意:forEach  some filter findIndex 这些都属于数据的新方法
                    // 都会对数组中的每一项,进行遍历,执行相关的操作
                    
                    方法二
                    return this.list.filter(item => {
                        // if(item.name.indexOf(keywords) !=-1)

                        // 注意:ES6中,为字符串提供了一个新方法,叫做 string.prototype.includes('要包含的字符串')
                        // 如果包含,则返回 true ,否则返回 false

                        if (item.name.includes(keywords)) {
                            return item
                        }
                    })
                    // return newList
                }
  }

过滤器

概念:Vue.js允许自定义过滤器,可被用作一些常见的文本格式化过滤器可以用在两个地方:插值表达式和v-bind表达式 过滤器应该被添加在JavaScript表达式的尾部,由“管道”符指示;

私有过滤器

1.HTML元素

  <td>{{item.ctime | dateFormat()}}</td>

1.私有filters定义方式:

只能在 当前VM对象所控制的View区域进行使用

  filters: {//定义私有过滤器 过滤器有两个条件 【过滤器名称 和 处理函数】
                dateFormat: function (dateStr, pattern='') {   
                //在参数列表中 通过pattern=''来指定形参默认值,防止报错
                    //根据给定的时间字符串,得到特定的时间
                    var dt = new Date(dateStr)

                    //    yyyy-mm-dd
                    var y = dt.getFullYear()
                    var m = (dt.getMonth() + 1).toString().padStart(2, '0')
                    var d = dt.getDate().toString().padStart(2, '0')
                
                    if (pattern.toLowerCase() === 'yyyy-mm-dd') {
                        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} ~~~`
                    }
                }
            }

使用ES6中的字符串新方法 例:var d = dt.getDate().toString().padStart(2, '0') String.prototype.toString().padStart(maxLength,fillString='') 或String.prototype.toString().padEnd(maxLength,fillString='')来填充字符串

全局过滤器

        // 全局过滤器,进行时间格式化
        // 所谓的全局过滤器,就是所有的VM 实例都共享的
        Vue.filter('dateFormat', function (dateStr, pattern = '') {
            //根据给定的时间字符串,得到特定的时间
            var dt = new Date(dateStr)

            //    yyyy-mm-dd
            var y = dt.getFullYear()
            var m = dt.getMonth() + 1
            var d = dt.getDate()
            // return y + '-' + m + '-' + d

            if (pattern.toLowerCase() === 'yyyy-mm-dd') {
                return `${y}-${m}-${d}`
            } else {
                var hh = dt.getHours()
                var mm = dt.getMinutes()
                var ss = dt.getSeconds()

                return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
            }
        })

过滤器调用的时候,采用的是就近原则,如果私有过滤器和全局过滤器名称一致,这个时候优先调用私有过滤器