Vue--》搭配Bootstrap实现Vue的列表增删功能

Posted 亦世凡华、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue--》搭配Bootstrap实现Vue的列表增删功能相关的知识,希望对你有一定的参考价值。

在日常开发中,我们可以用 “拿来主义” 借助Bootstarp现成的一些样式,快速生成我们想要的页面布局,避免书写大量的html和CSS代码,省下了许多不必要的时间。

当我们想要生成表单表格时我们可以查看Bootstrap的官方文档,来选择我们想要的样式,并根据自己的一些实际情况或者个人喜好进行一定的修改。了解Bootstrap

为了直接搭配Vue使用,我们把表单代码直接复制到 root 容器里面。

<div id="root">
    <!-- 卡片区域 -->
    <div class="card">
        <div class="card-header">添加水果</div>
        <div class="card-body">
            <!-- 添加品牌的表单区域 -->
            <form>
                <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="请输入水果名字">
                        </div>
                    </div>
                    <div class="col-auto">
                        <button type="submit" class="btn btn-primary mb-2">添加</button>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>

这边借助一下Bootstrap中的card(卡片)进行布局,扩充一下宽度。 

接下来我们在借助Bootstrap生成一个表格部分:

<table class="table table-border table-hover table-striped">
    <thead>
        <tr>
            <th scope="col">ID</th>
            <th scope="col">水果名称</th>
            <th scope="col">状态</th>
            <th scope="col">添加时间</th>
            <th scope="col">操作</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th scope="row">1</th>
            <td>苹果</td>
            <td>
                <div class="custom-control custom-switch">
                    <input type="checkbox" class="custom-control-input" id="customSwitch1">
                    <label class="custom-control-label" for="customSwitch1">已禁用</label>
                </div>
            </td>
            <td>时间</td>
            <td>
                <a href="javascript:'">删除</a>
            </td>
        </tr>
    </tbody>
</table>

表格结构写完之后,接下里我们就要使用Vue对表格进行填充数据了。

<script src="/Vue.js/vue.js"></script>
<script>
    Vue.config.productionTip = false; //阻止 vue 在启动时生成生产提示
    const vm = new Vue(
        data: 
            list: [
                 id: 1, name: '苹果', status: true, time: new Date() ,
                 id: 2, name: '香蕉', status: true, time: new Date() ,
                 id: 3, name: '葡萄', status: false, time: new Date() ,
                 id: 4, name: '桃子', status: true, time: new Date() ,
            ]
        
    )
    vm.$mount('#root')
</script>

接下里给删除操作绑定点击事件,如下:

给a链接绑定一个删除的点击事件。

我们使用filter进行过滤掉删除的数组,当前循环项的item.id不等于我们要删的id,就返回。

接下来我们实现水果的添加功能。

给输入框设置双向绑定事件,给表单设置提交事件并添加阻止事件。

定义用户输入的水果名称以及下一个可用的ID :

给绑定的add事件添加判断行为:

现在基本的添加删除功能已经完成,请看效果:

完整代码:

<!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>Document</title>
    <link rel="stylesheet" href="/Bootstrap/bootstrap.css">
    <style>
        body 
            padding: 15px;

        
    </style>
</head>

<body>
    <div id="root">
        <!-- 卡片区域 -->
        <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-border table-hover table-striped">
            <thead>
                <tr>
                    <th scope="col">ID</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">
                    <th scope="row">item.id</th>
                    <td>item.name</td>
                    <td>
                        <div class="custom-control custom-switch">
                            <input type="checkbox" class="custom-control-input" :id="'customSwitch'+item.id"
                                v-model="item.status">
                            <label class="custom-control-label" :for="'customSwitch'+item.id"
                                v-if="item.status">已启用</label>
                            <label class="custom-control-label" :for="'customSwitch'+item.id" v-else>已禁用</label>
                        </div>
                    </td>
                    <td>item.time</td>
                    <td>
                        <a href="javascript:'" @click="remove(item.id)">删除</a>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>


    <script src="/Vue.js/vue.js"></script>
    <script>
        Vue.config.productionTip = false; //阻止 vue 在启动时生成生产提示
        const vm = new Vue(
            data: 
                // 用户输入的水果名称
                brand: '',
                // nextID是下一个可用的 ID
                nextId: 5,
                list: [
                     id: 1, name: '苹果', status: true, time: new Date() ,
                     id: 2, name: '香蕉', status: true, time: new Date() ,
                     id: 3, name: '葡萄', status: false, time: new Date() ,
                     id: 4, name: '桃子', status: true, time: new Date() ,
                ]
            ,
            methods: 
                // 点击链接删除对应的水果
                remove (id) 
                    this.list = this.list.filter(item => item.id !== id)
                ,
                // 阻止表单的默认提交行为
                // 如果判断到brand的值为空字符串,则return出去
                add () 
                    if (this.brand === '') return alert('必须输入水果')
                    // 如果没有被return出去,应该执行添加逻辑
                    // 1.先把要添加的水果对象整理出来
                    const obj = 
                        id: this.nextId,
                        name:this.brand,
                        status:true,
                        time:new Date()
                    
                    // 2.往this.list数组中push步骤一中得到的对象
                    this.list.push(obj)
                    // 3.清空this.brand让this.nextID自增+1
                    // this.brand=''
                    this.nextId++ 
                ,
            
        )
        vm.$mount('#root')
    </script>
</body>

</html>

带有 bootstrap-vue 的 Vue:在列表中始终防止多个扩展列表元素(v-for)

【中文标题】带有 bootstrap-vue 的 Vue:在列表中始终防止多个扩展列表元素(v-for)【英文标题】:Vue with bootstrap-vue : prevent more than one expanded list-element at all times in list (v-for) 【发布时间】:2018-08-08 22:10:05 【问题描述】:

我正在使用带有 bootstrap-vue 和 b-collapse 功能的 vue,在这种情况下,它用于 v-for (lists)..

它工作得很好,除了我不知道如何在单击新列表元素进行扩展时自动关闭扩展的列表元素..

所以我的问题是:

当我单击新的列表元素进行扩展时,如何关闭展开的元素?

备注:我正在生成具有唯一值的 v-b-toggle="",如下所示:

<i v-b-toggle="'collapse' + key + index"

这是我的代码:

<div v-for="(item, key, index) in nluData">
   <div v-for="(item, key, index) in nluData">
       <div class="alert alert-warning">
           <i v-b-toggle="'collapse' + key + index">&nbsp;</i>
       </div>

   <b-collapse :id="'collapse' + key + index">
       <b-card style="background-color:#f0f8ff; margin-right:-30px;">
           ....
       </b-card>
   </b-collapse>
</div>

@sklingler93 建议后更新:

改为如下:

<i @click="expanded=key">&nbsp;</i>
<b-collapse :id="'collapse' + key + index" visible="key == expanded">

Vue 数据属性:

 export default 
data() 
      return 
          expanded: 0
          
      

我在扩展时尝试了不同的类型(字符串、布尔值、整数) 最终,所有内容都扩展了,并且出现了以下警告:

无效的道具:道具“可见”的类型检查失败。预期布尔值,得到字符串。

【问题讨论】:

【参考方案1】:

b-collapse 有一个可以设置的可见属性。因此,如果您在 data 中声明一个变量来跟踪扩展了哪个 b-collapse,您可以使用它:

<div v-for="(item, key, index) in nluData">
   <div v-for="(item, key, index) in nluData">
       <div class="alert alert-warning">
           <i @click="expanded=key">&nbsp;</i>
       </div>

   <b-collapse :visible="key === expanded">
       <b-card style="background-color:#f0f8ff; margin-right:-30px;">
           ....
       </b-card>
   </b-collapse>
   </div>
</div>

【讨论】:

以上是关于Vue--》搭配Bootstrap实现Vue的列表增删功能的主要内容,如果未能解决你的问题,请参考以下文章

使用bootstrap-vue的Vue:在列表中始终阻止多个扩展列表元素(v-for)

如何动态添加 vue bootstrap 下拉列表项?

使用 VUE 和 Bootstrap 返回第一个选项卡

Bootstrap-Vue 模态:如何在 V-For 渲染列表中打开不同的模态?

Vue+Antd搭配百度地图实现搜索定位等功能

无法在模式页脚的 bootstrap-vue 列中居中选择列表和分页器