基础用法
Transfer 的数据通过 data
属性传入。数据需要是一个对象数组,每个对象有以下属性:key
为数据的唯一性标识,label
为显示文本,disabled
表示该项数据是否禁止转移。目标列表中的数据项会同步到绑定至 v-model
的变量,值为数据项的 key
所组成的数组。当然,如果希望在初始状态时目标列表不为空,可以像本例一样为 v-model
绑定的变量赋予一个初始值。
1 <template> 2 <el-transfer v-model="value1" :data="data"></el-transfer> 3 </template> 4 5 <script> 6 export default { 7 data() { 8 const generateData = _ => { 9 const data = []; 10 for (let i = 1; i <= 15; i++) { 11 data.push({ 12 key: i, 13 label: `备选项 ${ i }`, 14 disabled: i % 4 === 0 15 }); 16 } 17 return data; 18 }; 19 return { 20 data: generateData(), 21 value1: [1, 4] 22 }; 23 } 24 }; 25 </script>
可搜索
在数据很多的情况下,可以对数据进行搜索和过滤。
设置 filterable
为 true
即可开启搜索模式。默认情况下,若数据项的 label
属性包含搜索关键字,则会在搜索结果中显示。你也可以使用 filter-method
定义自己的搜索逻辑。filter-method
接收一个方法,当搜索关键字变化时,会将当前的关键字和每个数据项传给该方法。若方法返回 true
,则会在搜索结果中显示对应的数据项。
1 <template> 2 <el-transfer 3 filterable 4 :filter-method="filterMethod" 5 filter-placeholder="请输入城市拼音" 6 v-model="value2" 7 :data="data2"> 8 </el-transfer> 9 </template> 10 11 <script> 12 export default { 13 data() { 14 const generateData2 = _ => { 15 const data = []; 16 const cities = ['上海', '北京', '广州', '深圳', '南京', '西安', '成都']; 17 const pinyin = ['shanghai', 'beijing', 'guangzhou', 'shenzhen', 'nanjing', 'xian', 'chengdu']; 18 cities.forEach((city, index) => { 19 data.push({ 20 label: city, 21 key: index, 22 pinyin: pinyin[index] 23 }); 24 }); 25 return data; 26 }; 27 return { 28 data2: generateData2(), 29 value2: [], 30 filterMethod(query, item) { 31 return item.pinyin.indexOf(query) > -1; 32 } 33 }; 34 } 35 }; 36 </script>
可自定义
可以对列表标题文案、按钮文案、数据项的渲染函数、列表底部的勾选状态文案、列表底部的内容区等进行自定义。
可以使用 titles
、button-texts
、render-content
和 format
属性分别对列表标题文案、按钮文案、数据项的渲染函数和列表顶部的勾选状态文案进行自定义。对于列表底部的内容区,提供了两个具名 slot:left-footer
和 right-footer
。此外,如果希望某些数据项在初始化时就被勾选,可以使用 left-default-checked
和 right-default-checked
属性。最后,本例还展示了 change
事件的用法。注意:由于 jsfiddle 不支持 JSX 语法,所以本例在 jsfiddle 中无法运行。但是在实际的项目中,只要正确地配置了相关依赖,就可以正常运行。
1 <template> 2 <el-transfer 3 v-model="value3" 4 filterable 5 :left-default-checked="[2, 3]" 6 :right-default-checked="[1]" 7 :render-content="renderFunc" 8 :titles="['Source', 'Target']" 9 :button-texts="['到左边', '到右边']" 10 :format="{ 11 noChecked: '${total}', 12 hasChecked: '${checked}/${total}' 13 }" 14 @change="handleChange" 15 :data="data"> 16 <el-button class="transfer-footer" slot="left-footer" size="small">操作</el-button> 17 <el-button class="transfer-footer" slot="right-footer" size="small">操作</el-button> 18 </el-transfer> 19 </template> 20 21 <style> 22 .transfer-footer { 23 margin-left: 20px; 24 padding: 6px 5px; 25 } 26 </style> 27 28 <script> 29 export default { 30 data() { 31 const generateData = _ => { 32 const data = []; 33 for (let i = 1; i <= 15; i++) { 34 data.push({ 35 key: i, 36 label: `备选项 ${ i }`, 37 disabled: i % 4 === 0 38 }); 39 } 40 return data; 41 }; 42 return { 43 data: generateData(), 44 value3: [1], 45 renderFunc(h, option) { 46 return <span>{ option.key } - { option.label }</span>; 47 } 48 }; 49 }, 50 51 methods: { 52 handleChange(value, direction, movedKeys) { 53 console.log(value, direction, movedKeys); 54 } 55 } 56 }; 57 </script>
数据项属性别名
默认情况下,Transfer 仅能识别数据项中的 key
、label
和 disabled
字段。如果你的数据的字段名不同,可以使用 props
属性为它们设置别名。
本例中的数据源没有 key
和 label
字段,在功能上与它们相同的字段名为 value
和 desc
。因此可以使用props
属性为 key
和 label
设置别名。
1 <template> 2 <el-transfer 3 v-model="value4" 4 :props="{ 5 key: 'value', 6 label: 'desc' 7 }" 8 :data="data3"> 9 </el-transfer> 10 </template> 11 12 <script> 13 export default { 14 data() { 15 const generateData3 = _ => { 16 const data = []; 17 for (let i = 1; i <= 15; i++) { 18 data.push({ 19 value: i, 20 desc: `备选项 ${ i }`, 21 disabled: i % 4 === 0 22 }); 23 } 24 return data; 25 }; 26 return { 27 data3: generateData3(), 28 value4: [] 29 }; 30 } 31 }; 32 </script>
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
data | Transfer 的数据源 | array[{ key, label, disabled }] | — | [ ] |
filterable | 是否可搜索 | boolean | — | false |
filter-placeholder | 搜索框占位符 | string | — | 请输入搜索内容 |
filter-method | 自定义搜索方法 | function | — | — |
target-order | 右侧列表元素的排序策略:若为 original ,则保持与数据源相同的顺序;若为 push ,则新加入的元素排在最后;若为 unshift ,则新加入的元素排在最前 |
string | original / push / unshift | original |
titles | 自定义列表标题 | array | — | ['列表 1', '列表 2'] |
button-texts | 自定义按钮文案 | array | — | [ ] |
render-content | 自定义数据项渲染函数 | function(h, option) | — | — |
format | 列表顶部勾选状态文案 | object{noChecked, hasChecked} | — | { noChecked: '${checked}/${total}', hasChecked: '${checked}/${total}' } |
props | 数据源的字段别名 | object{key, label, disabled} | — | — |
left-default-checked | 初始状态下左侧列表的已勾选项的 key 数组 | array | — | [ ] |
right-default-checked | 初始状态下右侧列表的已勾选项的 key 数组 | array | — | [ ] |
Slot
name | 说明 |
---|---|
left-footer | 左侧列表底部的内容 |
right-footer | 右侧列表底部的内容 |
Methods
方法名 | 说明 | 参数 |
---|---|---|
clearQuery | 清空某个面板的搜索关键词 | 'left' / 'right',指定需要清空的面板 |
Events
事件名称 | 说明 | 回调参数 |
---|---|---|
change | 右侧列表元素变化时触发 | 当前值、数据移动的方向('left' / 'right')、发生移动的数据 key 数组 |