layui表格数据添加功能,添加后表格的数据的自动刷新,前后端交互

本文介绍使用layui框架实现表格数据的添加功能及自动刷新,涵盖界面设计、添加功能实现及前后端交互代码,适用于快速搭建具备数据动态更新能力的web应用。

layui表格数据添加功能,添加后表格的数据的自动刷新,前后端交互

(1)界面
在这里插入图片描述

(2)实现添加功能
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(3)主界面代码实现

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>Data-Table 表格</title>
    <link rel="stylesheet" href="../frame/layui/css/layui.css" media="all">
    <!--<link rel="stylesheet" href="http://cdn.datatables.net/1.10.13/css/jquery.dataTables.min.css">-->
    <link rel="stylesheet" href="../frame/static/css/style.css">
    <link rel="icon" href="../frame/static/image/code.png">
</head>

<body class="body">

<!-- 工具集 -->
<div class="my-btn-box">
    <span class="fl">
        <a class="layui-btn layui-btn-danger radius btn-delect" id="btn-add-all">批量添加</a>
        <a class="layui-btn btn-add btn-default" id="btn-get">采集设备总数</a>
        <a class="layui-btn btn-add btn-default" id="btn-add">添加</a>
        <a class="layui-btn btn-add btn-default" id="btn-refresh"><i class="layui-icon">&#x1002;</i></a>
    </span>
    <span class="fr">

        <div class="demoTable">
            <span class="layui-form-label">搜索条件:</span>
            <!--// 搜索ID:-->
        <div class="layui-inline">
         <input class="layui-input" name="id" id="demoReload" autocomplete="off" placeholder="请输入搜索条件">
        </div>
        <button class="layui-btn" data-type="reload">查询</button>
        </div>
    </span>
</div>


<!--&lt;!&ndash; 表格 &ndash;&gt;-->
<script type="text/javascript" src="../frame/layui/layui.js"></script>
<script type="text/javascript" src="../js/index.js"></script>
<table class="layui-hide" id="test" lay-filter="test"></table>
<!-- 表格操作按钮集 -->
<script type="text/html" id="barOption">
    <a class="layui-btn layui-btn-mini" lay-event="detail">查看</a>
    <a class="layui-btn layui-btn-mini layui-btn-normal" lay-event="edit">编辑</a>
    <a class="layui-btn layui-btn-mini layui-btn-danger" lay-event="del">删除</a>
</script>
<script>
    layui.use(['table', 'form', 'layer', 'vip_table'], function () {

// 操作对象
        var form = layui.form
            , table = layui.table
            , layer = layui.layer
            , vipTable = layui.vip_table
            ,$=layui.jquery
        // 表格渲染
        var tableIns = table.render({
            elem: '#test'                  //指定原始表格元素选择器(推荐id选择器)
            , height: vipTable.getFullHeight()    //容器高度
            , toolbar: '#toolbarDemo'
            , title: '采集设备表'
            , cols: [[                  //标题栏
                {checkbox: true, sort: true, fixed: true, space: true}
                , {field: 'eqptType', title: 'eqptType', width: 150}
                , {field: 'eqptTypeName', title: 'eqptTypeName', width: 180}
                , {field: 'eqptIdCode', title: 'eqptIdCode', width: 180}
                , {field: 'eqptName', title: 'eqptName', width: 180}
                , {field: 'createTime', title: 'createTime', width: 200}
                , {field: 'creator', title: 'creator', width: 200}
                , {fixed: 'right', width: 178, align: 'center', toolbar: '#barOption'}
            ]]
            , id: 'dataCheck'
            , url: '/*********'
            , method: 'get'
            , page: false
            , limits: [30, 60, 90, 150, 300]
            , loading: false
            , done: function (res) {
                //如果是异步请求数据方式,res即为你接口返回的信息。
                //如果是直接赋值的方式,res即为:{data: [], count: 99} data为当前页数据、count为数据总长度
                console.log(res);
            }
        });
        //监听表格复选框选择
        table.on('checkbox(demo)', function (obj) {
            console.log(obj)
        });
        //监听工具条
        table.on('tool(test)', function (obj) {
            var data = obj.data;
            if (obj.event === 'detail') {
                layer.msg('ID:' + data.id + ' 的查看操作');
            } else if (obj.event === 'del') {
                layer.confirm('真的删除行么', function (index) {
                    $.ajax({
                        url: "/*********",
                        type: "POST",
                        data: {eqptType: data.eqptType, eqptIdCode: data.eqptIdCode},
                          success: function (msg) {
                           var json=JSON.parse(msg);
                            var returnCode=json.returnCode;
                            if (returnCode== 200) {
                                //删除这一行,前端界面的修改,直接删除了这一条数据
                                obj.del();
                                //关闭弹框
                                layer.close(index);
                                //显示提示框
                                layer.msg("删除成功", {icon: 6});
                            } else {
                                layer.msg("删除失败", {icon: 5});
                            }
                        }
                    });
                    return false;
                });
            } else if (obj.event === 'edit') {
      
            }
        });

        //添加采集设备
        $('#btn-add').on('click', function () {
            layer.open({
                type: 2,
                title: '采集设备添加',
                maxmin: true,
                area: ['420px', '330px'],
                shadeClose: false, //点击遮罩关闭
                content: 'CollectorAdd-form.html',
            });
        });
        //搜索功能的实现
        $('.demoTable .layui-btn').on('click', function () {
            var type = $(this).data('type');
            active[type] ? active[type].call(this) : '';
        });

        var $ = layui.$, active = {
            reload: function () {
                var demoReload = $('#demoReload');

                //执行重载
                table.reload('idTest', {
                    where: {
                        key: {
                            field: demoReload.val()
                        }
                    }
                });
            }
        };

        $('.demoTable .layui-btn').on('click', function () {
            var type = $(this).data('type');
            active[type] ? active[type].call(this) : '';
        });


        // 刷新
        $('#btn-refresh').on('click', function () {
            tableIns.reload()
        });
    });
</script>
</body>
</html>

(4)表单页面的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>表单</title>
    <link rel="stylesheet" href="../frame/layui/css/layui.css">
    <link rel="stylesheet" href="../frame/static/css/style.css">
    <link rel="icon" href="../frame/static/image/code.png">
    <style>
        .layui-form-label{
            width: 100px;
        }
        .layui-input-block {
            margin-left: 130px;
            min-height: 36px
        }
    </style>
</head>
<body class="body">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
    <legend>添加采集设备</legend>
</fieldset>

<form class="layui-form layui-from-pane" action="/addCollector" style="margin-top:20px" method="post">
    <div class="layui-form-item">
        <label class="layui-form-label">采集设备类型</label>
        <div class="layui-input-block">
            <select name="eqptType" lay-filter="aihao">
                <option value="0a0003biac">0a0003biac</option>
                <option value="0a0003ahup" selected="">0a0003ahup</option>
            </select>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">eqptIdCode</label>
        <div class="layui-input-block">
            <input type="text" name="eqptIdCode"  required  lay-verify="required" autocomplete="off" placeholder="请输入采集设备地址" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">eqptName</label>
        <div class="layui-input-block">
            <input type="text" name="eqptName"  required  lay-verify="required" autocomplete="off" placeholder="请输入采集设备名称" class="layui-input">
        </div>
    </div>

    <div class="layui-form-item" style="margin-top:40px">
        <div class="layui-input-block">
            <button class="layui-btn  layui-btn-submit " lay-submit="" lay-filter="demo1">立即提交</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>
<script src="../frame/layui/layui.js" charset="utf-8"></script>
<script>
    layui.use(['form','layer','jquery'], function(){
        var form = layui.form
                ,layer = layui.layer
                 ,$=layui.jquery,
                  table= layui.table
        //监听提交
        form.on('submit(demo1)', function(data){
            //layer.alert(JSON.stringify(data.field))
              //data=JSON.stringify(data.field)
            $.ajax({
                url:'/addCollector',
                type:'POST',
                dataType:'json',
               data:{eqptType:data.field.eqptType,eqptIdCode:data.field.eqptIdCode,eqptName:data.field.eqptName},
                 success:function (msg) {
                    var returnCode=msg.returnCode;
                    if(returnCode==200){
                        layer.closeAll('loading');
                        layer.load(2);
                        layer.msg("添加成功", {icon: 6});
                        setTimeout(function(){
                            window.parent.location.reload();//修改成功后刷新父界面
                        }, 1000);
                           //加载层-风格

                    }else{
                        layer.msg("已经存在该设备,不支持重复添加", {icon: 5});
                    }
                }
            })
            return false;
        });
    });
</script>
</body>
</html>
<think> 我们正在讨论Layui表格table)中添加数据的方法。根据用户的问题,他/她想要了解如何在Layui表格添加数据。 在Layui中,表格数据通常是异步加载的,但有时我们需要在前端动态添加新行(新数据)到表格中。Layui提供了table模块,但是并没有直接提供添加行的方法,因此我们需要通过操作表格的缓存数据来实现。 步骤: 1. 获取当前表格的缓存数据。 2. 将新数据添加到缓存数据中。 3. 重新渲染表格。 但是,需要注意的是,Layui表格有两种渲染方式:静态表格和动态表格(通过方法渲染)。这里我们主要针对方法渲染的表格。 具体步骤: a. 首先,我们需要获取当前表格的缓存数据,使用`table.cache`方法,传入表格的id(即lay-filter的值)。 b. 然后,将新数据对象推入获取到的缓存数据数组中。 c. 最后,使用`table.reload`方法重新渲染表格。 然而,`table.reload`会重新从url请求数据,这样我们添加数据就会丢失。因此,另一种方法是使用`tableIns.reload`(其中tableIns是表格实例)并设置data参数为新的数据数组。 另一种更直接的方法:我们可以先获取表格当前页的数据(包括我们之前可能添加数据),然后添加数据,再重新设置表格数据。 实际上,Layui官方并没有提供直接添加行的方法,但我们可以通过以下方式实现: 方法一(推荐): 1. 使用`var obj = table.render({...});` 得到表格实例。 2. 使用`var data = obj.config.data;` 获取当前表格数据(注意:如果是分页的情况,这里获取的是当前页的数据,而且如果是异步加载的数据,初始数据可能不在这个属性中,所以这种方法有局限性)。 方法二(通用方法): 1. 获取缓存数据:`var data = table.cache['test'];` 其中'test'是表格的lay-filter的值。 2. 添加数据(注意:新数据的字段需要和表格的cols定义的一致) 3. 重新渲染表格,并且设置data为新的缓存数据。但是这样会变成静态表格,失去异步加载的特性。 方法三(适用于任何情况): 我们可以在初始化表格时,将数据保存在一个全局变量中,然后每次添加数据都操作这个全局变量,再通过`table.reload`重新渲染表格(使用data参数)。 但是,如果数据量很大,重新渲染整个表格可能会有性能问题。 因此,我们也可以采用插入DOM的方式,但这样需要自己维护DOM,而且可能会破坏Layui的事件监听。 考虑到以上,这里给出一个较为通用的方法,即操作缓存数据并重新渲染整个表格(对于数据量不大的情况适用): 示例代码: ```javascript // 假设表格的lay-filter为"test" // 新数据对象 var newRow = { id: new Date().getTime(), // 生成一个唯一id,也可以根据业务来 name: '新数据', // ...其他字段 }; // 获取当前表格的缓存数据 var oldData = table.cache['test']; // 注意:这里获取的是当前页的缓存数据,包括可能已经修改过的数据(未提交到服务端) // 将新数据添加到缓存数据中 oldData.push(newRow); // 重新渲染表格 table.reload('test', { data: oldData, page: {curr: 1} // 如果分页,可以设置回到第一页,也可以保持当前页,但要注意数据量增加可能分页变化 }); ``` 注意:这种方法会重新渲染整个表格,并且如果表格有分页,那么新添加数据会出现在当前页(如果当前页没有满)或者新的一页。但是,这样操作后,表格就变成了静态数据源,不再从url加载数据。因此,如果后续还需要与服务端交互(比如分页、排序等),这种方法就不适合了。 因此,对于需要与服务端交互的表格添加数据应该通过请求后台接口,将数据保存到数据库,然后重新加载表格(即调用`table.reload`而不指定data参数,让它重新从url加载数据)。这样虽然会刷新整个表格,但能保证数据一致性。 但是,用户的需求可能是前端临时添加一行数据,不立即保存到数据库,等最后一起保存。那么我们就需要维护一个本地的数据源(比如一个全局数组),然后在初始化表格时使用这个本地数据源,添加数据时操作这个本地数据源,然后重新渲染表格。 初始化表格示例: ```javascript var myData = []; // 初始数据,可以是从后台获取的,也可以是前端自己维护的 // 渲染表格 var tableIns = table.render({ elem: '#test', data: myData, // 直接使用本地数据 cols: [[...]], // 列定义 page: true // 开启分页 }); // 添加数据 function addNewRow() { var newRow = {...}; myData.push(newRow); // 将新数据添加到全局数组 // 重新渲染表格 tableIns.reload({ data: myData }); } ``` 这样,每次添加数据后,我们重新设置表格数据源并重新渲染,就可以看到新数据了。 总结:根据需求选择方案: 1. 如果只是前端临时添加,最后统一保存,推荐使用本地数据源(一个全局数组)来管理数据,然后每次操作这个数组并重新渲染(使用表格实例的reload方法,并传入data参数)。 2. 如果每次添加都需要实时保存到数据库,那么应该通过ajax将数据提交到后台,然后调用`table.reload()`(不带data参数,而是从url重新加载数据刷新表格。 用户的问题没有明确是哪种情况,所以我们可以提供两种方案。 由于我们之前讨论的是前端临时添加,所以这里给出前端临时添加的完整示例: HTML: ```html <table id="test" lay-filter="test"></table> <button class="layui-btn" id="addBtn">添加新行</button> ``` JS: ```javascript layui.use('table', function(){ var table = layui.table; var $ = layui.$; // 本地数据源 var myData = [ // 初始数据 {id:1, name:'张三', age:20}, {id:2, name:'李四', age:25} ]; // 渲染表格 var tableIns = table.render({ elem: '#test', data: myData, cols: [[ {field:'id', title:'ID', sort:true}, {field:'name', title:'姓名'}, {field:'age', title:'年龄', sort:true} ]], page: true }); // 添加新行按钮事件 $('#addBtn').click(function(){ var newId = myData.length > 0 ? myData[myData.length-1].id + 1 : 1; var newRow = { id: newId, name: '新数据' + newId, age: Math.floor(Math.random()*20+10) // 随机年龄 }; myData.push(newRow); // 重新渲染表格 tableIns.reload({ data: myData }); }); }); ``` 这样,点击“添加新行”按钮,就会在表格添加一行新数据。 注意:这种方法在分页情况下,新添加数据会出现在最后一页(因为我们是将数据添加到整个数组的末尾,然后分页组件会根据数据重新分页)。如果希望新数据出现在第一页,可以在`myData`数组的开头添加(使用unshift),然后重新渲染,并且设置page.curr为1(第一页): ```javascript myData.unshift(newRow); // 添加到第一行 tableIns.reload({ data: myData, page: {curr:1} }); ``` 以上就是在Layui表格添加数据的方法。 注意:如果表格数据量很大,频繁重新渲染可能会有性能问题,因此在实际应用中,可以根据情况选择是否采用这种方式,或者采用其他方式(比如只插入一行DOM元素,但这样需要自己处理分页、排序等事件)。 参考文献:Layui官方文档中没有直接提供动态添加行的方法,以上方法都是社区实践中总结出来的[^1]。 </think> 在 Layui 表格添加数据的方法主要有以下几种方式,具体实现取决于您的需求(前端临时添加或同步到后端): ### 方法一:静态表格前端添加(推荐) 适用于纯前端操作,无需请求后端: ```javascript // 1. 获取当前表格数据 var tableData = table.cache['yourTableId']; // 'yourTableId' 是表格的 lay-filter 值 // 2. 创建新数据对象(需包含所有字段) var newRow = { id: new Date().getTime(), // 生成唯一ID name: "新用户", age: 25, gender: "男" }; // 3. 添加数据到数组 tableData.push(newRow); // 4. 重新渲染表格 table.reload('yourTableId', { data: tableData }); ``` ### 方法二:动态表格后端同步 需要将数据提交到后端,然后刷新表格: ```javascript // 1. 添加数据到后端 $.post('/api/addData', { name: "新用户", age: 25 }, function(res) { if(res.code === 0) { // 2. 添加成功后重载表格 table.reload('yourTableId'); // 自动请求初始URL获取最新数据 layer.msg('添加成功'); } }); ``` ### 方法三:直接插入 DOM(高效局部更新) 适合大数据量场景,避免全表重绘: ```javascript // 1. 构建行 HTML var html = `<tr data-index="${newIndex}"> <td>${newData.id}</td> <td>${newData.name}</td> <td>${newData.age}</td> </tr>`; // 2. 插入到表格首行 $("table[lay-filter='yourTableId'] tbody").prepend(html); // 3. 同步更新缓存 table.cache['yourTableId'].unshift(newData); ``` ### 关键说明 1. **数据一致性** 使用 `table.cache` 获取数据时,获得的是当前页码的缓存数据,跨页添加需维护完整数据集[^1]。 2. **字段匹配** 新数据对象必须包含表格列定义的所有 `field` 字段,否则渲染会出错。 3. **分页处理** 添加数据后分页总数不会自动更新,需手动调整: ```javascript table.reload('yourTableId', { data: tableData, limit: tableData.length // 取消分页 }); ``` ### 完整示例 ```html <button class="layui-btn" id="addBtn">添加数据</button> <table id="demoTable" lay-filter="test"></table> <script> layui.use(['table', 'jquery'], function(){ var table = layui.table; var $ = layui.$; // 初始化表格 table.render({ elem: '#demoTable', url: '/api/data', cols: [[ {field: 'id', title: 'ID'}, {field: 'name', title: '姓名'}, {field: 'age', title: '年龄'} ]], id: 'dataTable', // 设置唯一ID page: true }); // 添加按钮事件 $('#addBtn').click(function(){ var newData = { id: 'NEW_' + Date.now(), name: '新记录', age: Math.floor(Math.random()*100) }; var currData = table.cache['dataTable']; currData.push(newData); table.reload('dataTable', { data: currData, page: { curr: 1 } // 返回第一页 }); }); }); </script> ``` --- ### 相关问题 1. 如何在 Layui 表格中实现行内编辑功能? 2. Layui 表格添加数据后如何保持排序状态? 3. 如何批量添加多行数据Layui 表格? 4. Layui 表格数据添加后如何同步到服务端数据库? [^1]: Layui 官方文档明确说明 `table.cache` 仅包含当前页数据,全量数据需自行维护存储。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值