1. 程式人生 > >layui.table模組/資料表格文件

layui.table模組/資料表格文件

Layui_table模組/資料表格文件 

table 模組是我們的又一走心之作,在 layui 2.0 的版本中全新推出,是 layui 最核心的組成之一。它用於對錶格進行一些列功能和動態化資料操作,涵蓋了日常業務所涉及的幾乎全部需求。支援固定表頭、固定行、固定列左/列右,支援拖拽改變列寬度,支援排序,支援多級表頭,支援單元格的自定義模板,支援對錶格過載(比如搜尋、條件篩選等),支援複選框,支援分頁,支援單元格編輯等等一些列功能。儘管如此,我們仍將對其進行完善,在控制程式碼量和效能的前提下,不定期增加更多人性化功能。table 模組也將是 layui 重點維護的專案之一。

建立一個table例項最簡單的方式是,在頁面放置一個元素 <table id="test"></table>,然後通過 table.render() 方法指定該容器,如下所示:

10000 user-0 城市-0 簽名-0 255 57 作家 82830700
10001 user-1 城市-1 簽名-1 884 27 詞人 64928690
10002 user-2 城市-2 簽名-2 650 31 醬油 6298078
10003 user-3 城市-3 簽名-3 362 68 詩人 37117017
10004 user-4 城市-4 簽名-4 807 6 作家 76263262
10005 user-5 城市-5 簽名-5 173 87 作家 60344147
10006 user-6 城市-6 簽名-6 982 34 作家 57768166
10007 user-7 城市-7 簽名-7 727 28 作家 82030578
10008 user-8 城市-8 簽名-8 951 14 詞人 16503371
10009 user-9 城市-9 簽名-9 484 75 詞人 86801934



  

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>layui</title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
   <link rel="stylesheet" href="/buddhism-heritage2/layui/css/layui.css">
  <script src="/buddhism-heritage2/layui/layui.js" charset="utf-8"></script>
  <!-- 注意:如果你直接複製所有程式碼到本地,上述css路徑需要改成你本地的 -->
</head>
<body>  
<div style="margin-bottom: 5px;">          


 <table id="demo" lay-filter="demo"></table>
<script type="text/html" id="barDemo">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">檢視</a>
  <a class="layui-btn layui-btn-xs" lay-event="edit">編輯</a>
  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">刪除</a>
</script>
               
          


<script>
layui.use('table', function(){
  var table = layui.table;
  //第一個例項
  table.render({
    elem: '#demo'
    ,height: 'full-20'
    ,method:'post'
    ,skin:'row'
    ,even:true
 	,page: true //開啟分頁
    ,url: '/buddhism-heritage2/building/queryAll' //資料介面
    ,cols: [[ //表頭
      {field: 'id', title: 'ID', width:80, sort: true, fixed: 'left'}
      ,{field: 'name', title: '住房名稱', width:80}
      ,{field: 'floor', title: '樓層', width:80, sort: true}
      ,{field: 'city', title: '城市', width:80} 
      ,{field: 'num', title: '數量', width: 177}
      ,{field: 'money', title: '價格', width: 80, sort: true}
      ,{field: 'houseType', title: '房型', width: 80, }
      ,{field: 'size', title: '大小', width: 80, sort: true}
      ,{field: 'purpose', title: '用途'}
      ,{field: 'decorate', title: '裝修'}
      ,{field: 'year', title: '樓齡', width: 135, sort: true}
      ,{fixed: 'right', title: '操作', width:178, align:'center', toolbar: '#barDemo'}
    ]]
  });
 
}); 
</script>


</body>
</html>
對應的Controller:

@Controller
@RequestMapping("/building")
public class BuildingController {
	@Autowired
	private BuildingService buildService;
	private static ConcurrentMap<String, Object> concurrentMap = new ConcurrentHashMap<String,Object>();
	@RequestMapping("/queryAll")
	@ResponseBody
	public  ConcurrentMap<String, Object> queryAllBuilding() {
		Integer queryCount = buildService.queryCount();
		List<Building> building = buildService.queryAll();
		concurrentMap.put("count", queryCount);
		concurrentMap.put("data", building);
		concurrentMap.put("code", 0);
		concurrentMap.put("msg", "成功");
		return concurrentMap;
	}
}

後臺傳遞的引數格式:
{
  code: 200,//資料狀態的欄位名稱,預設:code
  msg: "",//狀態資訊的欄位名稱,預設:msg
  count: 1000,//資料總數的欄位名稱,預設:count
  data: []//資料列表的欄位名稱,預設:data
} 

種渲染方式 在上述“快速使用”的介紹中,你已經初步見證了 table 模組的信手拈來,但其使用方式並不止那一種。我們為了滿足各種情況下的需求,對 table 模組做了三種初始化的支援,你可按照個人喜好和實際情況靈活使用。

  方式 機制 適用場景
01. 方法渲染 用JS方法的配置完成渲染 (推薦)無需寫過多的 HTML,在 JS 中指定原始元素,再設定各項引數即可。
02. 自動渲染 HTML配置,自動渲染 無需寫過多 JS,可專注於 HTML 表頭部分
03. 轉換靜態表格 轉化一段已有的表格元素 無需配置資料介面,在JS中指定表格元素,並簡單地給表頭加上自定義屬性即可

1.方法渲染:

<table id="demo" lay-filter="test"></table>

var table = layui.table;
 
//執行渲染
table.render({
  elem: '#demo' //指定原始表格元素選擇器(推薦id選擇器)
  ,height: 315 //容器高度
  ,cols: [{}] //設定表頭
  //,…… //更多引數參考右側目錄:基本引數選項
});

其實這是“自動化渲染”的手動模式,本質類似,只是“方法級渲染”將基礎引數的設定放在了JS程式碼中,且原始的 table 標籤只需要一個 選擇器

事實上我們更推薦採用“方法級渲染”的做法,其最大的優勢在於你可以脫離HTML檔案,而專注於JS本身。尤其對於專案的頻繁改動及釋出,其便捷性會體現得更為明顯。而究竟它與“自動化渲染”的方式誰更簡單,也只能由各位猿猿們自行體味了。

備註:table.render()方法返回一個物件:var tableIns = table.render(options),可用於對當前表格進行“過載”等操作,詳見目錄:表格過載

2.自動渲染

所謂的自動渲染,即:在一段 table 容器中配置好相應的引數,由 table 模組內部自動對其完成渲染,而無需你寫初始的渲染方法。其特點在上文也有闡述。你需要關注的是以下三點: 


1) 帶有 class="layui-table" 的 <table> 標籤。 
2) 對標籤設定屬性 lay-data="" 用於配置一些基礎引數 
3) 在 <th> 標籤中設定屬性lay-data=""用於配置表頭資訊

按照上述的規範寫好table原始容器後,只要你載入了layui 的 table 模組,就會自動對其建立動態的資料表格。下面是一個示例

<table class="layui-table" lay-data="{height:315, url:'/demo/table/user/', page:true, id:'test'}" lay-filter="test">
  <thead>
    <tr>
      <th lay-data="{field:'id', width:80, sort: true}">ID</th>
      <th lay-data="{field:'username', width:80}">使用者名稱</th>
      <th lay-data="{field:'sex', width:80, sort: true}">性別</th>
      <th lay-data="{field:'city'}">城市</th>
      <th lay-data="{field:'sign'}">簽名</th>
      <th lay-data="{field:'experience', sort: true}">積分</th>
      <th lay-data="{field:'score', sort: true}">評分</th>
      <th lay-data="{field:'classify'}">職業</th>
      <th lay-data="{field:'wealth', sort: true}">財富</th>
    </tr>
  </thead>
</table>

3.轉換靜態表格:

<table lay-filter="demo">
  <thead>
    <tr>
      <th lay-data="{field:'username', width:100}">暱稱</th>
      <th lay-data="{field:'experience', width:80, sort:true}">積分</th>
      <th lay-data="{field:'sign'}">簽名</th>
    </tr> 
  </thead>
  <tbody>
    <tr>
      <td>賢心1</td>
      <td>66</td>
      <td>人生就像是一場修行a</td>
    </tr>
    <tr>
      <td>賢心2</td>
      <td>88</td>
      <td>人生就像是一場修行b</td>
    </tr>
    <tr>
      <td>賢心3</td>
      <td>33</td>
      <td>人生就像是一場修行c</td>
    </tr>
  </tbody>
</table>
    

var table = layui.table;
 
//轉換靜態表格
table.init('demo', {
  height: 315 //設定高度
  ,limit: 10 //注意:請務必確保 limit 引數(預設:10)是與你服務端限定的資料條數一致
  //支援所有基礎引數
}); 
    

分頁的情況:<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>layui</title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
   <link rel="stylesheet" href="/buddhism-heritage2/layui/css/layui.css">
  <script src="/buddhism-heritage2/layui/layui.js" charset="utf-8"></script>
  <!-- 注意:如果你直接複製所有程式碼到本地,上述css路徑需要改成你本地的 -->
</head>
<body>  
<div style="margin-bottom: 5px;">          


 <table id="demo" lay-filter="demo"></table>
<script type="text/html" id="barDemo">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">檢視</a>
  <a class="layui-btn layui-btn-xs" lay-event="edit">編輯</a>
  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">刪除</a>
</script>
               
          


<script>
layui.use('table', function(){
  var table = layui.table;
  //第一個例項
  table.render({
    elem: '#demo'
    ,height: 'full-20'
    ,method:'post'
    ,skin:'row'
    ,even:true
 	,page: true //開啟分頁
    ,url: '/buddhism-heritage2/building/queryAll' //資料介面
    ,cols: [[ //表頭
      {field: 'id', title: 'ID', width:80, sort: true, fixed: 'left'}
      ,{field: 'name', title: '住房名稱', width:80}
      ,{field: 'floor', title: '樓層', width:80, sort: true}
      ,{field: 'city', title: '城市', width:80} 
      ,{field: 'num', title: '數量', width: 177}
      ,{field: 'money', title: '價格', width: 80, sort: true}
      ,{field: 'houseType', title: '房型', width: 80, }
      ,{field: 'size', title: '大小', width: 80, sort: true}
      ,{field: 'purpose', title: '用途'}
      ,{field: 'decorate', title: '裝修'}
      ,{field: 'year', title: '樓齡', width: 135, sort: true}
      ,{fixed: 'right', title: '操作', width:178, align:'center', toolbar: '#barDemo'}
    ]]
  });
  //監聽表格複選框選擇
  table.on('checkbox(demo)', function(obj){
    console.log(obj)
  });
  //監聽工具條
  table.on('tool(demo)', function(obj){
    var data = obj.data;
    if(obj.event === 'detail'){
      layer.msg('ID:'+ data.id + ' 的檢視操作');
    } else if(obj.event === 'del'){
      layer.confirm('真的刪除行麼', function(index){
        obj.del();
        layer.close(index);
      });
    } else if(obj.event === 'edit'){
      layer.alert('編輯行:<br>'+ JSON.stringify(data))
    }
  });
  
  var $ = layui.$, active = {
    getCheckData: function(){ //獲取選中資料
      var checkStatus = table.checkStatus('idTest')
      ,data = checkStatus.data;
      layer.alert(JSON.stringify(data));
    }
    ,getCheckLength: function(){ //獲取選中數目
      var checkStatus = table.checkStatus('idTest')
      ,data = checkStatus.data;
      layer.msg('選中了:'+ data.length + ' 個');
    }
    ,isAll: function(){ //驗證是否全選
      var checkStatus = table.checkStatus('idTest');
      layer.msg(checkStatus.isAll ? '全選': '未全選')
    }
  };
  
  $('.demoTable .layui-btn').on('click', function(){
    var type = $(this).data('type');
    active[type] ? active[type].call(this) : '';
  });
}); 
</script>


</body>
</html>
@Controller
@RequestMapping("/building")
public class BuildingController {
	
	@Autowired
	private BuildingService buildService;
	
	private static ConcurrentMap<String, Object> concurrentMap = new ConcurrentHashMap<String,Object>();
	
	@RequestMapping("/queryAll")
	@ResponseBody
	public  ConcurrentMap<String, Object> queryAllBuilding(Integer page,Integer limit) {
		Integer queryCount = buildService.queryCount();
		System.out.println("進入當前展示商品列表的controller");
		List<Building> buildings = buildService.pagePlug(page, limit);
		concurrentMap.put("count", queryCount);
		concurrentMap.put("data", buildings);
		concurrentMap.put("code", 0);
		concurrentMap.put("msg", "成功");
		return concurrentMap;
	}
}