## 简介

穿梭框常用于多项信息选择场景，方便用户直观的对比待选项与已选项，其中待选项即可以被转移到已选项中（剪切），也可以被复制到已选项中（复制）。

## 示例

```tsx
import React from 'react';
import { Transfer } from '@alicloud/console-components';

const labels = [
  '默认项',
  '默认项',
  '默认项',
  '聚焦项',
  '默认项',
  '失效项',
  '默认项',
];
const getDataSource = () => {
  const result = [];

  for (let i = 0; i < 10; i++) {
    result.push({
      label: labels[i],
      value: `${i}`,
      disabled: i === 5,
    });
  }

  return result;
};

const handleChange = (value, data, extra) => {
  console.log(value, data, extra);
};

export default () => {
  return (
    <Transfer
      mode="simple"
      defaultValue={['3', '2']}
      defaultLeftChecked={['1']}
      dataSource={getDataSource()}
      onChange={handleChange}
      titles={[
        <span style={{ fontWeight: 500 }}>项目列表标题</span>,
        <span style={{ fontWeight: 500 }}>项目列表标题</span>,
      ]}
    />
  );
};

export const meta = {
  title: '默认',
  describe: '基础用法，可通过titles定制两侧标题，mode属性控制选项模式。',
};

```

```tsx
import React from 'react';
import { Transfer } from '@alicloud/console-components';

const labels = [
  '默认项',
  '默认项',
  '默认项',
  '聚焦项',
  '默认项',
  '失效项',
  '默认项',
];
const getDataSource = () => {
  const result = [];

  for (let i = 0; i < 10; i++) {
    result.push({
      label: labels[i],
      value: `${i}`,
      disabled: i === 5,
    });
  }

  return result;
};

const handleChange = (value, data, extra) => {
  console.log(value, data, extra);
};

export default () => {
  return (
    <Transfer
      showSearch
      mode="simple"
      defaultValue={['3', '2']}
      defaultLeftChecked={['1']}
      dataSource={getDataSource()}
      onChange={handleChange}
      titles={[
        <span style={{ fontWeight: 500 }}>项目列标题</span>,
        <span style={{ fontWeight: 500 }}>项目列标题</span>,
      ]}
    />
  );
};

export const meta = {
  title: '带搜索',
  describe: '通过 showSearch 属性控制显示搜索框。',
};

```

## API

### Transfer

| 参数                | 说明                                                                                                                                                                                                               | 类型                                                                                                                                   | 默认值      | 是否必填 |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | ----------- | -------- |
| mode                | 移动选项模式                                                                                                                                                                                                       | 'normal' | 'simple'                                                                                                                   | 'normal'    |          |
| dataSource          | 数据源                                                                                                                                                                                                             | Array\<TransferDataItem>                                                                                                               | \[]          |          |
| value               | （用于受控）当前值                                                                                                                                                                                                 | Array\<string>                                                                                                                         | -           |          |
| defaultValue        | （用于非受控）初始值                                                                                                                                                                                               | Array\<string>                                                                                                                         | \[]          |          |
| onChange            | 值发生改变的时候触发的回调函数<br/><br/>**签名**:<br/>**参数**:<br/>*value*: 右面板值<br/>*data*: 右面板数据<br/>*extra*: 额外参数                                                                                 | (value: Array\<string>, data: Array\<TransferDataItem>, extra: ExtraOptions) => void                                                   | -           |          |
| onSelect            | Item 被选中的时候触发的回调函数<br/><br/>**签名**:<br/>**参数**:<br/>*sourceSelectedValue*: 源面板选中的 Item 列表<br/>*targetSelectedValue*: 目标面板选中的 Item 列表<br/>*target*: 触发面板 'source' | 'target' | (<br/> sourceSelectedValue: Array\<string>,<br/> targetSelectedValue: Array\<string>,<br/> target: 'source' | 'target'<br/> ) => void | -           |          |
| disabled            | 是否禁用                                                                                                                                                                                                           | boolean                                                                                                                                | false       |          |
| leftDisabled        | 是否禁用左侧面板                                                                                                                                                                                                   | boolean                                                                                                                                | false       |          |
| rightDisabled       | 是否禁用右侧面板                                                                                                                                                                                                   | boolean                                                                                                                                | false       |          |
| itemRender          | 列表项渲染函数<br/><br/>**签名**:<br/>**参数**:<br/>*data*: 数据<br/>**返回值**:<br/>列表项内容                                                                                                                    | (data: TransferDataItem) => React.ReactNode                                                                                            | -           |          |
| showSearch          | 左右面板是否显示搜索框                                                                                                                                                                                             | boolean | \[leftPanel: boolean, rightPanel: boolean]                                                                                   | false       |          |
| searchProps         | 左右面板搜索框配置                                                                                                                                                                                                 | SearchProps | \[leftPanel: SearchProps, rightPanel: SearchProps]                                                                       | -           |          |
| filter              | 自定义搜索函数<br/><br/>**签名**:<br/>**参数**:<br/>*searchedValue*: 搜索框输入的值<br/>*data*: 数据<br/>**返回值**:<br/>是否匹配到                                                                                | (searchedValue: string, data: TransferDataItem) => boolean                                                                             | -           |          |
| onSearch            | 搜索框输入时触发的回调函数<br/><br/>**签名**:<br/>**参数**:<br/>*searchedValue*: 搜索框输入的值<br/>*position*: 搜索面板的位置                                                                                     | (searchedValue: string, position: string) => void                                                                                      | -           |          |
| useVirtual          | 是否开启虚拟滚动                                                                                                                                                                                                   | boolean                                                                                                                                | -           |          |
| searchPlaceholder   | 搜索框占位符                                                                                                                                                                                                       | string                                                                                                                                 | -           |          |
| notFoundContent     | 列表为空显示内容                                                                                                                                                                                                   | React.ReactNode | \[leftPanel: React.ReactNode, rightPanel: React.ReactNode]                                                           | 'Not Found' |          |
| titles              | 左右面板标题                                                                                                                                                                                                       | \[leftPanel: React.ReactNode, rightPanel: React.ReactNode]                                                                              | \[]          |          |
| operations          | 向右向左移动按钮显示内容                                                                                                                                                                                           | \[leftPanel: React.ReactNode, rightPanel: React.ReactNode]                                                                              | \[]          |          |
| defaultLeftChecked  | 左面板默认选中值                                                                                                                                                                                                   | Array\<string>                                                                                                                         | \[]          |          |
| defaultRightChecked | 右面板默认选中值                                                                                                                                                                                                   | Array\<string>                                                                                                                         | \[]          |          |
| listClassName       | 左右面板列表自定义样式类名                                                                                                                                                                                         | string                                                                                                                                 | -           |          |
| listStyle           | 左右面板列表自定义样式对象                                                                                                                                                                                         | React.CSSProperties                                                                                                                    | -           |          |
| sortable            | 是否允许拖拽排序                                                                                                                                                                                                   | boolean                                                                                                                                | false       |          |
| onSort              | 拖拽排序时触发的回调函数<br/><br/>**签名**:<br/>**参数**:<br/>*value*: 右面板值<br/>*position*: 拖拽的面板位置，值为：left 或 right                                                                                | (value: Array\<string>, position: PositionType) => void                                                                                | -           |          |
| id                  | 请设置 id 以保证transfer的可访问性                                                                                                                                                                                 | string                                                                                                                                 | -           |          |
| showCheckAll        | 是否显示底部全选 checkbox                                                                                                                                                                                          | boolean                                                                                                                                | true        |          |
| children            | 接收 children 自定义渲染列表                                                                                                                                                                                       | (props: TransferPanelProps) => React.ReactNode                                                                                         | -           |          |

### TransferDataItem

```typescript
export type TransferDataItem = {
    label: string | React.ReactNode;
    value: string;
    title?: string;
    disabled?: boolean;
    children?: TransferDataItem[];
    [key: string]: unknown;
};
```

### PositionType

```typescript
export type PositionType = 'left' | 'right';
```

### DragGapType

```typescript
export type DragGapType = 'before' | 'after';
```

### ExtraOptions

```typescript
export type ExtraOptions = {
    /**
     * 移动的方向，值为'left'或'right'
     * @en Move direction, 'left' or 'right'
     */
    direction: PositionType;
    /**
     * 左面板值
     * @en Data of left panel
     */
    leftValue: string[];
    /**
     * 左面板数据
     * @en Data of left panel
     */
    leftData: TransferDataItem[];
    /**
     * 发生移动的数据
     * @en Moved data
     */
    movedData: TransferDataItem[];
    /**
     * 发生移动的值
     * @en Moved value
     */
    movedValue: string[];
};
```

## 无障碍键盘操作指南

| 按键       | 说明                                              |
| :--------- | :------------------------------------------------ |
| Up Arrow   | 获取当前项的前一项焦点                            |
| Down Arrow | 获取当前项的后一项焦点                            |
| Enter      | 当前列表选中的项移动到另一个列表                  |
| SPACE      | 选择/取消当前项或当前列表选中的项移动到另一个列表 |

## 更多示例

```tsx
```

```tsx
```

```tsx
```

```tsx
```

```tsx
```

```tsx
```

```tsx
```

```tsx
```
