
好像就喜欢配置写法。。,为什么呢?
另外,我想吐槽下,Dropdown 组件在 table 中太难用了,试了好多次才拿到每行的数据...
官方 demo:
const handleMenuClick = (e) => { message.info('Click on menu item.'); console.log('click', e); }; const items = [ { label: '1st menu item', key: '1', icon: <UserOutlined />, }, { label: '2nd menu item', key: '2', icon: <UserOutlined />, }, { label: '3rd menu item', key: '3', icon: <UserOutlined />, danger: true, }, { label: '4rd menu item', key: '4', icon: <UserOutlined />, danger: true, disabled: true, }, ]; const menuProps = { items, onClick: handleMenuClick, }; <Dropdown menu={menuProps}> <Button> <Space> Button <DownOutlined /> </Space> </Button> </Dropdown> 我的 demo:
const handleMenuClick = (e, record) => { console.log('e', e) console.log('record', record) if (e.key === 'updateRole') { handleShowUpdateRoleDialog(record.adminId) } if (e.key === 'edit') { handleShowEditDialog(record.adminId) } if (e.key === 'resetPassword') { handleShowResetPasswordDialog(record.adminId) } if (e.key === 'delete') { handleShowDeleteDialog(record.adminId) } } const items = [ { label: '分配角色', key: 'updateRole', }, { label: '编辑', key: 'edit', }, { label: '重置密码', key: 'resetPassword', danger: true, }, { label: '删除', key: 'delete', danger: true, }, ] // 点击下拉事件 const getMenuProps = (record) => { return { items, onClick: (e) => handleMenuClick(e, record), } } <Table dataSource={userList} rowKey={(record) => record.adminId} pagination={false} loading={loading} > <Column title="编号" dataIndex="adminId"></Column> <Column title="账号" dataIndex="username"></Column> <Column title="昵称" dataIndex="nickName"></Column> <Column title="邮箱" dataIndex="email"></Column> <Column title="添加时间" dataIndex="createTime" render={(_, record) => record.createTime ? dayjs(record.createTime).format('YYYY-MM-DD HH:mm:ss') : '-' } /> <Column title="最后登录" dataIndex="loginTime" render={(_, record) => record.loginTime ? dayjs(record.loginTime).format('YYYY-MM-DD HH:mm:ss') : '-' } /> <Column title="是否启用" dataIndex="activeState" render={(_, record) => ( <Switch checked={record.activeState == 1} OnClick={(checked) => { updateState(record.adminId, checked ? 1 : 0) }} /> )} /> <Column title="操作" render={(text, record) => ( <Dropdown menu={getMenuProps(record)}> <Button> <Space> 操作 <DownOutlined /> </Space> </Button> </Dropdown> )} /> </Table> 1 israinbow 2023-08-19 13:43:04 +08:00 JSX 是 "syntax extension to Javascript", 样例当然要用最小化实现也就是 Javascript 的语法来写. |
2 clue 2023-08-19 17:51:56 +08:00 你说的 jsx 是指用 jsx 的语法声明 columns 吗?第一次知道 antd 支持这样的写法 但我觉得不应该这样做,因为这里的 jsx columns 传给 Table 组件,最终也会被解析为配置。因为 Table 实际的内容是 thead>tr>th, tbody>tr>td 这些,这个特性其实还是有点违反我的直觉的。 |
3 Jtyczc OP @clue 对啊,可能我是新学 react ,真不习惯声明式写法,喜欢直接写 UI ,难道我走歪路了? |
4 linyongqianglal 2023-08-20 07:50:24 +08:00 不是,react 写法又多了一个?我对 react 的写法还停留在 hook |
5 Jtyczc OP @linyongqianglal #4 有什么区别吗,展示一下 demo |
6 theprimone 2023-08-21 09:24:30 +08:00 之前 antd 还有 Menu.Item 和 Select.Option 之类的组件的,看看老文档就知道了,这些其实都像 @clue 说的那样还要被父组件内部解析之后才能用,不如直接按定义来,性能还好一些。 |
7 duan602728596 2023-08-21 11:09:12 +08:00 因为不推荐用 jsx 配置的写法,以前很多组件的 jsx 配置都废弃并被推荐为直接 js 配置了 |
8 lichdkimba 2023-08-21 11:21:53 +08:00 Column 还可以这样定义?好像没见过 |
9 Redjue 2023-08-21 11:33:58 +08:00 主要还是考虑性能问题,jsx 实例化是很贵的,能减少就尽量减少。改成配置的话,内部可以直接 memo 缓存,性能会更好一些。 |
10 Wxh16144 2023-08-21 11:36:20 +08:00 正如 #2 和 #6 说的, 为了性能而作出的优化。将一些 SubComponents 改成 items 或者 options 的形式。 |
11 CHTuring 2023-08-21 13:30:40 +08:00 上面说性能的其实可以忽略不计,习惯性问题。 还有,有没有可能国外的组件库基本是用 SubComponents 的形式... |
12 opentrade 2023-08-21 17:27:51 +08:00 antd 版本升级太麻烦 |