mirror of
https://gitee.com/element-plus/element-plus.git
synced 2024-12-16 02:11:48 +08:00
270 lines
11 KiB
Markdown
270 lines
11 KiB
Markdown
## トランスファー
|
|
|
|
### 基本的な使い方
|
|
:::demo データは `data` 属性を用いて転送に渡されます。データはオブジェクトの配列である必要があり、各オブジェクトは以下の属性を持つ必要があります。`key` はデータ項目の識別情報、`label` は表示されるテキスト、`disabled` はデータ項目が無効かどうかを示す。ターゲットリスト内の項目は `v-model` にバインドされた変数と同期しており、その変数の値はターゲット項目のキーの配列となる。したがって、ターゲットリストを初期状態で空にしたくない場合は、`v-model`を配列で初期化することができる。
|
|
```html
|
|
<template>
|
|
<el-transfer
|
|
v-model="value"
|
|
:data="data">
|
|
</el-transfer>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
const generateData = _ => {
|
|
const data = [];
|
|
for (let i = 1; i <= 15; i++) {
|
|
data.push({
|
|
key: i,
|
|
label: `Option ${ i }`,
|
|
disabled: i % 4 === 0
|
|
});
|
|
}
|
|
return data;
|
|
};
|
|
return {
|
|
data: generateData(),
|
|
value: [1, 4]
|
|
};
|
|
}
|
|
};
|
|
</script>
|
|
```
|
|
:::
|
|
|
|
### フィルタリング可能
|
|
|
|
データ項目の検索やフィルタリングができます。
|
|
|
|
:::demo フィルタモードを有効にするには、`filterable` 属性を `true` に設定する。デフォルトでは、`label` に検索キーワードが含まれている場合は検索結果に含まれる。また、`filter-method` 属性を用いて独自のフィルタメソッドを実装することもできる。これはメソッドを受け取り、キーワードが変更されるたびに検索キーワードと各データ項目をそれに渡す。あるデータ項目については、そのメソッドが真を返した場合、そのデータが検索結果リストに含まれる。
|
|
```html
|
|
<template>
|
|
<el-transfer
|
|
filterable
|
|
:filter-method="filterMethod"
|
|
filter-placeholder="State Abbreviations"
|
|
v-model="value"
|
|
:data="data">
|
|
</el-transfer>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
const generateData = _ => {
|
|
const data = [];
|
|
const states = ['California', 'Illinois', 'Maryland', 'Texas', 'Florida', 'Colorado', 'Connecticut '];
|
|
const initials = ['CA', 'IL', 'MD', 'TX', 'FL', 'CO', 'CT'];
|
|
states.forEach((city, index) => {
|
|
data.push({
|
|
label: city,
|
|
key: index,
|
|
initial: initials[index]
|
|
});
|
|
});
|
|
return data;
|
|
};
|
|
return {
|
|
data: generateData(),
|
|
value: [],
|
|
filterMethod(query, item) {
|
|
return item.initial.toLowerCase().indexOf(query.toLowerCase()) > -1;
|
|
}
|
|
};
|
|
}
|
|
};
|
|
</script>
|
|
```
|
|
:::
|
|
|
|
### カスタマイズ可能
|
|
|
|
リストのタイトル、ボタンのテキスト、データ項目のレンダリング機能、リストフッターのステータステキストの確認、リストフッターの内容をカスタマイズすることができます。
|
|
|
|
:::demo `title`, `button-texts`, `render-content`, `format` を使って、リストのタイトル、ボタンのテキスト、データ項目のレンダリング機能、リストヘッダのステータステキストのチェックをそれぞれカスタマイズします。さらに、スコープ付きスロットを使ってデータ項目をカスタマイズすることもできます。リストのフッターの内容には、2つの名前付きスロットが用意されています。`左フッター`と`右フッター`です。さらに、いくつかの項目を最初にチェックしたい場合は、`left-default-checked` と `right-default-checked` を使うことができます。最後に、この例では `change` イベントのデモを行います。このデモはJSX構文をサポートしていないので、jsfiddleでは実行できないことに注意してください。実際のプロジェクトでは、関連する依存関係が正しく設定されていれば `render-content` は動作します。
|
|
```html
|
|
<template>
|
|
<p style="text-align: center; margin: 0 0 20px">Customize data items using render-content</p>
|
|
<div style="text-align: center">
|
|
<el-transfer
|
|
style="text-align: left; display: inline-block"
|
|
v-model="leftValue"
|
|
filterable
|
|
:left-default-checked="[2, 3]"
|
|
:right-default-checked="[1]"
|
|
:render-content="renderFunc"
|
|
:titles="['Source', 'Target']"
|
|
:button-texts="['To left', 'To right']"
|
|
:format="{
|
|
noChecked: '${total}',
|
|
hasChecked: '${checked}/${total}'
|
|
}"
|
|
@change="handleChange"
|
|
:data="data"
|
|
>
|
|
<template #left-footer>
|
|
<el-button class="transfer-footer" size="small">Operation</el-button>
|
|
</template>
|
|
<template #right-footer>
|
|
<el-button class="transfer-footer" size="small">Operation</el-button>
|
|
</template>
|
|
</el-transfer>
|
|
<p style="text-align: center; margin: 50px 0 20px">Customize data items using scoped slot</p>
|
|
<div style="text-align: center">
|
|
<el-transfer
|
|
style="text-align: left; display: inline-block"
|
|
v-model="rightValue"
|
|
filterable
|
|
:left-default-checked="[2, 3]"
|
|
:right-default-checked="[1]"
|
|
:titles="['Source', 'Target']"
|
|
:button-texts="['To left', 'To right']"
|
|
:format="{
|
|
noChecked: '${total}',
|
|
hasChecked: '${checked}/${total}'
|
|
}"
|
|
@change="handleChange"
|
|
:data="data"
|
|
>
|
|
<template #default="{ option }">
|
|
<span>{{ option.key }} - {{ option.label }}</span>
|
|
</template>
|
|
<template #left-footer>
|
|
<el-button class="transfer-footer" size="small">Operation</el-button>
|
|
</template>
|
|
<template #right-footer>
|
|
<el-button class="transfer-footer" size="small">Operation</el-button>
|
|
</template>
|
|
</el-transfer>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<style>
|
|
.transfer-footer {
|
|
margin-left: 20px;
|
|
padding: 6px 5px;
|
|
}
|
|
</style>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
const generateData = _ => {
|
|
const data = [];
|
|
for (let i = 1; i <= 15; i++) {
|
|
data.push({
|
|
key: i,
|
|
label: `Option ${ i }`,
|
|
disabled: i % 4 === 0
|
|
});
|
|
}
|
|
return data;
|
|
};
|
|
return {
|
|
data: generateData(),
|
|
rightValue: [1],
|
|
leftValue: [1],
|
|
renderFunc(h, option) {
|
|
return h("span", null, option.key, " - ", option.label);
|
|
}
|
|
};
|
|
},
|
|
|
|
methods: {
|
|
handleChange(value, direction, movedKeys) {
|
|
console.log(value, direction, movedKeys);
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
```
|
|
:::
|
|
|
|
### プロップのエイリアス
|
|
|
|
デフォルトでは、Transferはデータ項目の中から `key`, `label`, `disabled` を探します。データ項目に異なるキー名がある場合、`props` 属性を使ってエイリアスを定義することができます。
|
|
:::demo この例のデータ項目には `key` や `label` がなく、代わりに `value` と `desc` があります。そのため、`key`と`label`にエイリアスを設定する必要があります。
|
|
```html
|
|
<template>
|
|
<el-transfer
|
|
v-model="value"
|
|
:props="{
|
|
key: 'value',
|
|
label: 'desc'
|
|
}"
|
|
:data="data">
|
|
</el-transfer>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
const generateData = _ => {
|
|
const data = [];
|
|
for (let i = 1; i <= 15; i++) {
|
|
data.push({
|
|
value: i,
|
|
desc: `Option ${ i }`,
|
|
disabled: i % 4 === 0
|
|
});
|
|
}
|
|
return data;
|
|
};
|
|
return {
|
|
data: generateData(),
|
|
value: []
|
|
};
|
|
}
|
|
};
|
|
</script>
|
|
```
|
|
:::
|
|
|
|
### 属性
|
|
|
|
| Attribute | Description | Type | Accepted Values | Default |
|
|
|---------- |-------- |---------- |------------- |-------- |
|
|
| value / v-model | バインディング値 | array | — | — |
|
|
| data | データソース | array[{ key, label, disabled }] | — | [ ] |
|
|
| filterable | 転送がフィルタリング可能かどうか | boolean | — | false |
|
|
| filter-placeholder | フィルタ入力のプレースホルダ | string | — | Enter keyword |
|
|
| filter-method | カスタムフィルタメソッド | function | — | — |
|
|
| target-order | ターゲットリストの要素の順序を指定します。`original` に設定されている場合、要素はデータソースと同じ順序を保ちます。`push` に設定すると、新しく追加された要素はボトムに押し出されます。`unshift` に設定すると、新たに追加された要素はトップに挿入される。 | string | original / push / unshift | original |
|
|
| titles | カスタムリストタイトル | array | — | ['List 1', 'List 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 | 左リストの初期チェックデータ項目のキー配列 | array | — | [ ] |
|
|
| right-default-checked | 右リストの初期チェックデータ項目のキー配列 | array | — | [ ] |
|
|
|
|
### スロット
|
|
|
|
| Name | Description |
|
|
|------|--------|
|
|
| left-footer | 左リストフッターの内容 |
|
|
| right-footer | 右リストフッターの内容 |
|
|
|
|
### スコープされたスロット
|
|
|
|
| Name | Description |
|
|
|------|--------|
|
|
| — | データ項目のカスタムコンテンツ。スコープパラメータは { オプション } です。 |
|
|
|
|
### メソッド
|
|
|
|
| Method | Description | Parameters |
|
|
| ---- | ---- | ---- |
|
|
| clearQuery | 特定のパネルのフィルタキーワードをクリア | 'left' / 'right' |
|
|
|
|
### イベント
|
|
|
|
| Event Name | Description | Parameters |
|
|
|---------- |-------- |---------- |
|
|
| change | 右側のリストでデータ項目が変更された場合にトリガーされる | key array of current data items in the right list, transfer direction (left or right), moved item keys |
|
|
| left-check-change | エンドユーザーが左リストのデータ項目のチェック状態を変更した場合にトリガーされます。 | key array of currently checked items, key array of items whose checked state have changed |
|
|
| right-check-change | エンドユーザーが右のリスト内の任意のデータ項目のチェック状態を変更した場合にトリガーされます。 | key array of currently checked items, key array of items whose checked state have changed |
|