react ant protable自定义实现搜索下拉框
作者:Sunny_Future
react ant protable自定义搜索下拉框
背景
select选择框很常见,这里实现 react ant protable实现自定义搜索下拉框
coding
const [selectEnum, setSelectEnum] = useState({}); const asyncFetch = () => { fetch('https://localhost/api/search_list') .then((response) => response.json()) .then((json) => setSelectEnum(json.data)) .catch((error) => { console.log('fetch data failed', error) }); }; // 页面刷新,自动发一次请求 useEffect(() => { asyncFetch() }, []); // 防抖搜索设备 const handleSearch = debounce((val)=> { const dispatch = async (params) => { console.log("params=", params) const data = await post("https://localhost/api/search_list", { body: params }) if (data) { setSelectEnum(data) } return { data: Array.from(data), success: true, } } dispatch({ search_key_worlds: val }).then() }, 1000) const columns = [ { title: "bookName", dataIndex: "bookName", hiddenInTable: true, initialValue: "Nginx大全", renderFormItem: () =>{ // let list = [{"id": 0, "name": "Nginx大全"}, {"id": 1, "name": "Java从入门到精通"}] let list = Array.from(selectEnum); const options = list.map(item => <option key={item.id}>{item.name}</option>); return ( <Select key="searchSelcet" showSearch placeholder="请输入关键字搜索" filterOption={false} onSearch={handleSearch} > { <> <option key="" value="">全部</option> </> } {options} </Select> ) } } ]
antd react ProTable 基本使用
antd 全称 Ant Design, 是目前来说运用最广泛的 react 的 ui 框架, 下文就用略写 antd 代替了
pro系列不做过多解释, 毕竟ui框架大家也都得心应手了, 好好看文档几乎没毛病
个人分析
- 优势:antd react确实是非常强大的ui框架, 其中的内容包含了前端几乎所有的ui, 运用此框架几乎可以不用写css样式
- 劣势:学习难度大, 网上教程相对较少, 一遇到bug, 比较难解决
安装
1.安装 antd
yarn add antd
2.安装 pro-table 系列
官方网址: https://procomponents.ant.design/docs/getting-started
yarn add @ant-design/pro-table // or cnpm i @ant-design/pro-table --save // 其他pro系列安装 npm i @ant-design/pro-form --save npm i @ant-design/pro-layout --save npm i @ant-design/pro-table --save npm i @ant-design/pro-list --save npm i @ant-design/pro-descriptions --save npm i @ant-design/pro-card --save npm i @ant-design/pro-skeleton --save
这里要注意 antd 的版本问题, 最好采用4.0以上的版本分享下我现在使用的版本,
react版本 react@17.0.2 | MIT | deps: 2 | versions: 739 // npm info react
node版本 v16.4.2 // node -v
yarn版本 1.22.11 // yarn -version
dva版本 dva-cli version 0.10.1 // dva -v
nmi版本 ^2.9.0 // umi -v
antd版本 4.8.0
温馨提示: 一般antd安装之后, 普通的ui插件都能使用, 安装pro后引用就报错, 建议先替换antd版本, 直接在package.json中修改antd的版本, 然后删除node_modules内的文件, 重新 cnpm install 或者 yarn install
常用字段
1.columns 数组 表格列的配置描述 (下图红框内的配置)
columns = [ { title:'名称',// (必填) 显示名称 dataIndex:'name',// (必填) 根据后台接口, 需要显示的字段 width:48,// (选填) 展示的宽度 valueEnum: {// (选填) 选择某个选项, 点击查询按钮可查询, valueEnum 可展示单选框 status可不填 0: { text: '全部', status: 'Default' }, 1: { text: '关闭', status: 'Default' }, 2: { text: '运行中', status: 'Processing' }, 3: { text: '已上线', status: 'Success' }, 4: { text: '异常', status: 'Error' }, all:{ text: '全选' } }, initialValue: 1,// (选填) valueEnum的默认值 render: (_) => <a>{_}</a>,// (选填) 不在搜索时使用, 可嵌套标签展示数据, 多用于三目运算符展示比较复杂的数据 filterDropdown: () => (// (选填) 添加搜索条件, 此处以搜索框为例, 在表头和表格上方均有筛选条件 <div style={{ padding: 8 }}> <Input style={{ width: 188, marginBottom: 8, display: 'block' }} /> </div> ), filterIcon: (filtered) => (// (选填) 有搜索时, 可重新定义表头中的搜索icon <SearchOutlined style={{ color: filtered ? '#1890ff' : undefined }} /> ), filters: [{text:'全选',value:'all'}],// (选填) 对某一列数据进行筛选,使用列的 filters 属性来指定需要筛选菜单的列 onFilter: (value, record) => record.name.indexOf(value) === 0,// (选填) 用于筛选当前数据 defaultSortOrder:'ascend', // (选填) 默认排列顺序 ascend | descend valueType: 'money', // (选填) 值的类型,会生成不同的渲染器 (举例为金额) } ]
2.request 请求接口查询数据
getData方法内容
getData = (params)=>{ const { dispatch } = this.props; dispatch({ type: 'login/login', payload: { params }, callback: (res) => { console.log(res) }, }); }
3.dataSource 表格展示的数据, 如下面例子
// 使用 dataSource={[]} [{"key":0,"name":"AppName","containers":11,"creator":"付小小","status":"running","createdAt":1641364688922,"money":0,"progress":47,"memo":"简短备注文案"},{"key":1,"name":"AppName","containers":3,"creator":"林东东","status":"close","createdAt":1641364687979,"money":1538,"progress":8,"memo":"很长很长很长很长很长很长很长的文字要展示但是要留下尾巴"},{"key":2,"name":"AppName","containers":0,"creator":"曲丽丽","status":"close","createdAt":1641364688524,"money":1258,"progress":69,"memo":"简短备注文案"},{"key":3,"name":"AppName","containers":12,"creator":"林东东","status":"close","createdAt":1641364688493,"money":4530,"progress":14,"memo":"很长很长很长很长很长很长很长的文字要展示但是要留下尾巴"},{"key":4,"name":"AppName","containers":18,"creator":"曲丽丽","status":"close","createdAt":1641364687837,"money":3432,"progress":65,"memo":"简短备注文案"}]
4.pagination 分页器
pagination={{ pageSize:2,// 每页条数 showQuickJumper: true,// 是否可以快速跳转至某页 (就是那个输入框) // pageSizeOptions:[5,10,20,30,50,100], 指定每页可以显示多少条 // position: 'bottom' // 'top' 分页器显示位置 }}
5.toolbar 表格的标题
toolbar={{ title: '高级表格', tooltip: '这是一个标题提示', }}
6.toolBarRender 表格表头上方的按钮群
toolBarRender={() => [ <Button key="danger" danger> 危险按钮 </Button>, <Button key="show">查看日志</Button>, <Button type="primary" key="primary"> 创建应用 </Button>, <Dropdown key="menu" overlay={menu}> <Button> <EllipsisOutlined /> </Button> </Dropdown>, ]}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。