Transfer 穿梭框

双栏穿梭选择框。

何时使用

用直观的方式在两栏中移动元素,完成选择行为。选择一个或以上的选项后,点击对应的方向键,可以把选中的选项移动到另一栏。 其中,左边一栏为 source,右边一栏为 target,API 的设计也反应了这两个概念。

代码演示

基本用法

最基本的用法,展示了 datatargetKeys、每行的渲染函数 label 以及事件 change 的用法。

  1. <template>
  2. <v-transfer :data="dataSource1" :titles="['源列表','目的列表']" :target-keys="targetKeys1" @change="handleChange1" :label="render1"></v-transfer>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. dataSource1: [],
  9. targetKeys1: []
  10. }
  11. },
  12. created() {
  13. this.mockData();
  14. },
  15. methods: {
  16. mockData() {
  17. for (let i = 0; i < 20; i++) {
  18. this.dataSource1.push({
  19. key: i.toString(),
  20. title: `content${i + 1}`,
  21. description: `description of content${i + 1}`,
  22. disabled: i % 3 < 1,
  23. });
  24. if(i % 3 > 1) {
  25. this.targetKeys1.push(i.toString());
  26. }
  27. }
  28. },
  29. render1(item) {
  30. return item.title;
  31. },
  32. handleChange1(targetKeys, direction, moveKeys) {
  33. this.targetKeys1 = targetKeys;
  34. }
  35. }
  36. }
  37. </script>

带搜索框

带搜索框的穿梭框,可以自定义搜索函数。

  1. <template>
  2. <v-transfer :data="dataSource2" :target-keys="targetKeys2" @change="handleChange2" show-search :filter-option="filterOption" :label="render1"></v-transfer>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. dataSource2: [],
  9. targetKeys2: []
  10. }
  11. },
  12. created() {
  13. this.getMock()
  14. },
  15. methods: {
  16. mockData2(index) {
  17. const targetKeys = [];
  18. const mockData = [];
  19. for (let i = 0; i < 20; i++) {
  20. const data = {
  21. key: i,
  22. title: `内容${i + 1}`,
  23. description: `内容${i + 1}的描述`,
  24. chosen: Math.random() * 2 > 1,
  25. };
  26. if (data.chosen) {
  27. targetKeys.push(data.key);
  28. }
  29. mockData.push(data);
  30. }
  31. this[`dataSource${index}`] = mockData;
  32. this[`targetKeys${index}`] = targetKeys;
  33. },
  34. getMock() {
  35. for(let num = 1; num < 4; num ++) {
  36. this.mockData2(num+1);
  37. }
  38. },
  39. render1(item) {
  40. return item.title;
  41. },
  42. handleChange2(targetKeys, direction, moveKeys) {
  43. this.targetKeys2 = targetKeys;
  44. },
  45. filterOption(inputValue, option) {
  46. return option.description.indexOf(inputValue) > -1;
  47. }
  48. }
  49. }
  50. </script>

高级用法

穿梭框高级用法,可配置操作文案,可定制宽高,可对底部进行自定义渲染。

  1. <template>
  2. <v-transfer :data="dataSource3" :target-keys="targetKeys3" @change="handleChange3" :list-style="{width: '250px', height: '300px'}" show-search :operations="['向右', '向左']" :filter-option="filterOption" :label="render1">
  3. <div :style="{float: 'right', margin: '5px'}" slot="leftFooter">
  4. <v-button type="ghost" size="small" @click="mockData2(3)">刷新</v-button>
  5. </div>
  6. <div :style="{float: 'right', margin: '5px'}" slot="rightFooter">
  7. <v-button type="ghost" size="small" @click="mockData2(3)">刷新</v-button>
  8. </div>
  9. </v-transfer>
  10. </template>
  11. <script>
  12. export default {
  13. data() {
  14. return {
  15. dataSource3: [],
  16. targetKeys3: []
  17. }
  18. },
  19. created() {
  20. this.getMock()
  21. },
  22. methods: {
  23. mockData2(index) {
  24. const targetKeys = [];
  25. const mockData = [];
  26. for (let i = 0; i < 20; i++) {
  27. const data = {
  28. key: i,
  29. title: `内容${i + 1}`,
  30. description: `内容${i + 1}的描述`,
  31. chosen: Math.random() * 2 > 1,
  32. };
  33. if (data.chosen) {
  34. targetKeys.push(data.key);
  35. }
  36. mockData.push(data);
  37. }
  38. this[`dataSource${index}`] = mockData;
  39. this[`targetKeys${index}`] = targetKeys;
  40. },
  41. getMock() {
  42. for(let num = 1; num < 4; num ++) {
  43. this.mockData2(num+1);
  44. }
  45. },
  46. render1(item) {
  47. return item.title;
  48. },
  49. handleChange3(targetKeys, direction, moveKeys) {
  50. this.targetKeys3 = targetKeys;
  51. },
  52. filterOption(inputValue, option) {
  53. return option.description.indexOf(inputValue) > -1;
  54. }
  55. }
  56. }
  57. </script>

自定义渲染行数据

自定义渲染每一个 Transfer Item,可用于渲染复杂数据

  1. <template>
  2. <v-transfer :data="dataSource4" :target-keys="targetKeys4" @change="handleChange4" :list-style="{width: '300px', height: '300px'}" :label="render2"></v-transfer>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. dataSource4: [],
  9. targetKeys4: []
  10. }
  11. },
  12. created() {
  13. this.getMock()
  14. },
  15. methods: {
  16. mockData2(index) {
  17. const targetKeys = [];
  18. const mockData = [];
  19. for (let i = 0; i < 20; i++) {
  20. const data = {
  21. key: i,
  22. title: `内容${i + 1}`,
  23. description: `内容${i + 1}的描述`,
  24. chosen: Math.random() * 2 > 1,
  25. };
  26. if (data.chosen) {
  27. targetKeys.push(data.key);
  28. }
  29. mockData.push(data);
  30. }
  31. this[`dataSource${index}`] = mockData;
  32. this[`targetKeys${index}`] = targetKeys;
  33. },
  34. getMock() {
  35. for(let num = 1; num < 4; num ++) {
  36. this.mockData2(num+1);
  37. }
  38. },
  39. render2(item) {
  40. return {
  41. label: `${item.title} - ${item.description}`,
  42. value: item.title
  43. }
  44. },
  45. handleChange4(targetKeys, direction, moveKeys) {
  46. this.targetKeys4 = targetKeys;
  47. }
  48. }
  49. }
  50. </script>

API

Transfer Props

参数说明类型默认值
data数据源,其中的数据将会被渲染到左边一栏中,targetKeys 中指定的除外。Object[][]
label每行数据渲染函数,该函数的入参为 data 中的项Function-
targetKeys显示在右侧框数据的key集合String[][]
listStyle两个穿梭框的自定义样式Object-
className两个穿梭框的自定义类String-
titles标题集合,顺序从左至右String[]['', '']
operations操作文案集合,顺序从上至下String[][]
showSearch是否显示搜索框Booleanfalse
filterOption接收 inputValue option 两个参数,当 option 符合筛选条件时,应返回 true,反之则返回 false(inputValue, option): boolean-
searchPlaceholder搜索框的默认值String'请输入搜索内容'
notFoundContent当列表为空时显示的内容String'列表为空'
slot:leftFooter左侧穿梭框底部渲染插槽Slot Node-
slot:rightFooter右侧穿梭框底部渲染插槽Slot Node-

Data Props

属性说明类型默认值
keytransfer item的唯一标识String-
title标题String-
description描述String-
disabled禁掉响应Booleanfalse

Transfer Events

事件说明参数
change选项在两栏之间转移时触发(targetKeys, direction, moveKeys)