[优化] table 和 tranfer 组件复选实现
This commit is contained in:
		
							parent
							
								
									88c38dddf0
								
							
						
					
					
						commit
						6baec91cdd
					
				| @ -18,6 +18,7 @@ | ||||
| [修复] themeline 时间线,因 mackdown 造成的样式污染。<br> | ||||
| [新增] layer 弹层出场动画, 允许使用 isOutAmin 关闭。<br> | ||||
| [新增] checkbox-group 复选框组, 更方便的复选方式。<br> | ||||
| [优化] table 和 tranfer 组件复选实现。<br> | ||||
| [删除] rate 评分 theme 属性默认值。<br> | ||||
| </lay-timeline-item> | ||||
| <lay-timeline-item title="0.2.3"> | ||||
|  | ||||
| @ -11,8 +11,8 @@ import "./index.less"; | ||||
| export interface LayCheckboxProps { | ||||
|   name?: string; | ||||
|   skin?: string; | ||||
|   label: string; | ||||
|   modelValue: boolean | Array<string>; | ||||
|   label: string | object; | ||||
|   modelValue: boolean | Array<string | object>; | ||||
|   disabled?: boolean; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,47 +0,0 @@ | ||||
| <template> | ||||
|   <div @click.stop="handleClick"> | ||||
|     <input type="checkbox" :name="name" :value="label" /> | ||||
|     <div | ||||
|       class="layui-unselect" | ||||
|       :class="[ | ||||
|         { | ||||
|           'layui-checkbox-disbaled layui-disabled': disabled, | ||||
|         }, | ||||
|         'layui-form-checkbox', | ||||
|         modelValue.includes(label) ? 'layui-form-checked' : '', | ||||
|       ]" | ||||
|       :lay-skin="skin" | ||||
|     > | ||||
|       <span><slot /></span> | ||||
|       <i class="layui-icon layui-icon-ok" /> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script setup name="LayCheckbox" lang="ts"> | ||||
| import { defineProps, ref } from 'vue' | ||||
| 
 | ||||
| const props = defineProps<{ | ||||
|   modelValue: string[] | ||||
|   label: string | ||||
|   disabled?: boolean | ||||
|   name?: string | ||||
|   skin?: string | ||||
| }>() | ||||
| 
 | ||||
| const hasValue = ref(false) | ||||
| 
 | ||||
| const emit = defineEmits(['update:modelValue']) | ||||
| 
 | ||||
| const handleClick = function () { | ||||
|   if (!props.disabled) { | ||||
|     if (!props.modelValue.includes(props.label)) { | ||||
|       props.modelValue.push(props.label) | ||||
|     } else { | ||||
|       let index = props.modelValue.indexOf(props.label) | ||||
|       props.modelValue.splice(index, 1) | ||||
|     } | ||||
|     emit('update:modelValue', props.modelValue) | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| @ -1,7 +1,7 @@ | ||||
| <script lang="ts"> | ||||
| export default { | ||||
|   name: 'LayTable', | ||||
| } | ||||
|   name: "LayTable", | ||||
| }; | ||||
| </script> | ||||
| 
 | ||||
| <script setup lang="ts"> | ||||
| @ -12,39 +12,47 @@ import { | ||||
|   defineProps, | ||||
|   withDefaults, | ||||
|   defineEmits, | ||||
| } from 'vue' | ||||
| import { Recordable } from '../type' | ||||
| } from "vue"; | ||||
| import { Recordable } from "../type"; | ||||
| 
 | ||||
| const props = withDefaults( | ||||
|   defineProps<{ | ||||
|     id?: string | ||||
|     skin?: string | ||||
|     size?: string | ||||
|     page?: Recordable | ||||
|     checkbox?: boolean | ||||
|     columns: Recordable[] | ||||
|     dataSource: Recordable[] | ||||
|     defaultToolbar?: boolean | ||||
|     selectedKeys?: Array<string> | ||||
|     id?: string; | ||||
|     skin?: string; | ||||
|     size?: string; | ||||
|     page?: Recordable; | ||||
|     checkbox?: boolean; | ||||
|     columns: Recordable[]; | ||||
|     dataSource: Recordable[]; | ||||
|     defaultToolbar?: boolean; | ||||
|     selectedKeys?: Recordable[]; | ||||
|   }>(), | ||||
|   { | ||||
|     id: 'id', | ||||
|     size: 'md', | ||||
|     id: "id", | ||||
|     size: "md", | ||||
|     dataSource: () => [], | ||||
|     selectedKeys: () => [], | ||||
|   } | ||||
| ) | ||||
| ); | ||||
| 
 | ||||
| const emit = defineEmits(['change', 'row', 'row-double', 'update:selectedKeys']) | ||||
| const emit = defineEmits([ | ||||
|   "change", | ||||
|   "row", | ||||
|   "row-double", | ||||
|   "update:selectedKeys", | ||||
| ]); | ||||
| 
 | ||||
| const slot = useSlots() | ||||
| const slots = slot.default && slot.default() | ||||
| const slot = useSlots(); | ||||
| const slots = slot.default && slot.default(); | ||||
| 
 | ||||
| const allChecked = ref(false) | ||||
| const tableSelectedKeys = ref([...props.selectedKeys]) | ||||
| const tableColumns = ref([...props.columns]) | ||||
| const allChecked = ref(false); | ||||
| const tableSelectedKeys = ref([...props.selectedKeys]); | ||||
| const tableColumns = ref([...props.columns]); | ||||
| const tableColumnKeys = ref(props.columns.map((item: any) => { | ||||
|   return item.key; | ||||
| })); | ||||
| 
 | ||||
| const changeAll = function ( checked : any) { | ||||
| const changeAll = function (checked: any) { | ||||
|   const ids = props.dataSource.map((item: any) => { | ||||
|     return item[props.id]; | ||||
|   }); | ||||
| @ -55,42 +63,42 @@ const changeAll = function ( checked : any) { | ||||
|     }); | ||||
|   } | ||||
|   emit("update:selectedKeys", tableSelectedKeys.value); | ||||
| } | ||||
| }; | ||||
| 
 | ||||
| watch( | ||||
|   tableSelectedKeys, | ||||
|   function () { | ||||
|     if (tableSelectedKeys.value.length === props.dataSource.length) { | ||||
|       allChecked.value = true | ||||
|       allChecked.value = true; | ||||
|     } else { | ||||
|       allChecked.value = false | ||||
|       allChecked.value = false; | ||||
|     } | ||||
|     emit('update:selectedKeys', tableSelectedKeys.value) | ||||
|     emit("update:selectedKeys", tableSelectedKeys.value); | ||||
|   }, | ||||
|   { deep: true } | ||||
| ) | ||||
| ); | ||||
| 
 | ||||
| const change = function (page: any) { | ||||
|   emit('change', page) | ||||
| } | ||||
|   emit("change", page); | ||||
| }; | ||||
| 
 | ||||
| const rowClick = function (data: any) { | ||||
|   emit('row', data) | ||||
| } | ||||
|   emit("row", data); | ||||
| }; | ||||
| 
 | ||||
| const rowDoubleClick = function (data: any) { | ||||
|   emit('row-double', data) | ||||
| } | ||||
|   emit("row-double", data); | ||||
| }; | ||||
| 
 | ||||
| const print = function () { | ||||
|   let subOutputRankPrint = document.getElementById('lay-table') as HTMLElement | ||||
|   let newContent = subOutputRankPrint.innerHTML | ||||
|   let oldContent = document.body.innerHTML | ||||
|   document.body.innerHTML = newContent | ||||
|   window.print() | ||||
|   window.location.reload() | ||||
|   document.body.innerHTML = oldContent | ||||
| } | ||||
|   let subOutputRankPrint = document.getElementById("lay-table") as HTMLElement; | ||||
|   let newContent = subOutputRankPrint.innerHTML; | ||||
|   let oldContent = document.body.innerHTML; | ||||
|   document.body.innerHTML = newContent; | ||||
|   window.print(); | ||||
|   window.location.reload(); | ||||
|   document.body.innerHTML = oldContent; | ||||
| }; | ||||
| </script> | ||||
| 
 | ||||
| <template> | ||||
| @ -113,9 +121,9 @@ const print = function () { | ||||
|                 <lay-checkbox | ||||
|                   v-for="column in columns" | ||||
|                   :key="column" | ||||
|                   v-model="tableColumns" | ||||
|                   v-model="tableColumnKeys" | ||||
|                   skin="primary" | ||||
|                   :label="column" | ||||
|                   :label="column.key" | ||||
|                   >{{ column.title }}</lay-checkbox | ||||
|                 > | ||||
|               </div> | ||||
| @ -149,7 +157,7 @@ const print = function () { | ||||
|                   </div> | ||||
|                 </th> | ||||
|                 <template v-for="column in columns" :key="column"> | ||||
|                   <th v-if="tableColumns.includes(column)"> | ||||
|                   <th v-if="tableColumnKeys.includes(column.key)"> | ||||
|                     <div | ||||
|                       class="layui-table-cell" | ||||
|                       :style="{ width: column.width }" | ||||
| @ -183,7 +191,7 @@ const print = function () { | ||||
|                   </td> | ||||
| 
 | ||||
|                   <template v-for="column in columns" :key="column"> | ||||
|                     <template v-if="tableColumns.includes(column)"> | ||||
|                     <template v-if="tableColumnKeys.includes(column.key)"> | ||||
|                       <template v-if="column.customSlot"> | ||||
|                         <td class="layui-table-cell"> | ||||
|                           <div :style="{ width: column.width }"> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user