Transfer 穿梭框

双栏穿梭选择框。

何时使用

  • 需要在多个可选项中进行多选时。
  • 比起 Select 和 TreeSelect,穿梭框占据更大的空间,可以展示可选项的更多信息。

穿梭选择框用直观的方式在两栏中移动元素,完成选择行为。

选择一个或以上的选项后,点击对应的方向键,可以把选中的选项移动到另一栏。其中,左边一栏为 source,右边一栏为 target,API 的设计也反映了这两个概念。

代码演示

基本使用

基本使用。

Transfer穿梭框 - 图1

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { Transfer, Switch } from 'choerodon-ui/pro';
  4. function handleChange(value, oldValue) {
  5. console.log('[basic new]', value, '[basic old]', oldValue);
  6. }
  7. const { Option } = Transfer;
  8. class App extends React.Component {
  9. state = { disabled: false };
  10. handleDisableChange = value => this.setState({ disabled: value });
  11. render() {
  12. return (
  13. <div>
  14. <Switch onChange={this.handleDisableChange}>disabled</Switch>
  15. <br />
  16. <Transfer onChange={handleChange} disabled={this.state.disabled} titles={['Source', 'Target']}>
  17. <Option value="jack">Jack</Option>
  18. <Option value="lucy">Lucy</Option>
  19. <Option value="wu">Wu</Option>
  20. </Transfer>
  21. </div>
  22. );
  23. }
  24. }
  25. ReactDOM.render(
  26. <App />,
  27. document.getElementById('container')
  28. );

受控穿梭框

受控穿梭框。

Transfer穿梭框 - 图2

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { Transfer } from 'choerodon-ui/pro';
  4. const { Option } = Transfer;
  5. class App extends React.Component {
  6. constructor(props) {
  7. super(props);
  8. this.state = {
  9. value: 'wu',
  10. };
  11. }
  12. handleChange = (value, oldValue) => {
  13. console.log('[constrolled]', 'newValue', value, '[oldValue]', oldValue);
  14. this.setState({
  15. value,
  16. });
  17. }
  18. render() {
  19. return (
  20. <Transfer value={this.state.value} onChange={this.handleChange}>
  21. <Option value="jack">Jack</Option>
  22. <Option value="lucy">Lucy</Option>
  23. <Option value="wu">Wu</Option>
  24. </Transfer>
  25. );
  26. }
  27. }
  28. ReactDOM.render(
  29. <App />,
  30. document.getElementById('container')
  31. );

绑定数据源

绑定数据源。

Transfer穿梭框 - 图3

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { DataSet, Transfer, Row, Col } from 'choerodon-ui/pro';
  4. function handleDataSetChange({ record, name, value, oldValue }) {
  5. console.log(
  6. '[dataset newValue]',
  7. value,
  8. '[oldValue]',
  9. oldValue,
  10. '[record.get(name)]',
  11. record.get(name),
  12. );
  13. }
  14. const { Option } = Transfer;
  15. const optionData = [
  16. { text: 'Jack', value: 'jack' },
  17. { text: 'Zhangsan', value: 'zhangsan' },
  18. { text: 'Lucy', value: 'lucy' },
  19. { text: 'Niu', value: 'jiaqin' },
  20. { text: 'Shao', value: 'shao' },
  21. ];
  22. const data = [
  23. {
  24. 'first-name': 'zhangsan',
  25. 'last-name': 'wu',
  26. },
  27. ];
  28. class App extends React.Component {
  29. optionDs = new DataSet({
  30. data: optionData,
  31. selection: 'single',
  32. });

值列表代码

值列表代码。

Transfer穿梭框 - 图4

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { DataSet, Transfer, Button, Row, Col } from 'choerodon-ui/pro';
  4. function handleDataSetChange({ record, name, value, oldValue }) {
  5. console.log('[dataset newValue]', value, '[oldValue]', oldValue, `[record.get('${name}')]`, record.get(name));
  6. }
  7. class App extends React.Component {
  8. flag = false;
  9. ds = new DataSet({
  10. autoCreate: true,
  11. fields: [
  12. { name: 'sex', type: 'string', lookupCode: 'HR.EMPLOYEE_GENDER', defaultValue: 'F' },
  13. { name: 'sex2', type: 'string', lookupUrl: '/common/code/HR.EMPLOYEE_GENDER/' },
  14. { name: 'lov', type: 'string', lovCode: 'LOV_CODE', defaultValue: 'SYS.PROFILE_LEVEL_ID' },
  15. { name: 'lov2', type: 'string', lovCode: 'LOV_CODE', defaultValue: ['SYS.PROFILE_LEVEL_ID', 'SYS.RESOURCE_TYPE'], multiple: true },
  16. ],
  17. events: {
  18. update: handleDataSetChange,
  19. },
  20. });
  21. changeLookupCode = () => {
  22. this.flag = !this.flag;
  23. this.ds.getField('sex').set('lookupCode', this.flag ? 'SYS.USER_STATUS' : 'HR.EMPLOYEE_GENDER');
  24. };
  25. render() {
  26. return (
  27. <Row gutter={10}>
  28. <Col span={18}>
  29. <Transfer dataSet={this.ds} name="sex" placeholder="请选择" />
  30. </Col>
  31. <Col span={6}>
  32. <Button onClick={this.changeLookupCode}>修改lookupCode</Button>
  33. </Col>
  34. <Col span={24}>
  35. <Transfer dataSet={this.ds} name="sex2" placeholder="请选择" />
  36. </Col>
  37. <Col span={24}>
  38. <Transfer dataSet={this.ds} name="lov" placeholder="请选择" />
  39. </Col>
  40. <Col span={24}>
  41. <Transfer dataSet={this.ds} name="lov2" placeholder="请选择" />
  42. </Col>
  43. </Row>
  44. );
  45. }
  46. }
  47. ReactDOM.render(
  48. <App />,
  49. document.getElementById('container')
  50. );

可搜索

可搜索。

Transfer穿梭框 - 图5

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { DataSet, Transfer } from 'choerodon-ui/pro';
  4. function handleDataSetChange({ record, name, value, oldValue }) {
  5. console.log(
  6. '[searchable]',
  7. value,
  8. '[oldValue]',
  9. oldValue,
  10. `[record.get('${name}')]`,
  11. record.get(name),
  12. );
  13. }
  14. const { Option } = Transfer;
  15. const data = [
  16. {
  17. 'last-name': 'zhangsan',
  18. },
  19. ];
  20. class App extends React.Component {
  21. ds = new DataSet({
  22. data,
  23. fields: [{ name: 'last-name', type: 'string', label: '姓' }],
  24. events: {
  25. update: handleDataSetChange,
  26. },
  27. });
  28. render() {
  29. return (
  30. <Transfer dataSet={this.ds} name="last-name" searchable>
  31. <Option value="jack">Jack</Option>
  32. <Option value="lucy">Lucy</Option>

单选

单选。

Transfer穿梭框 - 图6

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import { Transfer, Switch } from 'choerodon-ui/pro';
  4. function handleChange(value, oldValue) {
  5. console.log('[basic new]', value, '[basic old]', oldValue);
  6. }
  7. const { Option } = Transfer;
  8. ReactDOM.render(
  9. <Transfer multiple={false} onChange={handleChange}>
  10. <Option value="jack">Jack</Option>
  11. <Option value="lucy">Lucy</Option>
  12. <Option value="wu">Wu</Option>
  13. </Transfer>,
  14. document.getElementById('container')
  15. );

API

Transfer

更多属性请参考 Select

Transfer.OptGroup

参数说明类型
label选项组标题string

Transfer.Option

参数说明类型
value选项值any