HMVue2.5【filter过滤器】


 1 过滤器的注意事项

2 过滤器的基本使用

 

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
head>
<body>
    
    <div id="app">
        <p>msg的值是:{{msg}}p>
        
        <p>msg的值是:{{msg | capi}}p>
        
    div>

    <script src="./lib/vue-2.6.12.js">script>
    <script>
        // Vue.config.devtools = true; //安装了Vue-devtools插件但在浏览器控制台不显示的解决
        const vm = new Vue({
            el: '#app',
            data: {
                msg: 'hello vue'
            },
            //过滤器函数必须定义到filters节点内
            filters: {
                //注意:过滤器函数形参中的 val,永远都是“管道符|”前面的那个值
                capi(val){ 
                    console.log(val)
                    //charAt获取字符串中指定索引位置的字符
                    console.log(val.charAt(0))
                    //首字母小写转为大写
                    const first = val.charAt(0).toUpperCase() 
                    //从索引1位置开始截取字符串直至最后
                    const other = val.slice(1) 
                    // 强调:过滤器中,一定要有一个返回值
                    return first+other 
                }
            }
        })
    script>

body>
html>

 3 私有过滤器和全局过滤器

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
head>
<body>
    
    <div id="app">
        <p>msg的值是:{{msg | capi}}p> 
    div>
    <div id="app2">
        <p>msg的值是:{{msg | capi}}p> 
    div>

    <script src="./lib/vue-2.6.12.js">script>
    <script>
        // 使用 Vue.filter() 定义全局过滤器
        Vue.filter('capi', function(str){
            const first = str.charAt(0).toUpperCase() 
            const other = str.slice(1) 
            return first+other+'~~~'
        });
        //--------------------------------------------------------------
        //一个vm只能控制一个大div
        //此处,vm控制第一个div(id=app);第二个div(id=app2)不受影响
        const vm = new Vue({
            el: '#app',
            data: {
                msg: 'hello vue'
            },
            filters: { 
                capi(val){  //私有过滤器,只能在app中使用,app2中调用时会报错
                    const first = val.charAt(0).toUpperCase() 
                    const other = val.slice(1) 
                    return first+other 
                }
            }
        });
        //--------------------------------------------------------------
        const vm2 = new Vue({
            el: '#app2',
            data: {
                msg: 'haifei'
            },
        });
    script>

body>
html>

 

4 使用全局过滤器格式化时间(+HMVue2.4案例)

 

DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>品牌列表案例title>
        <link rel="stylesheet" href="./lib/bootstrap.css">
        <link rel="stylesheet" href="./css/brandlist.css">
    head>

    <body>

        <div id="app">
            
            <div class="card">
            <div class="card-header">添加品牌div>
            <div class="card-body">
                
                
                <form @submit.prevent="add">   
                    <div class="form-row align-items-center">
                        <div class="col-auto">
                            <div class="input-group mb-2">
                                <div class="input-group-prepend">
                                    <div class="input-group-text">品牌名称div>
                                div>
                                <input type="text" class="form-control" placeholder="请输入品牌名称" v-model.trim="brand">
                            div>
                        div>
                        <div class="col-auto">
                            <button type="submit" class="btn btn-primary mb-2">添加button>
                        div>
                    div>
                form>
            div>
            div>

            
            <table class="table table-bordered table-hover table-striped">
                <thead>
                    <tr>
                        <th scope="col">#th>
                        <th scope="col">品牌名称th>
                        <th scope="col">状态th>
                        <th scope="col">创建时间th>
                        <th scope="col">操作th>
                    tr>
                thead>
                <tbody>
                    <tr v-for="item in list" :key="item.id">
                        <td>{{item.id}}td>
                        <td>{{item.name}}td>
                        <td>
                            <div class="custom-control custom-switch">
                                <input type="checkbox" class="custom-control-input" :id="'cb' + item.id" v-model="item.status">
                                
                                <label class="custom-control-label" :for="'cb' + item.id" v-if="item.status">已启用label>
                                <label class="custom-control-label" :for="'cb' + item.id" v-else>已禁用label>
                            div>
                        td>
                        <td>{{item.time | dateFormat}}td>
                        <td>
                            <a href="javascript:;" @click="remove(item.id)">删除a>
                        td>
                    tr>
                tbody>
            table>
        div>

        
        <script src="./lib/dayjs.min.js">script>
        <script src="./lib/vue-2.6.12.js">script>
        <script>
            //声明格式化时间的全局过滤器
            Vue.filter('dateFormat', function(time){
                /*思路:
                    1. 对 time 进行格式化处理,得到 YYYY-MM-DD HH:mm:ss
                    2. 把 格式化的结果,return 出去
                */
                
                //方法1:传统方法
                /*
                return time.getFullYear()+'-'+(time.getMonth()+1)+'-'+time.getDate()
                       +' '
                       +time.getHours()+':'+time.getMinutes()+':'+time.getSeconds()
                */

                //方法2:利用dayjs库:直接调用dayjs()得到的是当前时间,调用dayjs(给定的日期时间)得到指定的日期
                const dtStr = dayjs(time).format('YYYY-MM-DD HH:mm:ss')
                  return dtStr
            });
            //-------------------------------------------------
            const vm = new Vue({
                el: '#app',
                data: {
                    // 品牌的列表数据
                    list: [
                        {id:1, name:'宝马', status:true, time:new Date()},
                        {id:2, name:'奔驰', status:false, time:new Date()},
                        {id:3, name:'奥迪', status:true, time:new Date()},
                    ],
                    // 用户输入的品牌名称
                    brand: '',
                    //下一个可用的id
                    nextId: 4, 
                },
                methods: {
                    // 点击链接,删除对应的品牌信息
                    remove(id){
                        console.log(id)
                        this.list = this.list.filter(item => item.id!==id)
                    },
                    // 阻止表单的默认提交行为之后,触发 add 方法
                    add(){
                        console.log(this.brand)
                        if(this.brand === ""){
                            alert('必须填写品牌名称')
                            return
                        }else{
                            //1. 先把要添加的品牌对象,整理出来
                            const obj = {
                                id: this.nextId,
                                name: this.brand,
                                status: true,
                                time: new Date()
                            }
                            //2. 往 this.list 数组中 push 步骤 1 中得到的对象
                            this.list.push(obj)
                            //3. 清空 this.brand
                            this.brand = ''
                            //4. 让 this.nextId 自增 +1
                            this.nextId++
                        }
                    }
                },
            })
        script>

    body>

html>

https://dayjs.fenxianglu.cn/category/parse.html

5 连续调用多个过滤器

6 过滤器传参

7 过滤器的兼容性

 8 总结