Part3.框架原理洞察:React 进阶应用与实战演练(4/5)
React 自定义组件库封装实践
封装 React 自定义组件库是一个很有价值的过程,既可以提高代码的复用性,也可以在多个项目之间共享相同的组件。以下是一个详细的步骤和结构指导,帮助你创建一个 React 自定义组件库。
1. 环境准备
首先,确保你的开发环境中已经安装了以下工具:
- Node.js: 推荐使用最新的 LTS 版本。
- NPM или Yarn: 用于包管理。
2. 创建项目
在终端中执行以下命令创建一个新的项目:
mkdir my-component-library
cd my-component-library
npm init -y
这将创建一个新的目录,并初始化一个新的 package.json 文件。
3. 安装必要的依赖
接下来,安装 React 和 ReactDOM,以及开发过程中需要的工具,如 Babel 和 Webpack:
npm install react react-dom
npm install --save-dev babel-loader @babel/core @babel/preset-env @babel/preset-react webpack webpack-cli
4. 配置 Babel
在项目根目录下创建一个名为 .babelrc 的文件,配置 Babel:
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
5. 配置 Webpack
创建一个名为 webpack.config.js 的文件,并配置 Webpack:
const path = require('path');
module.exports = {
mode: 'production',
entry: './src/index.js', // 组件库的入口文件
output: {
path: path.resolve(__dirname, 'dist'), // 输出目录
filename: 'index.js', // 输出文件名
library: 'MyComponentLibrary', // 组件库名称
libraryTarget: 'umd', // 支持通用模块定义
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
},
],
},
resolve: {
extensions: ['.js', '.jsx'],
},
};
6. 创建组件
在 src 目录中创建你的组件。例如,创建一个简单的按钮组件 Button.js:
// src/Button.js
import React from 'react';
const Button = ({ onClick, children }) => {
return (
<button onClick={onClick} style={{ padding: '10px 20px', fontSize: '16px' }}>
{children}
</button>
);
};
export default Button;
同时,创建一个 index.js 作为入口文件:
// src/index.js
import Button from './Button';
export { Button };
7. 构建组件库
在 package.json 文件中添加构建脚本:
"scripts": {
"build": "webpack"
}
执行构建命令:
npm run build
构建成功后,你会在 dist 文件夹中找到 index.js 文件,这就是你的组件库。
8. 使用组件库
为了在其他项目中使用你的组件库,你可以通过以下方式:
-
本地链接(适合开发中): 在组件库的根目录下运行:
npm link然后在目标项目中运行:
npm link my-component-library -
发布到 npm: 如果你希望其他人能够使用你的组件库,需要将其发布到 npm。
- 确保你的
package.json中包含了必要信息(如 name、version、description、main)。 - 登录到 npm(如果尚未登录):
npm login- 发布组件库:
npm publish - 确保你的
9. 组件库的文档
一个好的组件库应该具有良好的文档。可以使用 Storybook 来创建组件的文档和示例,帮助用户理解如何使用你的组件。
10. 示例项目结构
以下是你组件库的示例项目结构:
my-component-library/
├── dist/ # 构建输出目录
│ └── index.js
├── src/ # 组件源代码
│ ├── Button.js
│ └── index.js
├── .babelrc # Babel 配置
├── package.json # npm 配置
└── webpack.config.js # Webpack 配置
11. 组件库的最佳实践
- 编写单元测试:使用 Jest 和 React Testing Library 编写单元测试,确保组件的功能正常。
- 使用 TypeScript:如果你的项目支持,考虑使用 TypeScript 来提高类型安全。
- 文档:保持代码的良好注释,并为每个组件提供全面的文档。
- 版本管理:为你的组件库使用 Semantic Versioning 来管理版本。
通过这些步骤,你将能够创建并封装一个完整的 React 自定义组件库,能够与其他项目进行共享和重用。希望这个指南能够帮助你开始!如果你有进一步的具体问题或需要更深入的细节,随时询问!
React 组件性能优化策略
性能优化在 React 中非常重要,尤其是在构建大型应用时,合理的优化策略可以显著提高用户体验和应用响应速度。以下是一些关键的性能优化技巧和策略:
1. 减少不必要的渲染
a. 使用 React.memo
对于函数组件可以使用 React.memo 来避免不必要的渲染:
const MyComponent = React.memo((props) => {
// 组件逻辑
});
如果组件的 props 没有变化,React.memo 将会阻止该组件的重新渲染。
b. 使用 PureComponent 和 shouldComponentUpdate
对于类组件,可以使用 PureComponent 或重写 shouldComponentUpdate 方法来手动控制渲染:
class MyComponent extends React.PureComponent {
// 该组件将在 props 或 state 没有变化时跳过渲染
}
2. 优化 State 管理
a. 最小化 State
保持组件的 state 尽可能小,避免存储计算得到的值,而是通过 props 或直接计算来获取:
// 不推荐
this.setState({ computedValue: someComplexCalculation(this.state.value) });
// 推荐
const computedValue = someComplexCalculation(this.state.value);
b. 分大组件为小组件
将大组件拆分为小组件,每个小组件只管理自己的 state,这样可以减少不必要的渲染。
3. 使用惰性加载(Code Splitting)
通过代码分割,将大型应用拆分成多个小包,按需加载,提高初始加载性能。可以使用 React.lazy 和 React.Suspense 来实现:
const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
return (
<React.Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</React.Suspense>
);
}
4. 事件处理性能优化
a. 使用函数的引用
对于事件处理函数,最佳实践是将函数定义放在组件外部,或者使用绑定,以避免每次渲染时都创建新函数:
class MyComponent extends React.Component {
handleClick = () => {
// 点击处理逻辑
};
render() {
return <button onClick={this.handleClick}>Click me</button>;
}
}
5. 使用 useCallback 和 useMemo
在函数组件中,使用 useCallback 和 useMemo 来缓存函数和计算结果,避免不必要的调用和计算:
const handleClick = useCallback(() => {
// 处理点击
}, [/* 依赖项 */]);
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
6. 虚拟化长列表
对于需要渲染大量数据的列表,使用组件如 react-window、react-virtualized 进行虚拟化,只渲染可视区域内的项目,显著提高性能:
import { FixedSizeList as List } from 'react-window';
<List
height={150}
itemCount={1000}
itemSize={35}
width={300}>
{({ index }) => <div>Row {index}</div>}
</List>
7. 避免深度嵌套的 props
避免深层嵌套的 props 传递,如果 props 的某部分发生变化,可能导致不必要的更新。使用上下文(Context API)或 Redux 等状态管理方案来共享数据。
8. 使用合成事件
React 内部使用合成事件来封装浏览器事件,这样可以避免在每次事件触发时创建新的事件对象,优化了性能。
9. 避免不必要的 API 调用
在组件加载时(如 componentDidMount 或 useEffect),通过设置适当的依赖项和使用条件逻辑来避免不必要的 API 调用:
useEffect(() => {
const fetchData = async () => {
const data = await fetchAPI();
setData(data);
};
fetchData();
}, [dependency]); // 只在 dependency 变化时调用
10. 使用 Server-Side Rendering (SSR)
如果适合你的应用场景,可以考虑使用 SSR,如 Next.js,这样可以在服务器上首次渲染 React 组件,从而减少客户端渲染的负担和提升加载速度。
11. 优化图片和资源加载
通过优化图片和其他资源的加载方式(如使用懒加载、压缩图片等)来提高页面性能。
12. 生产环境下的性能优化
确保在生产环境下使用压缩和优化的构建,比如使用 webpack、Terser 等工具来减小包体积。
结论
通过以上的性能优化技术,可以提升 React 应用的响应速度和用户体验。在开发过程中,持续监测性能并及时调整和优化是非常重要的。使用 React DevTools 等工具来分析和诊断应用的性能瓶颈也是很有帮助的。如果你还有其他具体问题,或希望了解更深入的性能优化技巧,欢迎继续提问!
受控与非受控组件选用准则
在 React 中,受控组件和非受控组件是两种处理用户输入的方法。了解这两者的区别及其适用场景,可以帮助你更好地选择合适的组件类型。以下是受控组件和非受控组件的定义、优缺点,以及选用标准。
受控组件
定义
受控组件是指其表单元素的值由 React 组件的 state 控制。输入框的值由 state 控制,组件通过事件回调更新 state。
示例
import React, { useState } from 'react';
const ControlledInput = () => {
const [value, setValue] = useState('');
const handleChange = (event) => {
setValue(event.target.value);
};
return (
<input type="text" value={value} onChange={handleChange} />
);
};
优缺点
-
优点:
- 更易于控制和验证用户输入。
- 可以随时访问和使用输入值,便于执行自定义逻辑。
- 与 React 组件体系高度一致,便于测试和维护。
-
缺点:
- 如果表单元素的数量非常多,可能会导致性能下降,因为每次输入都需要更新 state。
- 需要编写更多的代码来管理输入状态。
非受控组件
定义
非受控组件是指表单元素的值不由 React 组件的 state 控制,而是直接通过 DOM 管理。可以通过 ref 来获取当前的输入值。
示例
import React, { useRef } from 'react';
const UncontrolledInput = () => {
const inputRef = useRef(null);
const handleSubmit = () => {
alert(inputRef.current.value);
};
return (
<div>
<input type="text" ref={inputRef} />
<button onClick={handleSubmit}>Submit</button>
</div>
);
};
优缺点
-
优点:
- 适合简单的表单,减少了状态管理的复杂度。
- 可以与现有的表单库(如 jQuery)和第三方库更容易地集成。
- 性能更优,因为每次输入并不直接导致组件重渲染。
-
缺点:
- 难以控制和验证用户输入,因为输入值存储在 DOM 中。
- 难以与其他状态结合使用(例如,如果需要在提交时获取表单全局状态)。
- 不如受控组件易于测试。
选用标准
选择受控组件或非受控组件时,可以考虑以下因素:
-
表单的复杂度:
- 复杂表单:优先使用受控组件,便于管理状态和进行表单验证。
- 简单表单:可以使用非受控组件,减少代码量和复杂性。
-
实时反馈需求:
- 需要实时反馈:使用受控组件,因为可以立即反应用户输入。
- 不需要即时反馈:非受控组件即可满足需求。
-
与外部库集成:
- 如果与 DOM 操作频繁的库(如 jQuery)集成,非受控组件可能更加适合,便于操作现有的 DOM。
-
性能考虑:
- 性能敏感的应用:在输入频繁的情况下,非受控组件可能更优,因为不会因为每次输入而引起重渲染。
-
测试与维护:
- 可测试的逻辑:受控组件可以更方便地进行单元测试和调试,因为所有逻辑都集中在 React 组件内。
结论
选择受控组件或非受控组件主要取决于应用场景和需求。受控组件提供了一种更强大的方式来管理状态和验证用户输入,而非受控组件则适合简单、对性能要求较高的场景。最终,建议根据具体的需求和复杂度来选择合适的实现方式。
React 组件自动化测试指南
React 组件的自动化测试
背景
随着前端开发的复杂性不断增加,确保代码质量和稳定性变得尤为重要。自动化测试已成为现代软件开发流程中的重要一环,能够帮助开发者在代码更改后快速确认功能是否正常。React,作为一种广泛使用的前端库,具备组件化的特性,适合通过自动化测试来验证各个组件的功能。
原理
React 组件的自动化测试通常基于以下原理:
- 单元测试:测试组件的最小功能单元,确保每个组件按照预期工作。
- 集成测试:测试多个组件之间的交互,验证系统的整体功能。
- 端到端测试(E2E):模拟用户与应用的交互,确保整个应用在真实环境中的表现。
测试工具
- Jest:一个 JavaScript 测试框架,支持快照测试和并行测试。
- React Testing Library:一个用于测试 React 组件的库,鼓励使用更接近用户的方式来测试组件。
- Enzyme:由 Airbnb 提供的一个用于测试 React 组件的工具,但由于 React Testing Library 更加符合 React 的设计理念,Enzyme 的使用逐渐减少。
特点
- 快速反馈:自动化测试可以在代码变更后迅速执行,减少手动测试时间。
- 可维护性:通过编写测试用例,可以文档化组件的预期行为,增强可维护性。
- 回归测试:在代码更新时可以重复执行,确保新功能不会引入旧问题。
- 提高开发信心:开发者可以在添加新功能时更加自信,因为有测试可以验证。
代码案例
下面是一个简单的 React 组件及其对应的测试用例。
示例组件
// Button.js
import React from 'react';
const Button = ({ onClick, label }) => {
return <button onClick={onClick}>{label}</button>;
};
export default Button;
测试用例
// Button.test.js
import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import Button from './Button';
test('renders button with correct label', () => {
const { getByText } = render(<Button label="Click Me" />);
const buttonElement = getByText(/Click Me/i);
expect(buttonElement).toBeInTheDocument();
});
test('calls onClick function when clicked', () => {
const handleClick = jest.fn();
const { getByText } = render(<Button label="Click Me" onClick={handleClick} />);
const buttonElement = getByText(/Click Me/i);
fireEvent.click(buttonElement);
expect(handleClick).toHaveBeenCalledTimes(1);
});
运行测试
在项目根目录中,可以使用以下命令运行测试:
npm test
参考资料
注意事项
- 测试独立性:确保每个测试用例相互独立,以便于快速定位问题。
- 覆盖率:虽然代码覆盖率不能完全代表测试质量,但适当地提高代码覆盖率可以帮助发现潜在问题。
- 持续集成:将自动化测试集成到持续集成(CI)流程中,以在每次提交时自动运行测试。
- Mocks 和 Stubs:在测试中使用 mocks 和 stubs 来隔离组件之间的依赖关系,确保测试的可靠性。
- 用户优先:测试用例应尽量模拟用户的真实操作,而不是仅仅检查组件内部实现。
通过合理地实施 React 组件的自动化测试,可以大大提升前端项目的质量与可维护性,为团队的长期发展提供坚实基础。
React 16.8 Hooks:用法与原理剖析
React 16.8 Hooks 特性的使用及实现原理分析
1. 引言
React 16.8 版本引入了 Hooks,旨在使函数组件能够使用状态和其他 React 特性。Hooks 的引入不仅简化了组件的状态管理,也提升了代码的可读性和可重用性。本文将介绍 React Hooks 的使用方式以及其实现原理。
2. React Hooks 的使用
2.1 使用基本 Hooks
2.1.1 useState
useState 是 React Hooks 中最基本的 Hook,用于在函数组件中添加状态。
import React, { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
return (
<div>
<p>当前计数:{count}</p>
<button onClick={() => setCount(count + 1)}>增加</button>
</div>
);
};
export default Counter;
2.1.2 useEffect
useEffect 用于处理副作用,比如数据获取、订阅和手动 DOM 操作。
import React, { useState, useEffect } from 'react';
const DataFetcher = () => {
const [data, setData] = useState([]);
useEffect(() => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => setData(data));
}, []); // 仅在组件挂载时运行一次
return (
<ul>
{data.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
};
export default DataFetcher;
2.2 自定义 Hooks
自定义 Hook 是一种提取组件逻辑的方式,可以让我们复用状态逻辑。
import { useState, useEffect } from 'react';
const useFetch = (url) => {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(url)
.then(response => response.json())
.then(data => {
setData(data);
setLoading(false);
});
}, [url]);
return { data, loading };
};
// 使用自定义 Hook
const CustomComponent = () => {
const { data, loading } = useFetch('https://api.example.com/data');
if (loading) return <p>Loading...</p>;
return (
<ul>
{data.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
};
export default CustomComponent;
3. Hooks 的实现原理
3.1 背景
在 React 的设计中,组件的状态和生命周期管理主要依赖于类组件。随着功能的增强,类组件的复杂性逐渐增加,导致代码难以维护。Hooks 的引入提供了一种新的方式来处理这些问题。
3.2 Hooks 的基本原理
- 函数组件:Hooks 只能在函数组件或者自定义 Hooks 中使用,这是为了保持 Hooks 调用的一致性。
- 调用顺序:Hooks 必须按照相同的顺序调用,以确保状态在每次渲染中的一致性。
- 闭包:Hooks 使用闭包来储存状态,允许我们在渲染之间保留状态信息。
3.3 useState 实现原理
useState 的核心原理是依赖 React 的内部调度机制来管理组件状态。每次组件更新时,React 会维护一个状态队列,确保所有的状态变化都能被记录。当 setState 被调用时,会触发组件的重新渲染。
- 使用示例:
function useState(initialValue) { const state = React.useInternalState(initialValue); return [state, (newState) => { // 调用 React 的调度机制 React.updateComponent(); }]; }
3.4 useEffect 实现原理
useEffect 的实现致力于管理“副作用”,并在组件更新后执行。React 会在渲染后执行所有的 useEffect 方法,确保副作用的正确执行。
- 使用示例:
function useEffect(callback, dependencies) { React.useInternalEffect(callback, dependencies); }
4. 总结
React 16.8 引入的 Hooks 特性为函数组件带来了强大的能力,简化了组件间逻辑的复用方式,维护性和可读性都得到了显著提升。通过了解 Hooks 的使用方式及其实现原理,开发者可以更加高效地开发 React 应用。
5. 参考资料
通过掌握 Hooks 的用法与原理,可以帮助开发者在日常工作中更好地利用 React,提高开发效率和代码质量。
CSS - in - JS 方案及 emotion 库解析
CSS-in-JS 方案及 Emotion 库
1. 引言
随着组件化前端框架(如 React、Vue等)的流行,CSS-in-JS 的方案逐渐成为前端开发中的一种主流方式。这种方式将样式与组件逻辑紧密结合,使得样式处理更具灵活性和可维护性。Emotion 是一种流行的 CSS-in-JS 库,专为提高 CSS 的可用性和性能而设计。
2. CSS-in-JS 简介
2.1 CSS-in-JS 的概念
CSS-in-JS 是一种编写 CSS 的方法,将样式直接写在 JavaScript 代码中,而不是单独的 CSS 文件中。通过这种方式,样式和组件的逻辑可以紧密结合,提供以下几个优势:
- 动态样式:可以根据组件的状态动态生成样式。
- 模块化:每个组件都可以有自己独立的样式,避免命名冲突。
- 可维护性:样式与组件逻辑在同一文件中,便于开发与管理。
- 主题管理:通过 JavaScript 来灵活控制样式和主题切换。
2.2 CSS-in-JS 的优势与劣势
优势
- 动态性:允许使用 JavaScript 变量和逻辑来控制样式。
- 性能优化:某些 CSS-in-JS 实现会在运行时优化样式,同时精简未使用的样式。
- 代码分割:按需加载样式,减少首屏加载时间。
劣势
- 学习成本:对于习惯传统 CSS 的开发者来说,可能需要适应新的语法。
- 调试复杂性:在浏览器开发者工具中,调试生成的样式可能不如传统 CSS 清晰。
- 性能问题:某些实现可能会有较高的运行时开销。
3. Emotion 库
3.1 Emotion 简介
Emotion 是一个强大的 CSS-in-JS 库,提供了高性能的样式解决方案,适用于 React 和其它框架。Emotion 的设计目标是使样式的编写变得简单,同时提供对性能的高度优化。
3.2 Emotion 的基本用法
Emotion 提供了几种不同的方式来编写样式:css 函数、styled 组件,以及 @emotion/react 和 @emotion/styled 包。
3.2.1 安装 Emotion
首先,安装 Emotion:
npm install @emotion/react @emotion/styled
3.2.2 使用 styled 组件
使用 styled 创建 styled 组件是一种常见的方式:
/** @jsxImportSource @emotion/react */
import React from 'react';
import styled from '@emotion/styled';
const Button = styled.button`
background-color: hotpink;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
&:hover {
background-color: darkviolet;
}
`;
const App = () => {
return <Button>Click me</Button>;
};
export default App;
3.2.3 使用 css 函数
你也可以使用 css 函数来定义样式:
/** @jsxImportSource @emotion/react */
import React from 'react';
import { css } from '@emotion/react';
const buttonStyle = css`
background-color: hotpink;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
&:hover {
background-color: darkviolet;
}
`;
const App = () => {
return <button css={buttonStyle}>Click me</button>;
};
export default App;
3.3 Emotion 的特性
- 主题支持:Emotion 可轻松支持主题的切换,可利用
ThemeProvider提供全局主题。 - 嵌套选择器和伪类:支持各种 CSS 语法,比如嵌套、伪类等。
- CSS 优化:Emotion 在运行时会自动优化 CSS,减少冗余样式。
3.4 性能与优化
Emotion 提供了一些性能优化的技术:
- 服务器端渲染(SSR)支持:可以将样式提取到服务器端,提高首屏加载速度。
- 自动去重:在运行时,Emotion 会去掉不再使用的样式规则,减少最终生成的 CSS 大小。
- 动态生成的样式:通过 JS 逻辑计算样式,支持响应式设计。
4. 总结
CSS-in-JS 方案为前端开发带来了更大的灵活性和可维护性,而 Emotion 则是这种方案中的一种优秀实现。通过深入学习并使用 Emotion,开发者可以更有效地管理样式,提高项目的可维护性和性能。
5. 参考资料
随着前端技术的不断发展,CSS-in-JS 将继续演进,为开发者提供更好的体验和工具。
Chakra - UI:现代化 React UI 框架
现代化 React 应用 UI 框架:Chakra-UI
1. 引言
Chakra-UI 是一个流行的 React 组件库,旨在帮助开发者快速构建现代化的用户界面。它提供了一套灵活、可定制的组件,能够帮助开发者在不牺牲可访问性的前提下创建美观的一致的界面。Chakra-UI 的设计理念是“功能优先,样式简洁”,非常适合构建响应式和主题化的应用。
2. 特性
2.1 易于使用
Chakra-UI 采用简单的 API 设计,允许开发者快速上手。在组件上直接使用属性即可自定义样式,无需深入学习复杂的样式系统。
2.2 可定制性
Chakra-UI 提供了一套主题系统,允许开发者自定义色彩、间距、字体和其他样式。开发者可以通过主题提供的 API 灵活配置组件的外观以适应应用的需求。
2.3 组件库
Chakra-UI 提供大量的基础组件,涵盖按钮、表单、模态框、通知等,帮助开发者快速构建用户界面。所有组件都经过设计,以确保良好的可用性和可访问性。
2.4 响应式设计
通过 Styled System,Chakra-UI 组件支持响应式设计,允许根据视口大小自定义样式,帮助开发者轻松创建适配各种屏幕尺寸的应用。
2.5 可访问性
Chakra-UI 的组件遵循 WAI-ARIA 标准,确保构建的 UI 符合可访问性要求,使得使用屏幕阅读器的用户能够轻松使用。
3. 安装与基本用法
3.1 安装 Chakra-UI
要在你的 React 项目中使用 Chakra-UI,可以通过 npm 或 yarn 安装:
npm install @chakra-ui/react @emotion/react @emotion/styled framer-motion
3.2 配置 ChakraProvider
使用 Chakra-UI 之前,需要在应用根组件中包裹 ChakraProvider:
import React from 'react';
import { ChakraProvider } from '@chakra-ui/react';
import App from './App';
const Main = () => (
<ChakraProvider>
<App />
</ChakraProvider>
);
export default Main;
3.3 使用组件
Chakra-UI 的使用非常直观,以下是一个简单的例子:
import React from 'react';
import { Button, Box, Text } from '@chakra-ui/react';
const App = () => {
return (
<Box p={4}>
<Text fontSize="xl" mb={4}>
Welcome to Chakra UI!
</Text>
<Button colorScheme="teal">Click Me</Button>
</Box>
);
};
export default App;
3.4 主题定制
你可以通过 extendTheme 函数来自定义默认主题属性:
import React from 'react';
import { ChakraProvider, extendTheme } from '@chakra-ui/react';
const theme = extendTheme({
styles: {
global: {
body: {
bg: 'gray.50',
color: 'gray.800',
},
},
},
colors: {
brand: {
900: '#1A365D',
500: '#ED64A6',
100: '#F7FAFC',
},
},
});
const Main = () => (
<ChakraProvider theme={theme}>
<App />
</ChakraProvider>
);
export default Main;
4. 组合与布局
Chakra-UI 提供了灵活的布局组件,可以用来组合其他组件:
4.1 盒子(Box)与弹性盒子(Flex)
import React from 'react';
import { Box, Flex, Spacer, Button } from '@chakra-ui/react';
const LayoutExample = () => {
return (
<Flex p={4} bg="gray.100">
<Box p={4} bg="blue.300">左侧内容</Box>
<Spacer />
<Box p={4} bg="green.300">右侧内容</Box>
</Flex>
);
};
export default LayoutExample;
4.2 网格布局(Grid)
import React from 'react';
import { Grid, Box } from '@chakra-ui/react';
const GridExample = () => {
return (
<Grid templateColumns="repeat(3, 1fr)" gap={6}>
<Box w="100%" h="10" bg="blue.500" />
<Box w="100%" h="10" bg="green.500" />
<Box w="100%" h="10" bg="red.500" />
</Grid>
);
};
export default GridExample;
5. 常用组件
5.1 表单组件
Chakra-UI 提供了一系列强大的表单控件,如输入框、选择框、复选框等:
import React from 'react';
import { FormControl, FormLabel, Input, Button } from '@chakra-ui/react';
const FormExample = () => {
return (
<FormControl id="name" isRequired>
<FormLabel>Name</FormLabel>
<Input placeholder="Enter your name" />
<Button mt={4} colorScheme="teal" type="submit">
Submit
</Button>
</FormControl>
);
};
export default FormExample;
5.2 模态框
Chakra-UI 的模态框 (Modal) 使用简单,配置全面:
import React, { useState } from 'react';
import {
Button,
Modal,
ModalOverlay,
ModalContent,
ModalHeader,
ModalCloseButton,
ModalBody,
ModalFooter,
} from '@chakra-ui/react';
const ModalExample = () => {
const [isOpen, setIsOpen] = useState(false);
const onOpen = () => setIsOpen(true);
const onClose = () => setIsOpen(false);
return (
<>
<Button onClick={onOpen}>Open Modal</Button>
<Modal isOpen={isOpen} onClose={onClose}>
<ModalOverlay />
<ModalContent>
<ModalHeader>Modal Title</ModalHeader>
<ModalCloseButton />
<ModalBody>
This is the modal body content.
</ModalBody>
<ModalFoote
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
你是否渴望全面提升前端技能?本专栏将带你畅游前端世界!从 JS 深析趣谈,让你领略 JavaScript 的独特魅力;到前端工程漫话,掌握项目构建精髓。深入洞察框架原理,探索 Node 全栈开发。泛端开发趣闻,开启多端应用新视野;揭秘商业解方奥秘,把握行业趋势。高阶专题层层剖析,助你突破技术瓶颈。更有前端面试指南,为求职保驾护航。无论你是新手小白还是资深开发者,这里都有你需要的知识盛宴!

查看20道真题和解析