layui 数据表格 table的一些技巧,及自定义模板的使用

本文介绍了一种处理表格数据中性别等类别信息的方法,以及如何调整时间格式。通过自定义模板,实现数据的动态展示,包括患者姓名、订单时间、是否长期以及内容的展示。同时,解决了嵌套数据在表格中的显示问题。

table数据 有时总会有判断男女  类型之类的,所以通过下列方法即可轻松解决。

当然,这样在前台直接写死的 貌似不大好,没关系,我们可以通过自定义模板的方法 数据都来自后台,前台只做判断,如:

效果如下:

关于table表格时间格式的调整:

上图的方法,试过这么写,但有时候就不大好使,所以 下面推荐另一种方法, 

 上面是图片,代码如下:

<script>
    ..............其他代码逻辑

//这相当于一个方法
Date.prototype.Format = function (fmt) { //author: meizz
        var o = {
            "M+": this.getMonth() + 1,                 //月份
            "d+": this.getDate(),                    //日
            "h+": this.getHours(),                   //小时
            "m+": this.getMinutes(),                 //分
            "s+": this.getSeconds(),                 //秒
            "q+": Math.floor((this.getMonth() + 3) / 3), //季度
            "S": this.getMilliseconds()             //毫秒
        };
        if (/(y+)/.test(fmt))
            fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var k in o)
            if (new RegExp("(" + k + ")").test(fmt))
                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        return fmt;
    }
</script>

<script id="createTime" type="text/html">
    {{#
    var date = new Date();
    date.setTime(d.createTime);
    return date.Format("yyyy-MM-dd hh:mm:ss");
    }}
</script>

第二个方法,copy来的,不知哪位大佬写的 用到了,就一到总结在此吧。

关于自定义模板,再加一个小例子吧,如下

table.render({
            id: 'orderList',
            elem: '#orderList',
            url: 'orderList',
            cols: [[
                {type:'numbers',title:'序号',width:'5%',align:'centenr'},
                {field:'patientName',title:'患者姓名',width:'10%',templet:"#patientName"},
                {field:'orderCreateTime',title:'时间',width:'14%',templet:"#orderCreateTime"},
                {field:'longFlag',title:'是否长期',width:'10%',align:'centenr',templet:"#longFlag"},
                {field:'listOrder',title:'内容',width:'50%',templet:"#listOrder"},
            ]],
            page: true,
            // height: 'full-83',
            where : {
                patientId : patientId,
                visitId : visitId,
            }
        });

 这里的url返回来的数据与layui规定的数据有差异,是个嵌套的数据,上面demo中患者姓名,时间,是否长期,内容,皆为通过自定义模板取得,如下所示:

此模板为获取内容,d.listOrder 就是嵌套里面的一个list集合,通过模板传值,
然后通过jquery的方法遍历解析,返回遍历后且拼装好的数据

<script type="text/html" id="listOrder">
            {{#  if(d.listOrder == ""){ }}
            {{# } else if (d.listOrder==null){ }}
            {{#  } else { }}
            {{#
                var fn = function(list){
                var len =list.length;//传入的list的长度
                var strHred = '';
                var strEnd = '';
                var str = '';
                $.each(list, function(i,item){
                    if(len <= 1){ //小于等于则表示只有一条记录
                        str =item.orderText +'<br>';
                    }else{
                        //两条记录以上时,
                        if(i == 0){  //等于0表示第一条数据,加前缀
                        strHred = '┌'+item.orderText +'<br>';

                        }else if(i == len - 1 ){ //此为最后一条数据,加前缀
                        strEnd  = '└'+item.orderText +'<br>';
                        }else{
                        //拼接数据
                        str = str +'&nbsp;&nbsp;'+item.orderText +'<br>';
                        }
                    }
                });
                //返回拼接好的值
                return strHred+str+strEnd;
                    };
            }}
            <div>{{ fn(d.listOrder) }}</div>
            {{#  } }}
        </script>

如下图内容的最终效果 

 

 

 

//贴个短点的,listOrder集合中的都是同一个人,不同数据的,故只遍历一次,取出姓名即可
<script type="text/html" id="patientName">
            {{#
                var fn = function(list){
                var str = '';
                $.each(list, function(i,item){
                    if(i == 0){
                        str = item.patientName;
                    }
                });
                return str;
                };
            }}
            <div>{{ fn(d.listOrder) }}</div>
        </script>

前台接收的数据如下:

 

 因为都是从嵌套的list当中取  所以表格的field属性 我全都写成的listOrder,如下图所示;

虽然依然也能够取出来值,但是显示的时候却出现意外,宽度设置无效,所有通过模板遍历取值的列,他们的宽全都一样,无法更改,如:

 所以F12查看了下元素,发现

 他们都用了同一个样式,所以导致宽度也全都默认一样。解决办法:

根据从嵌套list中取值的字段的变量名 给予命名 field属性即可。

<think>我们正在讨论如何在Layui数据表格table)中添加下拉列表框(select)。根据用户需求,我们需要在表格的某一列中显示下拉列表框,并且能够实现选择功能。 通常,在Layui表格中添加下拉列表框可以通过以下步骤实现: 1. 在表格列的模板(templet)中,使用函数返回包含下拉列表框的HTML字符串。 2. 使用表单渲染(form.render)来使下拉框生效,因为动态生成的元素需要重新渲染。 3. 监听下拉列表框的change事件,以便在选项改变时执行相应操作(如更新数据)。 下面是一个具体的示例: 首先,定义表格,其中一列使用自定义模板来生成下拉框: ```javascript table.render({ elem: '#demo' ,cols: [[ {field: 'id', title: 'ID'} ,{field: 'username', title: '用户名'} ,{field: 'status', title: '状态', templet: function(d){ // 假设状态值:0表示正常,1表示禁用 // 这里我们生成一个下拉框,根据当前值设置选中项 return '<select name="status" lay-filter="statusSelect">' + '<option value="0" '+(d.status==0?'selected':'')+'>正常</option>' + '<option value="1" '+(d.status==1?'selected':'')+'>禁用</option>' + '</select>'; }} ]] ,data: [ /* 数据 */ ] }); ``` 然后,在表格渲染完成后,我们需要使用form.render来渲染下拉框,并且监听下拉框的change事件(通过lay-filter): ```javascript form.render('select'); // 重新渲染select,使得动态生成的select生效 // 监听下拉框选择事件 form.on('select(statusSelect)', function(data){ // data.value 是选中的值 // 可以通过data.elem获取当前select元素,进而获取所在行 var tr = $(data.elem).closest('tr'); var index = tr.data('index'); // 获取行索引 // 更新对应行的数据 // 注意:这里更新的是当前页的数据,如果需要更新整个表格数据,需要自行维护 var obj = table.cache['demo'][index]; // 假设表格的id为demo obj.status = data.value; // 更新状态值 // 重新渲染表格(如果需要的话,也可以不用重新渲染,因为下拉框已经反映了状态) // 这里通常不需要重新渲染整个表格,因为我们只是更新了数据,但下拉框的显示已经通过改变选中项更新了 }); ``` 注意: - 表格的缓存数据可以通过`table.cache[表格容器elem的id]`获取,它是一个数组,每个元素对应一行的数据。 - 在获取行索引时,Layui会在渲染时为每一行的tr元素设置一个data-index属性,所以我们可以通过closest('tr')找到行,然后获取data-index。 - 更新缓存数据后,如果需要同步到页面显示(除了下拉框以外的其他列可能需要更新),则可以调用`table.reload`,但这样会重新渲染整个表格,可能会使得下拉框的状态丢失(因为重新渲染后下拉框会重新生成,而选中状态会回到初始值)。因此,通常我们只需要更新缓存数据,而不需要重新渲染整个表格。如果其他列有需要更新,可以考虑使用模板函数根据数据动态生成。 另外,如果表格数据量很大或者有分页,我们可能只需要更新当前页的数据。同时,在编辑下拉框后,可能需要将修改的数据同步到后台。 因此,完整的步骤包括: 1. 定义表格模板生成下拉框。 2. 渲染表单元素(select)。 3. 监听下拉框事件,更新对应行的数据(缓存数据)。 4. 可以进一步将修改的数据通过AJAX提交到后台。 下面是一个更完整的示例: HTML: ```html <table id="demo" lay-filter="demo"></table> ``` JavaScript: ```javascript layui.use(['table', 'form'], function(){ var table = layui.table; var form = layui.form; // 渲染表格 table.render({ elem: '#demo', cols: [[ {field: 'id', title: 'ID', width: 80}, {field: 'username', title: '用户名', width: 120}, {field: 'status', title: '状态', width: 120, templet: function(d){ return '<select name="status" lay-filter="statusSelect">' + '<option value="0" '+(d.status==0?'selected':'')+'>正常</option>' + '<option value="1" '+(d.status==1?'selected':'')+'>禁用</option>' + '</select>'; }} ]], data: [ {id:1, username:'user1', status:0}, {id:2, username:'user2', status:1} ], done: function(res, curr, count){ // 表格渲染完成后,重新渲染表单,使下拉框生效 form.render('select'); } }); // 监听下拉框选择事件 form.on('select(statusSelect)', function(data){ var tr = $(data.elem).closest('tr'); // 获取当前行tr var index = tr.data('index'); // 行索引 var tableId = $(tr).closest('.layui-table-view').attr('id'); // 获取表格的id,注意这里可能是layui生成的,实际表格容器的id是'demo',但layui会生成多层结构 // 通过table的缓存获取数据 // 注意:table.cache中存储的key是表格容器的id(就是我们定义的elem),也就是'demo' var rowData = table.cache['demo'][index]; // 获取行数据 // 更新行数据的status字段 rowData.status = data.value; // 如果需要,这里可以发送一个AJAX请求到后台更新数据 // ... // 提示:如果需要更新其他列的显示,可以在这里使用jQuery更新tr内的其他单元格,但注意如果其他列也是模板生成的,可能需要重新渲染整个行(不推荐,因为会破坏当前编辑状态)。所以通常做法是其他列的数据也通过模板函数根据rowData来生成。 }); }); ``` 注意事项: - 在实际使用中,表格数据可能是从url异步加载的,那么更新数据时需要通过AJAX提交到服务器。 - 在表格的done回调中重新渲染表单(form.render('select'))是必要的,因为表格渲染是异步的,动态生成的下拉框需要重新渲染才能显示正常。 - 当数据表格有分页时,注意缓存数据只针对当前页,切换页面后缓存数据会变化。 通过以上方法,我们就可以在Layui表格中添加下拉列表框并实现选择功能。 另外,如果希望下拉框的选项是动态的(比如从后台获取),那么可以在列模板函数中发送AJAX请求获取选项,但这样可能会造成多次请求(每一行都请求一次)。更好的做法是在渲染表格之前先获取下拉框的选项数据,然后在模板函数中使用这些数据。 例如,先获取状态选项数据: ```javascript var statusOptions = []; // 假设从后台获取到的数据 // 模拟数据 statusOptions = [ {value: '0', name: '正常'}, {value: '1', name: '禁用'} ]; ``` 然后在模板函数中: ```javascript templet: function(d){ var html = '<select name="status" lay-filter="statusSelect">'; layui.each(statusOptions, function(index, item){ html += '<option value="'+item.value+'" '+(d.status==item.value?'selected':'')+'>'+item.name+'</option>'; }); html += '</select>'; return html; } ``` 这样就能动态生成下拉框选项。 综上所述,实现Layui数据表格中添加下拉列表框的关键点在于列模板的编和表单重新渲染,以及对下拉框事件的监听和数据的更新。 §§相关问题§§ 1. 在Layui表格中如何动态生成下拉框的选项? 2. 如何在Layui表格中实现下拉框选择后提交到后台? 3. Layui表格中下拉框不显示或无法选择怎么办? 4. 如何在Layui表格中同时使用多个下拉框? </think>### Layui数据表格添加下拉列表框的实现方法 在Layui数据表格中添加下拉列表框需要使用模板(`templet`)自定义单元格内容,结合表单组件渲染和事件监听。以下是详细实现步骤: #### 1. 基础实现代码 ```javascript table.render({ elem: '#tableId', cols: [[ {field: 'id', title: 'ID'}, {field: 'name', title: '姓名'}, {field: 'status', title: '状态', templet: function(d){ // 下拉框HTML结构 return `<select lay-filter="statusSelect" data-id="${d.id}"> <option value="1" ${d.status==1?'selected':''}>启用</option> <option value="0" ${d.status==0?'selected':''}>禁用</option> </select>`; }} ]], done: function(res, curr, count){ // 渲染表单组件(关键步骤) form.render('select'); } }); // 监听下拉框选择事件 form.on('select(statusSelect)', function(data){ const id = $(data.elem).data('id'); const value = data.value; // 此处执行更新操作 console.log(`行ID:${id} 新值:${value}`); // 可发送AJAX请求到后端接口 }); ``` #### 2. 关键实现细节 1. **列模板自定义**: - 在`templet`函数中返回包含`<select>`的HTML字符串 - 使用`data-id`保存行数据标识(如ID) - 通过`${d.field}`实现选项默认选中 2. **表单组件渲染**: - 在表格的`done`回调中调用`form.render('select')` - 确保动态生成的select被Layui识别为表单组件 3. **事件监听**: - 使用`form.on('select(filter)')`监听选项变化 - 通过`data.elem`获取当前操作的DOM元素 - 从`data-id`属性中获取对应的行数据标识 #### 3. 支持动态选项的进阶版本 ```javascript templet: function(d){ const options = [ {value:1, text:'启用'}, {value:2, text:'待审核'}, {value:0, text:'禁用'} ]; let html = `<select lay-filter="statusSelect" data-id="${d.id}">`; options.forEach(opt => { const selected = d.status == opt.value ? 'selected' : ''; html += `<option value="${opt.value}" ${selected}>${opt.text}</option>`; }); return html + '</select>'; } ``` #### 4. 常见问题解决 1. **下拉框无法弹出**: - 检查是否漏掉`form.render('select')`调用 - 确保Layui版本≥2.5(旧版本有动态渲染问题) 2. **选项不更新**: ```javascript // 更新操作后重新渲染表格 table.reload('tableId'); ``` 3. **大数据量性能优化**: ```javascript // 使用固定列避免重复渲染 {field: 'status', title: '状态', templet: ..., fixed: 'right'} ``` > **注意**:当使用分页或重载表格时需要再次调用`form.render()`确保新渲染的下拉框生效[^1]。
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值