1、需求
最近遇到一个需求,一张表格中需要有个下拉框,antd官网中有相应的Select组件,但是由于数据比较多,用户需要一个全选的需求。即点击全选下拉框数据全部选中,再次点击取消全选即选中的数据清空。然后数据一条一条点击完后全选框会被选中,反之不会被选中。
2、实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| import React from 'react'; import 'antd/dist/antd.css'; import './index.css'; import { Form, Select, Checkbox, Divider } from 'antd';
class Domo extends React.Component { formRef = React.createRef(); constructor(props) { super(props); this.state = { selectStatus: false, selectData: '', }; }
render() { const data = []; for (let i = 0; i < 12; i++) { const value = `${i.toString(36)}${i}`; data.push({ label: value, value }); } const { selectStatus } = this.state; return ( <> <Form ref={this.formRef}> <Form.Item name="selectOptions"> <Select mode="multiple" placeholder="please choose" allowClear options={data} onChange={(value) => { this.setState({ selectData: value.join(',') }); if (value.length === data.length) { this.setState({ selectStatus: true }); } else { this.setState({ selectStatus: false }); } }} dropdownRender={(menu) => ( <> <div style={{ padding: '4px 8px 8px 12px', cursor: 'pointer' }} > <Checkbox checked={selectStatus} onChange={(e) => { const a = data.map((item) => item.value); if (e.target.checked) { this.setState({ selectStatus: true, selectData: a.join(','), }); this.formRef.current.setFieldsValue({ selectOptions: data?.map((item) => item.value), }); } else { this.setState({ selectStatus: false, selectData: '', }); this.formRef.current.setFieldsValue({ selectOptions: [], }); } }} > 全选 </Checkbox> </div> <Divider style={{ margin: '0' }} /> {menu} </> )} ></Select> </Form.Item> </Form> <h3 style={{ position: 'fixed', bottom: '100px' }}> 选择的数据是:{this.state.selectData} </h3> </> ); } }
export default Domo;
|
3、效果预览
react antd select组件添加全选功能