前端学习笔记 antdeisgn vue 穿梭框应用

devtools/2025/1/7 15:09:23/

版本

antd 3.x vue 3.x

背景

一个商品有N个模板,这个模板由N个组织进行维护各自的数据,商品的展示过程中需要按照模板的顺序展示商品的相关详情

源码实现

穿梭框基于这个进行实现
在这里插入图片描述
源码

<template><div><a-transferv-model:target-keys="targetKeys":data-source="mockData":disabled="disabled":show-search="showSearch":filter-option="(inputValue, item) => item.title.indexOf(inputValue) !== -1":show-select-all="false"@change="onChange"><template#children="{direction,filteredItems,selectedKeys,disabled: listDisabled,onItemSelectAll,onItemSelect,}"><a-table:row-selection="getRowSelection({disabled: listDisabled,selectedKeys,onItemSelectAll,onItemSelect,})":columns="direction === 'left' ? leftColumns : rightColumns":data-source="filteredItems"size="small":style="{ pointerEvents: listDisabled ? 'none' : null }":custom-row="({ key, disabled: itemDisabled }) => ({onClick: () => {if (itemDisabled || listDisabled) return;onItemSelect(key, !selectedKeys.includes(key));},})"/></template></a-transfer><a-switchv-model:checked="disabled"un-checked-children="disabled"checked-children="disabled"style="margin-top: 16px"/><a-switchv-model:checked="showSearch"un-checked-children="showSearch"checked-children="showSearch"style="margin-top: 16px"/></div>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
interface MockData {key: string;title: string;description: string;disabled: boolean;
}
type tableColumn = Record<string, string>;
const mockData: MockData[] = [];
for (let i = 0; i < 10; i++) {mockData.push({key: i.toString(),title: `content${i + 1}`,description: `description of content${i + 1}`,disabled: i % 4 === 0,});
}const originTargetKeys = mockData.filter(item => +item.key % 3 > 1).map(item => item.key);const leftTableColumns = [{dataIndex: 'title',title: 'Name',},{dataIndex: 'description',title: 'Description',},
];
const rightTableColumns = [{dataIndex: 'title',title: 'Name',},
];export default defineComponent({setup() {const targetKeys = ref<string[]>(originTargetKeys);const disabled = ref<boolean>(false);const showSearch = ref<boolean>(false);const leftColumns = ref<tableColumn[]>(leftTableColumns);const rightColumns = ref<tableColumn[]>(rightTableColumns);const onChange = (nextTargetKeys: string[]) => {console.log('nextTargetKeys', nextTargetKeys);};const getRowSelection = ({disabled,selectedKeys,onItemSelectAll,onItemSelect,}: Record<string, any>) => {return {getCheckboxProps: (item: Record<string, string | boolean>) => ({disabled: disabled || item.disabled,}),onSelectAll(selected: boolean, selectedRows: Record<string, string | boolean>[]) {const treeSelectedKeys = selectedRows.filter(item => !item.disabled).map(({ key }) => key);onItemSelectAll(treeSelectedKeys, selected);},onSelect({ key }: Record<string, string>, selected: boolean) {onItemSelect(key, selected);},selectedRowKeys: selectedKeys,};};return {mockData,targetKeys,disabled,showSearch,leftColumns,rightColumns,onChange,getRowSelection,};},
});
</script>

表格实现参考
在这里插入图片描述

<template><a-table :columns="columns" :data-source="data"><template #headerCell="{ column }"><template v-if="column.key === 'name'"><span><smile-outlined />Name</span></template></template><template #bodyCell="{ column, record }"><template v-if="column.key === 'name'"><a>{{ record.name }}</a></template><template v-else-if="column.key === 'tags'"><span><a-tagv-for="tag in record.tags":key="tag":color="tag === 'loser' ? 'volcano' : tag.length > 5 ? 'geekblue' : 'green'">{{ tag.toUpperCase() }}</a-tag></span></template><template v-else-if="column.key === 'action'"><span><a>Invite 一 {{ record.name }}</a><a-divider type="vertical" /><a>Delete</a><a-divider type="vertical" /><a class="ant-dropdown-link">More actions<down-outlined /></a></span></template></template></a-table>
</template>
<script lang="ts">
import { SmileOutlined, DownOutlined } from '@ant-design/icons-vue';
import { defineComponent } from 'vue';
const columns = [{name: 'Name',dataIndex: 'name',key: 'name',},{title: 'Age',dataIndex: 'age',key: 'age',},{title: 'Address',dataIndex: 'address',key: 'address',},{title: 'Tags',key: 'tags',dataIndex: 'tags',},{title: 'Action',key: 'action',},
];const data = [{key: '1',name: 'John Brown',age: 32,address: 'New York No. 1 Lake Park',tags: ['nice', 'developer'],},{key: '2',name: 'Jim Green',age: 42,address: 'London No. 1 Lake Park',tags: ['loser'],},{key: '3',name: 'Joe Black',age: 32,address: 'Sidney No. 1 Lake Park',tags: ['cool', 'teacher'],},
];export default defineComponent({components: {SmileOutlined,DownOutlined,},setup() {return {data,columns,};},
});
</script>

bodyCell插槽里面使用a-select、a-input-number即可,这些在ant design vue的官网里面都有

<template v-if="column.dataIndex === 'sort'"><!-- {{ text }} --><a-input-number placeholder="请输入排序号" class="tmplSort" v-model:value="record.sort"/></template><template v-if="column.dataIndex === 'deptId'"><a-select class="tmplDept" placeholder="请选择" :allowClear="true" v-model:value="record.deptId"><a-select-option v-for="dept in deptArray" :key="dept.id" :value="dept.id">{{ dept.name }}</a-select-option></a-select>

模板表格行的选择去掉

现象:选中的模板的行里面有排序号(inputtext)和维护组织(下拉框),当鼠标点击排序后的文本框或者维护组下拉框时当前行前面的多选框就会选中或者不选中
改动:
注释掉表格穿梭框的以下代码即可

:custom-row="({ key, disabled: itemDisabled }) => ({onClick: () => {if (itemDisabled || listDisabled) return;onItemSelect(key, !selectedKeys.includes(key));},})"

http://www.ppmy.cn/devtools/148283.html

相关文章

STM32完全学习——使用定时器1精确延时

一、定时器的相关配置 首先一定要是递减定时器&#xff0c;递增的不太行&#xff0c;控制的不够准确&#xff0c;其次在大于10微秒的延时是非常准确的&#xff0c;小于的话&#xff0c;就没有那没准&#xff0c;但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…

uniapp:跳转第三方地图

1.跳转第三方高德地图 //跳转地图 toMap(item){uni.navigateTo({url: (window.location.href https://uri.amap.com/navigation?to${item.lng},${item.lat},${item.shopName}&modecar&policy1&srchttps://gawl.gazhcs.com/wap/index.html&callnative0)}) },…

【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞+FilesystemObject)

【Web安全】文件写入漏洞 ASP 网页病毒模拟&#xff08;文件写入漏洞FilesystemObject&#xff09; 原理 文件写入漏洞 文件写入漏洞是指攻击者通过某种方式在服务器上创建或修改文件的漏洞。攻击者可以利用此漏洞在服务器上写入恶意代码或文件&#xff0c;从而实现进一步的…

STM32-笔记23-超声波传感器HC-SR04

一、简介 HC-SR04 工作参数&#xff1a; • 探测距离&#xff1a;2~600cm • 探测精度&#xff1a;0.1cm1% • 感应角度&#xff1a;<15 • 输出方式&#xff1a;GPIO • 工作电压&#xff1a;DC 3~5.5V • 工作电流&#xff1a;5.3mA • 工作温度&#xff1a;-40~85℃ 怎么…

Spring MVC实战指南:构建高效Web应用的架构与技巧(三)

响应数据和结果视图(7种) 返回值分类 创建web.xml&#xff08;spring、过滤器解决乱码、配置控制器dispatcherServlet、加载springmvc.xml文件、配置启动加载&#xff09;创建springmvc.xml文件 <!--配置了内容&#xff0c;启动Tomcat服务器的时候&#xff0c;就会被加载--…

设计模式之访问者模式:一楼千面 各有玄机

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、访问者模式概述 \quad 江湖中有一个传说&#xff1a;在遥远的东方&#xff0c;有一座神秘的玉楼。每当武林中人来访&#xff0c;楼中的各个房…

QML学习(七) 学习QML时,用好Qt设计器的属性

在初步学习QML时&#xff0c;特别建议看看Qt设计器&#xff0c;先利用Qt Quick设计师的使用&#xff0c;快速的对Qt Quick的各个组件及其常用的属性&#xff0c;有个初步的了解和认识。如果初始学习一上来直接以代码形式开干&#xff0c;很容易一头雾水。而设计器以最直白的所见…

.net core强大的列表对比取数

将一个list的中的所有数据在另一个list中找出&#xff0c;并将找到的数据生成一个新的list。 背景&#xff1a; 有一个大的字符串类型的list Alllist&#xff0c;中包含可营销的数据和不可营销的数据&#xff0c;共八千万条 另一个字符串list CanMarkelist中包含不可营销的数据…