layui 完整使用 element,table,laytpl 全覆盖

本文详细介绍使用layui框架进行表格渲染、操作与事件监听的方法。包括如何设置表格请求方式避免缓存问题,自定义工具栏按钮及状态显示,以及如何通过监听工具栏事件实现如编辑、删除、上报等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码

切记 :layer 的table.render 加载table的时候默认请求类型为get;最好强制为post ;加上 method:'post';

否则360兼容模式和ie浏览器下或出现请求304,从浏览器缓存中获取数据,而非服务端实时数据

  
  <script src="/system/actionplan/layuiadmin/layui/layui.js"></script> 
  <!--主表操作  -->
  <!-- wbstatue 上报状态   wbauditstatue 审核状态 -->
   <script type="text/html" id="toolbaroperate">
                       {{# if(d.wbstatue == 0) {  }}
                        <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">编辑</a>
                     <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="del">删除</a>
                     <a class="layui-btn layui-btn-primary layui-btn-xs"   lay-event="submitdata" data-type="test7" >上报</a>
                       {{# }}}  
                      {{# if(d.wbauditstatue == 0 && d.wbstatue == 1){ }} 
                     <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="agree" data-type="test7" >同意</a>
                     <a class="layui-btn layui-btn-primary layui-btn-xs"  lay-event="disagree" data-type="test7" >驳回</a>
                      {{# }}}
                        <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="view">查看</a>
   </script> 
   <script type="text/html" id="tablestatusinfo">
    {{# if(d.wbstatue == 0){ }}
     <a class="">未上报</a>

    {{# }}}
    {{# if(d.wbstatue == 1) {}}
     <a class="">已上报</a>
    {{# }}}
   
    {{# if(d.wbauditstatue == 0) {}}
     <a class="">未审核</a>
    {{# }}}
     {{# if(d.wbauditstatue == 1) {}}
    <a class="">审核通过</a>
    {{# }}}
     {{# if(d.wbauditstatue == 2) {}}
     <a class="">被驳回</a>
    {{# }}}
   </script>
   <!--子表操作  -->
    <script type="text/html" id="item-table-operate-bar">   
                        <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="view1">查看</a>
                        <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">编辑</a>
                     <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="del">删除</a> 
    </script>
      <script type="text/html" id="itemaddbutton">
                      {{# if(d.wbstatue == 0){ }}
                           <div style="margin-bottom: 10px;"><button class="layui-btn layui-btn-sm layui-btn-primary " onclick="additem()">新增活动</button></div>
                     {{# }}}
      </script>
    <script type="text/html" id="item-table-statusinfo">
   </script>
  <script type="text/javascript">
  var issubmit = 0;  // 0 全部   1 已上报  2已上报  
  var wbmonthplanid = 0;
  var alltable = null;
  var notable = null;
  var istable = null;
  var itemtable = null;
  var allexist= $("li[lay-id='allitem']");
  var isdealexist =  $("li[lay-id='isitem']");
  layui.config({
    base: '/system/actionplan/layuiadmin/' //静态资源所在路径
  }).extend({
    index: 'lib/index' //主入口模块
  }).use(['index', 'table','element','jquery','laytpl'], function(){
    var table = layui.table
    ,admin = layui.admin;
    var element = layui.element;
    var laytpl = layui.laytpl;
    var active = {
            //加载all表
            initalltable:function(){
                 alltable = table.render({
                      elem: '#all-table-operate'
                      ,url: layui.setter.base + 'json/table/'    //数据请求地址  json 格式封装
                      ,request:{
                           pageName: 'pageNum' //页码的参数名称,默认:page
                          ,limitName: 'limitNum' //每页数据量的参数名,默认:limit
                         }
                        ,where:{'itemtype':0,issubmit:issubmit}
                       ,cols: [[
                        {type:'checkbox'}
                        ,{field:'wbmonthplanid', width:80, title: 'ID', sort: true, }
                        ,{field:'wbplantopic',width:180, title: '计划标题'}
                        ,{field:'wbplandate', width:180, title: '计划月份'}
                        ,{field:'createdate', width:180, title: '创建时间'}
                        ,{field:'deptcodename', width:160, title: '申报部门'}
                        ,{field:'wbstateinfo', width:160, title: '状态',templet:'#tablestatusinfo'}
                        ,{field:'tool', width:320, title: '操作', templet: '#toolbaroperate'}
                      ]]
                      ,page: true
                    });
            }
           ,initnotable:function(){
                notable = table.render({
                      elem: '#nodeal-table-operate'
                      ,url: layui.setter.base + 'json/table/'    //数据请求地址  json 格式封装
                      ,request:{
                           pageName: 'pageNum' //页码的参数名称,默认:page
                          ,limitName: 'limitNum' //每页数据量的参数名,默认:limit
                         }
                        ,where:{'itemtype':1,issubmit:issubmit}
                       ,cols: [[
                        {type:'checkbox'}
                        ,{field:'wbmonthplanid', width:80, title: 'ID', sort: true, }
                        ,{field:'wbplantopic',width:180, title: '计划标题'}
                        ,{field:'wbplandate', width:180, title: '计划月份'}
                        ,{field:'createdate', width:180, title: '创建时间'}
                        ,{field:'deptcodename', width:160, title: '申报部门'}
                        ,{field:'wbstateinfo', width:160, title: '状态',templet:'#tablestatusinfo'}
                        ,{field:'tool', width:320, title: '操作', templet: '#toolbaroperate'}
                      ]]
                      ,page: true
                });
           }
           ,initistable:function(){
             istable = table.render({
                      elem: '#isdeal-table-operate'
                      ,url: layui.setter.base + 'json/table/querymonthlist.jsp'
                      ,request:{
                           pageName: 'pageNum' //页码的参数名称,默认:page
                          ,limitName: 'limitNum' //每页数据量的参数名,默认:limit
                         }
                        ,where:{'itemtype':2,issubmit:issubmit}
                       ,cols: [[
                        {type:'checkbox'}
                        ,{field:'wbmonthplanid', width:80, title: 'ID', sort: true, }
                        ,{field:'wbplantopic',width:180, title: '计划标题'}
                        ,{field:'wbplandate', width:180, title: '计划月份'}
                        ,{field:'createdate', width:180, title: '创建时间'}
                        ,{field:'deptcodename', width:160, title: '申报部门'}
                        ,{field:'wbstateinfo', width:160, title: '状态',templet:'#tablestatusinfo'}
                        ,{field:'tool', width:320, title: '操作', templet: '#toolbaroperate'}
                      ]]
                      ,page: true
                });
           }
           ,inititemtable:function(){
              itemtable = table.render({
                   elem: '#test-table-operate'
                   ,url: layui.setter.base + 'json/table/querymonthitemlist'    //数据请求地址  json 格式封装
                   ,request:{
                       pageName: 'pageNum' //页码的参数名称,默认:page
                      ,limitName: 'limitNum' //每页数据量的参数名,默认:limit
                      }
                      ,where:{'wbmonthplanid':wbmonthplanid}
                    ,cols: [[
                      {type:'checkbox'}
                     ,{field:'wbmonthitemid', width:80, title: 'ID', sort: true, }
                     ,{field:'wbitemtopic', width:260, title: '活动主题'}
                     ,{field:'zbdeptname', width:160, title: '主办单位'}
                     ,{field:'sbdengname', width:170, title: '承办单位'}
                     ,{field:'createdate', width:170, title: '创建时间'}
                     ,{field:'wbstateinfo', width: 220, title: '状态',templet:'#item-table-statusinfo'}
                     ,{field:'tool', width:280, title: '操作', templet: '#item-table-operate-bar'}
                   ]]
                   ,page: true
                 });  
           }
   }
     //监听工具条
    table.on('checkbox(test-table-operate)', function(obj){    
     var data = obj.data;
   
      
    });
    
     
  //监听toolbar
    table.on('tool(all-table-operate)', function(obj){ 
      var data = obj.data; //获得当前行数据
      var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
      var tr = obj.tr; //获得当前行 tr 的DOM对象    
      if(layEvent === 'view'){ //查看
        //do somehing
      } else if(layEvent === 'del'){ //删除
        layer.confirm('确认要删除吗', function(index){
          obj.del(); 
          layer.close(index);
        });
      } else if(layEvent === 'edit'){ //编辑
         
          
      }else if(layEvent == 'agree'){
          //同意
          layer.confirm('同意此活动吗', function(index){
             /*  obj.update({
                  username: '123'
                  ,title: 'xxx'
                }); */
              layer.close(index);
              //向服务端发送删除指令
            });
      }else if(layEvent == 'disagree'){
          //驳回 添加审核意见
          
      }else if(layEvent == 'submitdata'){
          //上报
          layer.confirm('确认上报总中心?', function(index){
                 obj.update({
                     wbstateinfo: '已上报'
                 }); 
               layer.close(index);
               //向服务端发送删除指令
             });
      }
    
    });
  
  
    if(allexist.length >0){
        alltable = active.initalltable();
    }
    if(isdealexist.length >0){
         active.initistable();
    }
  //监听行双击事件  刷新子表数据 rowDouble
    table.on('row(all-table-operate)', function(obj){
         var data = obj.data;
         wbmonthplanid = data.wbmonthplanid;
         //加载子表新增模板
         var getTpl = itemaddbutton.innerHTML;
         var itembuttondivview = document.getElementById('itembuttondiv');
         laytpl(getTpl).render(data, function(html){
             itembuttondivview.innerHTML = html;
            });
         if(itemtable != null){
         itemtable.reload({
               elem:'#test-table-operate'
               ,where:{'wbmonthplanid':wbmonthplanid}
                 });
         }else{
             itemtable =  active.inititemtable();
         }
    });
  
  //监听item 
    element.on('tab(component-tabs-hash)', function(data){
        var layId=$(this).attr('lay-id');
        if(layId == "allitem"){
            if( alltable != null){
                alltable.reload({
                  elem:'#all-table-operate'
                 ,where:{'itemtype':0,'issubmit':issubmit}
            });
            }else{
                //初始化table
                 alltable = active.initalltable();
            }
        }
        if(layId == "isitem"){
            if( istable != null){
              istable.reload({
                elem:'#isdeal-table-operate'
                ,where:{'itemtype':'2'}
            });
            }else{
                 istable = active.initistable();
            }
        }
        if(layId == "noitem"){
            if(notable != null){
            notable.reload({
              elem:'#nodeal-table-operate'
              ,where:{'itemtype':'1'}
                });
            }else{
                notable = active.initnotable();
            }
        }
      });
  
  
  });

 
    function unuse(){
     //layer.prompt({title: '输入任何口令,并确认', formType: 1}, function(pass, index){
          //layer.close(index);
          layer.prompt({title: '拒绝原因', formType: 2}, function(text, index){
            layer.close(index);
            layer.msg('演示完毕!您的口令:'+ pass +'<br>您最后写下了:'+text);
          });
       // });
      }
  function use(){
     layer.alert('同意此活动');
      }  
    
 function add(){
   var index = layer.open({
          title: '新增月计划',
          type: 2,
          content: 'monthadd.jsp',
          area: ['600px', '400px'],
          maxmin: true
        });
        layer.full(index);
  } 

 

LayuiElement Plus 都是国内非常流行的前端 UI 框架,但它们分别适用于不同的技术栈。Layui 更适合原生 JavaScript 或 jQuery 项目,而 Element Plus 则专注于 Vue 3 生态系统。如果要在 Layui 中尝试引入并使用 Element Plus 组件,则需要结合两者的特点做一定适配工作。 以下是实现步骤的一个概括说明: ### 第一步 - 准备环境 由于 Element Plus 基于 Vue 构建而成,在纯 Layui 页面里直接引用并不方便,所以最好搭建一个简单支持Vue的框架结构。可以采用以下工具链: - **Webpack**:打包模块化管理。 - **Vue CLI** (推荐):快速初始化包含Element Plus配置的新工程。 如果你已经有一个现成的 Layui 项目并且不想重构整个架构的话,那就要手动加载必要的依赖项了,例如 `vue.global.js` 及对应版本的 `element-plus.css/js`. #### 示例命令行操作: ```bash npm install vue@next element-plus axios jquery layui # 安装所需包 ``` 然后将生成的结果文件引入HTML头信息部分: ```html <link rel="stylesheet" href="/node_modules/element-plus/dist/index.css"> <script src="/node_modules/vue/dist/vue.global.js"></script> <script src="/node_modules/element-plus/dist/index.full.js"></script> <!-- 引入layui --> <script type="text/javascript" src="//cdn.jsdelivr.net/npm/layui-src/dist/layui.all.min.js"></script> ``` ### 第二步 – 创建组件实例 接下来创建一个小demo展示如何混搭这两个库的功能。 假设我们需要渲染一个带分页表格的数据列表... ```javascript // 初始化 Vue App 实例 const app = Vue.createApp({ data() { return { tableData: [], currentPage: 1 }; }, methods: { handleSizeChange(val) {}, handleCurrentChange(val) {} } }); app.use(ElementPlus); // 注册局插件 app.mount('#app-container'); // 挂载至指定 DOM 节点内 ``` 同时定义模板内容如下所示: ```html <div id="app-container"> <!-- 使用 element plus 表格组件 --> <el-table :data="tableData.slice((currentPage-1)*pageSize, currentPage*pageSize)" style="width: 100%"> <el-table-column prop="date" label="日期" width="180"> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> </el-table> <!-- 分页栏 --> <div class="block"> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-sizes="[5, 10, 20]" layout="total,sizes,prev,pager,next,jumper" :total=100> </el-pagination> </div> </div> ``` 注意这里通过计算属性来动态调整显示条目范围。 最后再利用LAYUI完成页面布局美化等工作即可! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值