Vue3原生实现表格的编辑功能

之前一直在网上查找如何通过原生的vue3写法实现表格的编辑功能,但基本上都是用element-plus实现的,所以一直很苦恼,但是在我不断地思考与想象之后,终于将完整的思路给整理出来了,下面就给大家分享一下我的顶级思路:

此图片是用vue3+Bootstrap5实现的,Bootstrap只是用来提供样式,实现的方法与原生vue3的思路一致。

下面的是表格显示的代码,其中class所引用的是Bootstrap5的样式(可忽略),table中包含theadtbody,thead中一行tr包含10th(th代表表头),分别是所对应的表头,tbody是表身,我们要在能够编辑的列中添加v-ifv-else,其中员工编号(userId),用户名(username),类别(type),邮箱地址(emailAddress),编辑都有添加。

  <table class="table table-hover table-bordered biaoge table-sm">
                    <thead class="table-light biaoge">
                        <tr>
                            <!-- <th>
                                <input type="checkbox" id="checkbox" v-model="checked" @change="changeAllChecked()" />
                            </th> -->
                            <th>序号</th>
                            <th>员工编号
                                <img src="../../assets/shang.png" @click="sortFun" class="sort"
                                    style="width:12px;height: 12px;position: absolute;margin-bottom: 18px;margin-left: 0.95px;">
                                <img src="../../assets/xia.png" @click="sortFun2" class="sort"
                                    style="width:14.1px;height:14px;position: absolute; margin-top: 8px;">
                            </th>
                            <th>用户名</th>
                            <th>类别</th>
                            <th>最后登录时间</th>
                            <th>邮箱地址</th>
                            <th>权限</th>
                            <th>是否禁用</th>
                            <th>编辑</th>
                            <th>禁用</th>
                        </tr>
                    </thead>
                    <tbody v-for="(item, index) in displaylist" :key="index">
                        <tr>
                            <!-- <td>
                             <input type="checkbox" :value="item" v-model="checkedData" />
                            </td> -->
                            <td>{{ index+1 }}</td>
                            <td v-if="Updaterow == item"><input class="form-control form-control-sm"
                                    style="text-align:center" v-model="item.userId">
                            </td>
                            <td v-else>{{ item.userId }}</td>
                            <td v-if="Updaterow == item"><input class="form-control form-control-sm"
                                    style="text-align:center" v-model="item.userName"></td>
                            <td v-else>{{ item.userName }}</td>
                            <td v-if="Updaterow == item"><select class="form-select form-select-sm"
                                    style="text-align:center" aria-label="Default select example" v-model="item.type">
                                    <option disabled value="">请选择</option>
                                    <option>系统管理员</option>
                                    <option>欠品管理员</option>
                                    <option>欠品负责人</option>
                                    <option>其它</option>
                                </select></td>
                            <td v-else>{{ item.type }}</td>
                            <td>{{ item.lastLoginDate }}</td>
                            <td v-if="Updaterow == item"><input class="form-control form-control-sm"
                                    style="text-align:center" v-model="item.emailAddress"></td>
                            <td v-else>{{ item.emailAddress }}</td>
                            <td><button type="button" class="btn btn-outline-primary btn-sm" @click="powerChange(item)" style="font-size: 12px;">
                                    设置权限
                                </button></td>
                            <td>{{ item.isDeleted }}</td>
                            <td v-if="Updaterow == item"><button type="button" class="btn btn-outline-success btn-sm "
                                    @click="Save" style="font-size: 12px;">保存编辑</button>&nbsp;
                                <button type="button" class="btn btn-outline-danger btn-sm" @click="Cancel" style="font-size: 12px;">取消编辑</button>
                            </td>
                            <td v-else><button type="button" class="btn btn-outline-primary btn-sm"
                                    @click="updateRow(item)" style="font-size: 12px;">编辑</button>
                            </td>
                            <td v-if="item.isDeleted == 'yes'">
                                <button type="button" class="btn btn-outline-success btn-sm"
                                    @click="UnDisabled(item)" style="font-size: 12px;">解除禁用</button>
                            </td>
                            <td v-else><button type="button" class="btn btn-outline-danger btn-sm"
                                    @click="Disabled(item)" style="font-size: 12px;">禁用</button>
                            </td>
                        </tr>
                    </tbody>
                </table>

当我们点击编辑按钮时,就会触发updateRow事件,其中item所传入的参数就是当前行的所有数据

updateRow()函数的功能就是将数据赋值给一个声明好的数组

 //编辑功能的实现
        updateRow(Item) {
            this.Updaterow = Item;
            this.unUpdateRow = false;
        },

其中,UpdateRow是声明的一个数组,unUpdateRow是用来控制编辑按钮的改变(将编辑按钮转换成保存编辑和取消编辑),以下是声明的情况:

然后再table表中,v-if="Updaterow==item";v-else,就是用来控制是否显示编辑框的代码,默认是不显示的,一开始数组为空,Updaterow并不等于item(当前行的数据),所以显示到v-else中,当触发updaterow()事件后,将item数据传给Updaterow这个数组,Updaterow等于item,此时v-if为true,就会将输入框给显示出来,此时我们就可以进行编辑,此时通过v-model进行双向数据绑定,就能将我们要修改的值传给后端。

当然,当编辑按钮不在表格中,该怎么办呢?

以上实现编辑按钮在表外的情况,当我们想要编辑特定的数据行时,只需要勾选当前行的数据,然后点击编辑按钮,关于点击对钩获取当前行的数据,请看我的另一篇文章http://t.csdn.cn/ITkIC ,其实原理和上面那个一样,只是将v-if中的==改成了indexOf,判断所勾选的数据中是否包含当前行的数据

好啦,今天的文章就讲到这里,有什么不懂的小伙伴可以私信我!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3提供了强大的功能和API来实现在线表格编辑。下面是一个简单的示例: 1. 首先,你需要安装所需的依赖包。在命令行中运行以下命令: ```shell npm install exceljs file-saver luckyexcel ``` 2. 在你的Vue项目中创建一个表格组件,例如`TableEditor.vue`。 3. 在`TableEditor.vue`中引入所需的依赖包和样式: ```javascript import ExcelJS from 'exceljs'; import { saveAs } from 'file-saver'; import LuckyExcel from 'luckyexcel'; import 'luckyexcel/css/luckysheet.css'; ``` 4. 在`TableEditor.vue`的模板中添加一个包含表格的容器: ```html <template> <div id="table-container"></div> </template> ``` 5. 在`TableEditor.vue`的脚本中,使用Vue的生命周期钩子函数`mounted`来初始化表格: ```javascript <script> export default { mounted() { // 创建一个ExcelJS工作簿 const workbook = new ExcelJS.Workbook(); // 创建一个工作表 const worksheet = workbook.addWorksheet('Sheet1'); // 在工作表中添加一些数据 worksheet.getCell('A1').value = 'Name'; worksheet.getCell('B1').value = 'Age'; worksheet.getCell('A2').value = 'John'; worksheet.getCell('B2').value = 25; worksheet.getCell('A3').value = 'Jane'; worksheet.getCell('B3').value = 30; // 将工作表渲染到指定的容器中 LuckyExcel.transformSingleSheet({ container: 'table-container', data: worksheet, width: '100%', height: '100%', }); }, }; </script> ``` 6. 在你的Vue页面中使用`TableEditor`组件: ```html <template> <div> <table-editor></table-editor> </div> </template> <script> import TableEditor from './TableEditor.vue'; export default { components: { TableEditor, }, }; </script> ``` 这样,你就可以在Vue3中实现一个简单的在线表格编辑功能了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值