element-plus/website/docs/jp/transfer.md

270 lines
11 KiB
Markdown
Raw Normal View History

2020-11-04 10:30:14 +08:00
## トランスファー
### 基本的な使い方
:::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"
2020-11-20 23:02:15 +08:00
v-model="leftValue"
2020-11-04 10:30:14 +08:00
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"
2020-11-20 23:02:15 +08:00
: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>
2020-11-04 10:30:14 +08:00
</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"
2020-11-20 23:02:15 +08:00
v-model="rightValue"
2020-11-04 10:30:14 +08:00
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"
2020-11-20 23:02:15 +08:00
: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>
2020-11-04 10:30:14 +08:00
</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(),
2020-11-20 23:02:15 +08:00
rightValue: [1],
leftValue: [1],
2020-11-04 10:30:14 +08:00
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 |
|---------- |-------- |---------- |------------- |-------- |
| model-value / v-model | バインディング値 | array | — | — |
2020-11-04 10:30:14 +08:00
| 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 |