欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue(四)品牌列表案列

程序员文章站 2022-05-15 22:49:15
...
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>Document</title>
  <link rel="stylesheet" type="text/css" href="css/bootstrap.css">
  <script src="../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 for-inline">
        <label for="">
          id:
          <input type="text" class="form-control" v-model="id">
        </label>
        <label for="">
          Name:
          <input type="text" @keyup.enter="add" class="form-control" v-model="name">
        </label>
        <input type="button" @click="add()" value="添加" class="btn-primary">
        <label for="">
          搜索名称关键字:
          <input type="text" class="form-control" v-model="keywords" v-focus>
        </label>
      </div>
    </div>
    <table class="table table-bordered table-hover">
      <thead>
        <tr>
          <th>ID</th>
          <th>Name</th>
          <th>ctime</th>
          <th>Operation</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(item, index) in search(keywords)" :key="item">
          <td>{{ item.id }}</td>
          <td>{{ item.name }}</td>
          <td>{{ item.ctime | dateFormat('Y-m-d H:i:s') }}</td>
          <!-- prevent 组织a标签默认行为 -->
          <td><a href="" @click.prevent="del(index)">删除</a></td>
        </tr>
      </tbody>

    </table>
  </div>
  <script>
    // vue 全局过滤器格式化时间戳
    Vue.filter('dateFormat',function(dataStr, pattern = "Y-m-d"){
      var dt = new Date(dataStr);
      var y = dt.getFullYear();
      // 字符串填充补位padStart(前)padEnd(后)
      var m = (dt.getMonth()+1).toString().padStart(2,0);
      var d = (dt.getDate()).toString().padStart(2,0);
      // 字母转换小写
      if (pattern === "Y-m-d"){
        // 模板字符串
        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 自定义指令 参数一名称 参数二对象
      Vue.directive('focus',{
      // 指令绑定元素时 只会触发一次
      bind:function(el){
        // el.focus();
      },
      // 元素插入DOM中的时候 只会触发一次
      inserted:function(el){
        el.focus();
      },
      // 当VNode更新时发生 可能会触发多次
      updated:function(el){},
    })

    new Vue({
      el: '#app',
      data: {
        id:'',
        name:'',
        keywords:'',
        list: [
          { id: 1, name: '奔驰', ctime: new Date() },
        ],
      },
      methods: {
        add(){
          this.list.push({
            id:this.id,
            name:this.name,
            ctime:new Date()
          });
          this.id = this.name= '';
        },
        del(index){
          this.list.splice(index,1);
        },
        // 关键字搜索
        search(keywords){
          // var newList = [];
          // this.list.forEach(item => {
          //   if(item.name.indexOf(keywords) != -1) {
          //     newList.push(item);
          //   }
          // })
          // return newList;
          // filter循环遍历数组直接返回一个新数组
          return this.list.filter(item => {
            // includes ES6 新方法字符串内是否包含
            if(item.name.includes(keywords)) {
              return item;
            }
          })
        },
      },
      filters: {
        // 私有过滤器
        dateFormat2:function(){
          // ....
        }
      },
      direction:{
        // 私有指令
        'focus2':{
          // bind:function(el){
          //   // .....
          // },
        },
        // 简写
        'focus3':function(){
          // 等同于把代码写到bind中 和updated中
          // ...
        }
      }
    })
  </script>
</body>

</html>