Transfer 穿梭框


基礎用法

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>
View Code

可搜索

在數據很多的情況下,可以對數據進行搜索和過濾。

設置 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>
View Code

可自定義

可以對列表標題文案、按鈕文案、數據項的渲染函數、列表底部的勾選狀態文案、列表底部的內容區等進行自定義。

可以使用 titlesbutton-textsrender-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>
View Code

數據項屬性別名

默認情況下,Transfer 僅能識別數據項中的 keylabel 和 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>
View Code

 

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 數組


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM