leiwuhen-67's blog leiwuhen-67's blog
首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)

我的公众号

首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)
  • React

    • 使用React脚手架快速搭建项目
    • hooks之useEffect
    • React之事件绑定及简写方式
    • React之props传值并对其进行限制
    • React之Refs的基本使用
    • React之生命周期钩子
    • React之key的使用
    • React之代理服务器配置
    • React之封装全局Loading组件
    • React之消息的发布-订阅(pubsub-js)
    • React之Redux的基本使用
    • React之react-redux的基本使用
    • React之redux的数据持久化存储
    • React之路由懒加载
    • React之Render Props的使用
    • React之createBrowserRouter
    • React之路径别名@配置
    • React之craco打包优化配置
    • React之项目国际化
    • React之postcss-pxtorem移动端适配
    • React之使用vite创建项目
    • React之ts类型标注汇总
    • React之使用 ant design搭建后台管理之踩坑
    • React之路由切换动画
    • React之使用vite创建组件库并发布到npm
    • React之项目打包部署到nginx
    • React之自定义组件添加className与style
  • React Native

  • 《React》笔记
  • React
心欲无痕
2024-07-11

React之使用 ant design搭建后台管理之踩坑

最近,想着使用 ant design 搭一个后台管理的模板,中间踩了许多坑,特此记录下。

  • 1、登录的时候,需要点击按钮发送验证码,然后有 60 秒的倒计时功能,结果定时器是在跑,但是数字却没有变。
    原因:定时器在运行的同时,导致状态的变更,继而导致组件重新渲染,状态被重置了,如此循环反复,所以状态一直都是 60 没有变。
    解决办法:使用 ref 来保存状态
const count = useRef(60)
const [btnTxt, setBtnTxt] = useState("发送验证码");

const timer = setInterval(() => {
  count.current -= 1
  if (count.current <= 0) {
      setBtnTxt("重新发送")
      setIsSend(false)
      count.current = 60
      clearInterval(timer)
      return;
  }

  setBtnTxt(`${count.current}秒后重新发送`)
}, 1000)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

2、使用 ant design 的 Menu 组件设置出使选中和展开项时,静态写死是可以的,但是动态设置就不生效,或者要么出使选中跟展开是对的,再次点击就点击不了甚至报错。
原因:使用方法不对,初始展开应该用 openKeys 字段,选中应该用 selectedKeys 字段,并且必须搭配 onOpenChange 事件

/* 
	例如当前选中的导航数据是这样的
	findItem = {
		children: []
		parentid: 6
		resid: 62
		resourceattr: ""
		resourceicon: null
		resourcename: "用户列表"
		resourceurl: "/userList"
		sort: 1
	}
*/
const [defaultSelected, setSelectedKeys] = useState<any>([]);
const [defaultOpen, setOpenKeys] = useState<any>([]);

useEffect(() => {
  // .....这里先判断当前激活的是哪一个菜单项,然后再设置
  // 这里应该与菜单栏时的key数据类型对应,如果菜单栏的key是数值型,这里也应该是数值型
  setSelectedKeys([findItem.resid + ''])
  setOpenKeys([findItem.parentid + ''])
}, [])


<Menu
    selectedKeys = {defaultSelected}
    openKeys = {defaultOpen}
    onOpenChange = {e => setOpenKeys(e)}
    mode = "inline"
    theme = 'dark'
    items = {menuData}
/>
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

3、在 Form 表单组件中使用 Switch,无法设置默认值

const [form] = Form.useForm()

/*
	发送请求拿到数据,并赋值,此时请求返给的isdisable值为0或1,0选中,1未选中
	所以需要先将isdisable的值转换一下
	Form.Item 默认绑定值属性到 value 上,而 Switch 的值属性为 checked。需要通过 valuePropName 来修改绑定的值属性。
 */ 
data.isdisable = data.isdisable === 0 ? true : false
form.setFieldsValue(data)

<Form
    form={form}
    labelCol={ { span: 4 } }
    initialValues={ { isdisable: form.getFieldValue('isdisable') } }
>
    <Form.Item
        label="状态"
        name="isdisable"
        valuePropName="checked">
        <Switch checkedChildren="启用" unCheckedChildren="禁用" />
    </Form.Item>
</Form>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

4、在 Tree 组件中,使用 expandedKeys 后,点击父节点无法收起
解决办法,需要搭配 onExpand 事件一起使用

const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([])
const [treeData, setTreeData] = useState<any[]>([])

<Tree
    blockNode={true}
    draggable
    expandedKeys={expandedKeys}
    treeData={treeData}
    onExpand={(expandedKeys: React.Key[]) => {
        setExpandedKeys(expandedKeys)
    }}
></Tree>
1
2
3
4
5
6
7
8
9
10
11
12

5、由于 Ant Design 默认文案是英文的,如果需要切换语言,需要自行配置,好在其提供了 ConfigProvider 组件可以全局配置

import zhCN from 'antd/locale/zh_CN';
// for date-picker i18n
import 'dayjs/locale/zh-cn';

return (
  <ConfigProvider locale={zhCN}>
    <App />
  </ConfigProvider>
);
1
2
3
4
5
6
7
8
9

照着官方文档一顿操作,不出意外的话,意外就要出现了,报错了,我这里使用的是 vite 构建工具,当我引入中文包后,就一直报错,ERR_ABORTED 504 (Outdated Optimize Dep),解决该错误,需要通过配置优化选项来解决,在 vite.config.ts 中增加如下配置

optimizeDeps: {
  include: ['antd/locale/zh_CN'],
},
1
2
3
编辑 (opens new window)
上次更新: 3/4/2025, 5:46:30 PM
React之ts类型标注汇总
React之路由切换动画

← React之ts类型标注汇总 React之路由切换动画→

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式