React 项目结合 Antd 的按需加载不起作用

项目由 create-react-app 创建,按需加载组件需配置。按官网步骤配置,npm start 报错,原因是 2.0+ 版本弃用该方法。解决办法是安装 npm i customize-cra -D,在 config-overrides.js 中重新导入。使用 less 或 css 也有相应配置方法。

背景:

项目由 create-react-app 创建的,按照官网的要求,如果按需加载组件,需要加一些配置。我没有通过 .babelrc 或者 babel-loader,而是根据官网的 react-app-rewired

问题:

根据官网的步骤进行配置,当 npm start 的时候就会报错,如图:

The "injectBabelPlugin" helper has been deprecated as of v2.0. You can use customize-cra plugins in replacement - https://github.com/arackaf/customize-cra#available-plugins
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

报错原因是 2.0+ 版本已经弃用该方法

解决:

这里需要安装 npm i customize-cra -D

然后再 config-overrides.js 中重新导入,如下:

const {
  override,
  fixBabelImports,
  addLessLoader
}  = require('customize-cra')

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: "es",
    style: true
  }),
  addLessLoader({
    javascriptEnabled: true
  })
)

再 npm start 就能正常加载组件而不需要单独引入 css 了。

注:

我用的是 less,如果想用 less, 需要 npm i less less-loader

如果想用 css,只要将 style: true 改成 style: 'css' 即可,不需要引入 addLessLoader。

<think>嗯,用户这次的问题是关于在React中实现AntDesign按钮的加载效果。从引用内容来看,用户显然已经掌握了AntDesign的基本使用方法(如引用[1][2]展示的按钮引入方式),现在需要进阶的交互效果实现。用户可能正在开发需要异步操作的功能,比如表单提交或数据加载,这时候按钮的加载状态就很重要了。用户之前的问题涉及AntDesign配置(如引用[2]的按需加载)和动态图标(引用[3]),说明用户对AntDesign有一定深度使用经验。注意到引用[4]提到ChatGPT风格界面,用户可能在开发类似实时交互系统,这类场景下按钮加载状态尤其关键。用户没有提后端实现,应该专注解决前端交互问题。技术实现上其实AntDesign的Button组件原生支持loading属性,这个在文档里有明确说明。但用户可能没注意到两点:一是如何动态切换状态(需要结合React的useState),二是如何与异步操作集成(需要处理请求前后状态)。引用中的图标动态加载示例(引用[3])虽然高级,但原理相通——都是状态管理。考虑到用户使用的是现代React(引用[1][2]都展示函数组件),应该用Hooks方案而非class组件。特别要提醒防重复点击问题,这在生产环境很重要。引用[4]的模拟接口思路也可以借鉴,但用户这次只需要前端实现。代码示例需要包括:1)基础加载状态切换,2)模拟异步请求集成,3)防抖处理。类型提示用TypeScript写但注明JS用法,这样对TS和JS用户都友好。另外要解释loading属性的三种赋值方式,因为用户可能遇到传值类型问题。相关延伸问题要考虑用户可能的后续需求,比如定制加载图标(引用[3]的方案可以迁移)、不同场景的加载状态管理(如多按钮协同),这些都是用户完成基础功能后可能需要的进阶功能。</think> 在 React 中使用 Ant Design(Antd)实现按钮的点击加载效果非常简单,只需要使用 `Button` 组件的 `loading` 属性配合 React 的状态管理即可。以下是完整实现步骤: --- ### **具体实现方法** 1. **引入必要的模块** ```jsx import React, { useState } from 'react'; import { Button } from 'antd'; ``` 2. **使用 `useState` 管理加载状态** 通过 React 状态控制按钮的加载状态 `isLoading`: ```jsx const [isLoading, setIsLoading] = useState(false); ``` 3. **绑定按钮事件和状态** 将 `loading={isLoading}` 绑定到按钮,并在点击事件中更新状态: ```jsx const handleClick = () => { setIsLoading(true); // 点击后显示加载图标 // 模拟异步请求(如 API 调用) setTimeout(() => { setIsLoading(false); // 请求完成后关闭加载状态 }, 2000); // 2秒后关闭 }; return ( <Button type="primary" loading={isLoading} onClick={handleClick} > 提交数据 </Button> ); ``` --- ### **完整代码示例** ```jsx import React, { useState } from 'react'; import { Button } from 'antd'; const LoadButtonExample = () => { const [isLoading, setIsLoading] = useState(false); const handleSubmit = () => { setIsLoading(true); // 模拟后端请求(实际项目中替换为 fetch/axios) new Promise(resolve => setTimeout(resolve, 1500)) .then(() => { console.log("操作完成"); setIsLoading(false); }); }; return ( <Button type="primary" loading={isLoading} onClick={handleSubmit} > {isLoading ? "处理中..." : "确认提交"} </Button> ); }; export default LoadButtonExample; ``` --- ### **关键说明** 1. **`loading` 属性** - 值为 `true` 时显示加载图标,禁用按钮。 - 值为 `false` 时恢复正常状态。 2. **动态文字(可选)** 通过条件渲染修改按钮文字(如示例中的 `{isLoading ? "处理中..." : "确认提交"}`)。 3. **实际应用** 在真实项目中,将 `setTimeout` 替换为异步请求(如 `fetch` 或 `axios`),在请求开始和结束时更新 `isLoading` 状态即可[^4]。 --- ### **相关问题** 1. **如何定制加载图标?** Antd 默认使用 `<LoadingOutlined />`,可通过 `icon` 属性替换为自定义图标[^3]。 2. **如何防止重复提交?** `loading` 状态会自动禁用按钮,天然避免重复点击。 3. **在表单中如何配合验证使用?** 在 `Form.onFinish` 中设置状态,示例: ```jsx <Form onFinish={(values) => { setIsLoading(true); submitData(values).then(() => setIsLoading(false)); }}> <Button htmlType="submit" loading={isLoading}>提交</Button> </Form> ``` 4. **如何在TS中定义类型?** 添加类型标注: ```tsx const [isLoading, setIsLoading] = useState<boolean>(false); ``` > 提示:Antd 的 `Button` 组件已对加载状态做了完整的视觉和交互优化,无需额外样式调整[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值