table 的列可以拖动
问题1 :demo 无法运行
1. 直接拷贝代码过来,发现传的参数有问题:
- <template>
- <a-table bordered :columns="columns" :components="components" :dataSource="data">
- <template v-slot:action>
- <a href="javascript:;">Delete</a>
- </template>
- </a-table>
- </template>
- <script>
- import Vue from 'vue';
- import VueDraggableResizable from 'vue-draggable-resizable';
- Vue.component('vue-draggable-resizable', VueDraggableResizable);
- const columns = [
- {
- title: 'Date',
- dataIndex: 'date',
- width: 200,
- },
- {
- title: 'Amount',
- dataIndex: 'amount',
- width: 100,
- },
- {
- title: 'Type',
- dataIndex: 'type',
- width: 100,
- },
- {
- title: 'Note',
- dataIndex: 'note',
- width: 100,
- },
- {
- title: 'Action',
- key: 'action',
- scopedSlots: { customRender: 'action' },
- },
- ];
- const data = [
- {
- key: 0,
- date: '2018-02-11',
- amount: 120,
- type: 'income',
- note: 'transfer',
- },
- {
- key: 1,
- date: '2018-03-11',
- amount: 243,
- type: 'income',
- note: 'transfer',
- },
- {
- key: 2,
- date: '2018-04-11',
- amount: 98,
- type: 'income',
- note: 'transfer',
- },
- ];
- const draggingMap = {};
- columns.forEach(col => {
- draggingMap[col.key] = col.width;
- });
- const draggingState = Vue.observable(draggingMap);
- const ResizeableTitle = (h, props, children) => {
- let thDom = null;
- const { key, ...restProps } = props;
- const col = columns.find(col => {
- const k = col.dataIndex || col.key;
- return k === key;
- });
- if (!col.width) {
- return <th {...restProps}>{children}</th>;
- }
- const onDrag = (x, y) => {
- draggingState[key] = 0;
- col.width = Math.max(x, 1);
- };
- const onDragstop = () => {
- draggingState[key] = thDom.getBoundingClientRect().width;
- };
- return (
- <th {...restProps} v-ant-ref={r => (thDom = r)} width={col.width} class="resize-table-th">
- {children}
- <vue-draggable-resizable
- key={col.key}
- class="table-draggable-handle"
- w={10}
- x={draggingState[key] || col.width}
- z={1}
- axis="x"
- draggable={true}
- resizable={false}
- onDragging={onDrag}
- onDragstop={onDragstop}
- ></vue-draggable-resizable>
- </th>
- );
- };
- export default {
- name: 'App',
- data() {
- this.components = {
- header: {
- cell: ResizeableTitle,
- },
- };
- return {
- data,
- columns,
- };
- },
- };
- </script>
- <style lang="less">
- .resize-table-th {
- position: relative;
- .table-draggable-handle {
- height: 100% !important;
- bottom: 0;
- left: auto !important;
- right: -5px;
- cursor: col-resize;
- touch-action: none;
- }
- }
- </style>
2. 将标黄的部分改为,代码如下:
- const ResizeableTitle = (h1) => {
- const props = h1.props
- const children = h1.children
问题二:应用到ant vue界面时,需要做如下修改:
1. 将下列代码挪到main.js
- import VueDraggableResizable from 'vue-draggable-resizable'
- Vue.component('vue-draggable-resizable', VueDraggableResizable)
2. 将下列代码copy过去。
- import Vue from 'vue'
- // #region 从Table1 拷贝的东东
- const draggingMap = {}
- columns.forEach(col => {
- draggingMap[col.Id] = col.width
- })
- const draggingState = Vue.observable(draggingMap)
- const ResizeableTitle = (h1) => {
- const props = h1.props
- const children = h1.children
- let thDom = null
- const { key, ...restProps } = props
- const col = columns.find(col => {
- const k = col.dataIndex || col.Id
- return k === key
- })
- if ((!col) || (!col.width)) {
- return <th {...restProps}>{children}</th>
- }
- const onDrag = (x, y) => {
- draggingState[key] = 0
- col.width = Math.max(x, 1)
- }
- const onDragstop = () => {
- draggingState[key] = thDom.getBoundingClientRect().width
- }
- return (
- <th {...restProps} v-ant-ref={r => (thDom = r)} width={col.width} class="resize-table-th">
- {children}
- <vue-draggable-resizable
- key={col.rowKey}
- class="table-draggable-handle"
- w={10}
- x={draggingState[key] || col.width}
- z={1}
- axis="x"
- draggable={true}
- resizable={false}
- onDragging={onDrag}
- onDragstop={onDragstop}
- ></vue-draggable-resizable>
- </th>
- )
- }
- // #endregion
3. 拷贝样式
- <style lang="less">
- .resize-table-th {
- position: relative;
- .table-draggable-handle {
- height: 100% !important;
- bottom: 0;
- left: auto !important;
- right: -5px;
- cursor: col-resize;
- touch-action: none;
- }
- }
- </style>
4. 表格的width=100 必须为数字的
5.columns 操作列增加 key: 'action', Id: 'action'
const columns = [
...
{ title: '操作', dataIndex: 'action', scopedSlots: { customRender: 'action' } }
]
const columns = [
...
{ title: '操作', dataIndex: 'action', key: 'action', Id: 'action', scopedSlots: { customRender: 'action' } }
]
6.<a-table>标签添加vue属性:components="components"
<a-table
ref="table"
:components="components"
:columns="columns"
7.在data中增加 this.components
- export default {
- components: {
- EditForm
- },
- mounted () {
- this.getDataList()
- },
- data () {
- this.components = {
- header: {
- cell: ResizeableTitle
- }
- }
- return {
版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!