4vue过滤器

189 阅读5分钟

vue 允许自定义过滤器

eg:时间过滤

两个地方用

  • 在插值表达式中使用
  • 在v-bind中使用

过滤器应该放置在js尾部,由管道符指示

            <!-- 时间需要过滤器 -->
            <!-- 过滤器格式 平时{{name}}  对name做处理 {{name|nameope}}-->
            <!-- 定义过滤器  Vue.filter('过滤器名称',function(){}) -->
            <!-- function 的第一个参数被规定死了。永远都是管道符前面传递回来的数据 -->
            <!--  Vue.filter('过滤器名称',function(data){}) -->

正则表达式替换固定的值

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <link rel="stylesheet" href="./css/bootstrap.min.css">
        <script src="./lib/vue.js"></script>
    </head>
    
    <body>
        <div id="app">
    
            <p>{{msg|msgFormat}}</p>
    
        </div>
        <script>
            // 定义一个全局过滤器
            Vue.filter('msgFormat', function (msg) {
                // 只替换第一个 直接return
                // return  msg.replace('单纯','邪恶')
                // 正则,replace第一个参数除了字符串还可以是正则,g全局匹配
                // 替换全局
                // return msg.replace(/单纯/g, '邪恶')
            })
            var vm = new Vue({
                el: "#app",
                data: {
                    msg: '曾经我也是个单纯的少年,单纯的我,傻傻的问,这个世界谁是最单纯的'
                },
                methods: {
                }
            })
        </script>
    </body>
    
    </html>

传递参数替换非固定的值

  • 想替换成啥就是啥,传递参数('字符串')

  • 第一个位置占用了,从第二个开始

  • 过滤器可以传递多个参数,用逗号隔开字符串,问题直接显示时用+

  • 可不可以多次调用过滤器,先把原始值给第一个值过滤器使用,之后在把得到的值给第二个过滤器使用....

         <head>
             <meta charset="UTF-8">
             <meta name="viewport" content="width=device-width, initial-scale=1.0">
             <title>Document</title>
             <link rel="stylesheet" href="./css/bootstrap.min.css">
             <script src="./lib/vue.js"></script>
         </head>
         
         <body>
             <div id="app">
         
                 <p>{{msg|msgFormat('疯狂+1','123')|test}}</p>
         
             </div>
             <script>
                 // 定义一个全局过滤器
                 Vue.filter('msgFormat', function (msg,arg,arg2) {
                     // 想替换成啥就是啥,传递参数('字符串')
                     // 第一个位置占用了,从第二个开始
                     // 过滤器可以传递多个参数,用逗号隔开字符串,问题直接显示时用+
                     // 可不可以多次调用过滤器
                     return msg.replace(/单纯/g, arg+arg2)
                 })
                 Vue.filter('test',function(msg){
                     return msg+"===="
                 })
                 var vm = new Vue({
                     el: "#app",
                     data: {
                         msg: '曾经我也是个单纯的少年,单纯的我,傻傻的问,这个世界谁是最单纯的'
                     },
                     methods: {
                     }
                 })
             </script>
         </body>
         
         </html>
    

一对一的关系el绑定的不能显示1对多的关系,多个对象,多个绑定el,

全局过滤器 的调用只要是多对多的绑定,无论局部过滤器

        <!DOCTYPE html>
        <html lang="en">
        
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>时间过滤器</title>
            <link rel="stylesheet" href="./css/bootstrap.min.css">
            <script src="./lib/vue.js"></script>
        </head>
        <body>
            <div id="app">
                <div class="panel panel-primary">
                    <div class="panel-heading">
                        <h3 class="panel-title">添加品牌</h3>
                    </div>
                    <div class="panel-body form-inline">
                        <label for="">Id
                            <input type="text" name="" id="" v-model="id" class="form-control">
                        </label>
                        <label for="">Name
                            <input type="text" name="" id="" v-model="name" class="form-control">
                        </label>
                        <label for="">
                            <input type="button" value="添加" name="" id="" class="btn btn-primary" @click="add">
                        </label>
                        <label for="">搜索名称关键字
                            <input type="text" name="" id="" v-model="keywords" class="form-control">
                        </label>
                    </div>
                </div>
        
                <table class="table table-bordered table-hover table-striped">
                    <thead>
                        <th>ID</th>
                        <th>Name</th>
                        <th>Ctime</th>
                        <th>Operation</th>
                    </thead>
                    <tbody>
                        <tr v-for="item in search(keywords)" :key="item.id">
                            <td>{{item.id}}</td>
                            <td v-text="item.name"></td>
                            <td>{{item.ctime|dateFormat()}}</td>
                            <td><a href="" @click.prevent='dele(item.id)'>删除</a></td>
                        </tr>
                    </tbody>
                </table>
            </div>
            <div id="app2">
                <h2>{{1+2}}</h2>
                <p>{{dt|dateFormat}}</p>
            </div>
            <script>
                // 过滤器 start
                //时间过滤器,全局,时间事件格式化
                Vue.filter('dateFormat', function (dataStr,pattern='') {
                    // 根据给定的字符串dataStr,得到特定的时间
                    // yyyy-mm-dd   拼接
                    var dt = new Date(dataStr)
                    var y = dt.getFullYear()
                    var m = dt.getMonth() + 1
                    var d = dt.getDate()
                    //连接
                    // return y+'-'+m+'-'+d
                    //模板字符串
                    // return `yyyy-mm-dd`
                   
                    // 先变小写
                    if(pattern.toLowerCase()=='yyyy-mmm-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}`
                    }
                })
                // 过滤器 end
                var vm = new Vue({
                    el: "#app",
                    data: {
                        id: '',
                        name: '',
                        keywords: '',
                        list: [
                            { id: 1, name: '奔驰', ctime: new Date() },
                            { id: 2, name: '宝马', ctime: new Date() },
                            { id: 3, name: '路虎', ctime: new Date() }
                        ]
                    },
                    methods: {
                        add() {
                            // 拼接对象
                            var car = { id: this.id, name: this.name, ctime: new Date() }
                            //  push对象
                            this.list.push(car)
                            this.id = this.name = ''
                        },
                        dele(id) {
                            // 根据id找到删除对象的索引  some根据指定的条件判断不知道什么时候能找到,随时可以终止
                            this.list.some((item, i) => {
                                if (item.id === id) {
                                    // 找到索引后删除,直接调用数组的splice方法
                                    this.list.splice(i, 1)
                                    // 在some方法中return true ,就会立即终止这个数组的后续循环
                                    return true
                                }
                            })
                        },
                        search(keywords) {
                            ////1.2includes
                            var newList = this.list.filter(item => {
                                // es6中为字符串提供新的方法,string.prototype.includes('要包含的字符串'),包含返回true不包含返回false
                                // contains选取包含指定字符串的数据
                                if (item.name.includes(keywords)) {
                                    return item
                                }
                            })
                            return newList
                        }
                    }
                })
                var vm1 =new Vue({
               el:'#app2',
               data:{
                   dt:new Date()
               }
           })
            </script>
        </body>
        
        </html>

定义私有过滤器 filters 是对象,过滤器的两个条件过滤器名称和处理函数

  • 过滤器调用采用就近原则,如果私有过滤器和全局过滤器名称一样了,优先调用私有过滤器

       filters:{ dateFormat: function (dataStr,pattern='') {·····} }
    
  • 私有过滤器的使用

      <!DOCTYPE html>
      <html lang="en">
      
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>时间过滤器</title>
          <link rel="stylesheet" href="./css/bootstrap.min.css">
          <script src="./lib/vue.js"></script>
      </head>
      <body>
          <div id="app">
              <div class="panel panel-primary">
                  <div class="panel-heading">
                      <h3 class="panel-title">添加品牌</h3>
                  </div>
                  <div class="panel-body form-inline">
                      <label for="">Id
                          <input type="text" name="" id="" v-model="id" class="form-control">
                      </label>
                      <label for="">Name
                          <input type="text" name="" id="" v-model="name" class="form-control">
                      </label>
                      <label for="">
                          <input type="button" value="添加" name="" id="" class="btn btn-primary" @click="add">
                      </label>
                      <label for="">搜索名称关键字
                          <input type="text" name="" id="" v-model="keywords" class="form-control">
                      </label>
                  </div>
              </div>
      
              <table class="table table-bordered table-hover table-striped">
                  <thead>
                      <th>ID</th>
                      <th>Name</th>
                      <th>Ctime</th>
                      <th>Operation</th>
                  </thead>
                  <tbody>
                      <tr v-for="item in search(keywords)" :key="item.id">
                          <td>{{item.id}}</td>
                          <td v-text="item.name"></td>
                          <td>{{item.ctime|dateFormat()}}</td>
                          <td><a href="" @click.prevent='dele(item.id)'>删除</a></td>
                      </tr>
                  </tbody>
              </table>
          </div>
          <div id="app2">
              <h2>{{1+2}}</h2>
              <p>{{dt|dateFormat}}</p>
          </div>
          <script>
              // 过滤器 start
              //时间过滤器,全局,时间事件格式化
              Vue.filter('dateFormat', function (dataStr,pattern='') {
                  // 根据给定的字符串dataStr,得到特定的时间
                  // yyyy-mm-dd   拼接
                  var dt = new Date(dataStr)
                  var y = dt.getFullYear()
                  var m = dt.getMonth() + 1
                  var d = dt.getDate()
                  //连接
                  // return y+'-'+m+'-'+d
                  //模板字符串
                  // return `yyyy-mm-dd`
                 
                  // 先变小写
                  if(pattern.toLowerCase()=='yyyy-mmm-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}`
                  }
              })
              // 过滤器 end
              var vm = new Vue({
                  el: "#app",
                  data: {
                      id: '',
                      name: '',
                      keywords: '',
                      list: [
                          { id: 1, name: '奔驰', ctime: new Date() },
                          { id: 2, name: '宝马', ctime: new Date() },
                          { id: 3, name: '路虎', ctime: new Date() }
                      ]
                  },
                  methods: {
                      add() {
                          // 拼接对象
                          var car = { id: this.id, name: this.name, ctime: new Date() }
                          //  push对象
                          this.list.push(car)
                          this.id = this.name = ''
                      },
                      dele(id) {
                          // 根据id找到删除对象的索引  some根据指定的条件判断不知道什么时候能找到,随时可以终止
                          this.list.some((item, i) => {
                              if (item.id === id) {
                                  // 找到索引后删除,直接调用数组的splice方法
                                  this.list.splice(i, 1)
                                  // 在some方法中return true ,就会立即终止这个数组的后续循环
                                  return true
                              }
                          })
                      },
                      search(keywords) {
                          ////1.2includes
                          var newList = this.list.filter(item => {
                              // es6中为字符串提供新的方法,string.prototype.includes('要包含的字符串'),包含返回true不包含返回false
                              // contains选取包含指定字符串的数据
                              if (item.name.includes(keywords)) {
                                  return item
                              }
                          })
                          return newList
                      }
                  }
              })
              var vm1 =new Vue({
             el:'#app2',
             data:{
                 dt:new Date()
             },
             filters:{
              //    过滤器调用采用就近原则,如果私有过滤器和全局过滤器名称一样了,优先调用私有过滤器
                 dateFormat: function (dataStr,pattern='') {
                  var dt = new Date(dataStr)
                  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-mmm-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}~~~~`
                  }
              }
             }
         })
          </script>
      </body>
      
      </html>