一起从零开始学VUE(2)——品牌列表案例

阶段检测——品牌列表案例

要求

请添加图片描述

实现过程
1、 循环渲染表格行的数据
  • v-for循环
  • v-model双向数据绑定
  • v-if条件渲染

①在data中定义需要输出的列表

      const vm = new Vue({
           el:"#app",
           data:{
             // 用户输入的品牌名称
            brand: '',
            // nextId 是下一个,可用的 id
            nextId: 4,
            // 品牌的列表数据
               list:[
                   {id:1, name:'宝马', status:true, time: new Date()},
                   {id:2, name:'别克', status:true, time: new Date()},
                   {id:3, name:'奔驰', status:true, time: new Date()}
                   ]
           }
                })

②在tbody中循环渲染表格行的数据(注意:v-for一定要绑定一个:key属性)

<tbody>
    <tr v-for="item in list" :key="item.id">
        <td>{{ item.id }}</td>
        <td>{{ item.name }}</td>
        <td>
            {{item.status}}
        </td>
        <td>{{ item.time }}</td>
        <td><a href="javascript:;">删除</a></td>
    </tr>
</tbody>

③利用双向数据绑定指令来控制checkbox的状态,使用v-if条件渲染指令来控制标签中的内容

<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" v-model="item.status">
                <label class="custom-control-label"  v-if="item.status">已启用</label>
                <label class="custom-control-label"  v-else>已禁用</label>
            </div>
        </td>
        <td>{{ item.time }}</td>
        <td><a href="javascript:;">删除</a></td>
    </tr>
</tbody>

请添加图片描述

通过这一步大致的框架就已经完成了

2、动态生成checkbox的id值

上一步中基本的框架已经实现了,但是状态那边点击checkbox却没有反应。这边我们需要复习一下label的for属性。

label的for属性规定label与哪个表单元素绑定,这样子是为了扩大点击响应的范围,从而提高用户体验

请添加图片描述(没有使用for属性)请添加图片描述(使用for属性)

通过对比,我们可以看出,不使用for属性进行绑定的话,我们必须点击checkbox才能进行响应,这样的用户体验是稍微差点的,而使用了for属性,当点击男/女的时候也可以改变checkbox的状态。

了解完后,我们就可以对上一步代码进行修改

  • 属性绑定指令v-bind:(: )
<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="'id'+item.id" v-model="item.status">
                <label class="custom-control-label"  :for="'id'+item.id" v-if="item.status">已启用</label>
                <label class="custom-control-label"  :for="'id'+item.id" v-else>已禁用</label>
            </div>
        </td>
        <td>{{ item.time }}</td>
        <td><a href="javascript:;">删除</a></td>
    </tr>
</tbody>
3、实现删除品牌的功能
  • splice(index,num,item1,item2,…,itemX) 从数组中删除项目,然后返回被删除的项目。
  • filter过滤器

上面两种方法东可以实现删除操作,这边使用第一种方法

<td><a href="javascript:;" @click="remove(item.id)">删除</a></td>
           methods:{
               remove(id){
                var index = this.list.findIndex(item => {
                    if (item.id == id){ 
                        return true;
                    }
                })
                  this.list.splice(index,1)
               }
           }
           

请添加图片描述

4、使用全局过滤器格式化时间

不了解全局过滤器的UU们,可以看这篇博文——>

<td>{{ item.time |  Dateformat}}</td>
<script>
      // 声明格式化时间的全局过滤器 YYYY-MM-DD HH:mm:ss
      Vue.filter('Dateformat',function(time){
        // 调用dayjs()得到当前时间,dayjs(time)得到指定的时间
        
        return dayjs(time).format("YYYY-MM-DD HH:mm:ss")
      })
</script>

在这里插入图片描述

完整的实现代码
    <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>
          <table class="table table-bordered table-hover table-striped">
              <thead>
                  <tr>
                    <th>#</th>
                    <th>品牌名称</th>
                    <th>状态</th>
                    <th>创建时间</th>
                    <th>操作</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="'id'+item.id" v-model="item.status">
                                <label class="custom-control-label"  :for="'id'+item.id" v-if="item.status">已启用</label>
                                <label class="custom-control-label"  :for="'id'+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>
    </div>
  <script src="./lib/dayjs.min.js"></script>
  <script src="./lib/vue-2.6.12.js"></script>
    <script>
      // 声明格式化时间的全局过滤器 YYYY-MM-DD HH:mm:ss
      Vue.filter('Dateformat',function(time){
        // 调用dayjs()得到当前时间,dayjs(time)得到指定的时间
        
        return dayjs(time).format("YYYY-MM-DD HH:mm:ss")
      })
      const vm = new Vue({
           el:"#app",
           data:{
             // 用户输入的品牌名称
            brand: '',
            // nextId 是下一个,可用的 id
            nextId: 4,
            // 品牌的列表数据
               list:[
                   {id:1, name:'宝马', status:true, time: new Date()},
                   {id:2, name:'别克', status:true, time: new Date()},
                   {id:3, name:'奔驰', status:true, time: new Date()}
                   ]
           },
           methods:{
               remove(id){
                var index = this.list.findIndex(item => {
                    if (item.id == id){ 
                        return true;
                    }
                })
                  this.list.splice(index,1)
               }
           }
                })
    </script>
</body>
</html>
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值