React组件复用

组件复用

概念

组件复用是指将可复用的逻辑或 UI 提取到单独的组件中,以便在多个地方复用。这可以提高代码的可维护性和可读性,并减少重复代码。

用法

  • 提取通用 UI:将重复的 UI 提取成一个组件。
  • 抽象业务逻辑:将通用的业务逻辑封装到自定义钩子(Custom Hook)中。

使用场景

  • 按钮、输入框、卡片等 UI 组件。
  • 数据加载、表单验证等业务逻辑。
javascript 复制代码
// 1. 提取一个通用的 Button 组件
function Button({ onClick, children }) {
  return (
    <button onClick={onClick} style={{ padding: '10px 20px', backgroundColor: '#007bff', color: 'white' }}>
      {children}
    </button>
  );
}

// 2. 使用 Button 组件
function App() {
  const handleClick = () => {
    console.log('Button clicked!');
  };

  return (
    <div>
      <Button onClick={handleClick}>Click me</Button>
      <Button onClick={() => console.log('Another button clicked!')}>Another Button</Button>
    </div>
  );
}

代码解析

  • Button 组件:将通用的按钮样式和逻辑提取到一个组件中。
  • onClickchildren:通过 Props 传递点击事件和按钮内容。
  • 复用 :在 App 组件中多次使用 Button 组件。

封装公用组件

首先,我们需要将公用组件的逻辑和 UI 封装到一个单独的组件中。假设我们要封装一个通用的 Button 组件。

代码示例:封装 Button 组件
javascript 复制代码
// src/components/Button.js
import React from 'react';

// 封装一个通用的 Button 组件
function Button({ onClick, children, type = 'primary' }) {
  // 根据传入的 type 设置按钮样式
  const buttonStyles = {
    padding: '10px 20px',
    border: 'none',
    borderRadius: '5px',
    cursor: 'pointer',
    backgroundColor: type === 'primary' ? '#007bff' : '#6c757d',
    color: 'white',
  };

  return (
    <button onClick={onClick} style={buttonStyles}>
      {children}
    </button>
  );
}

export default Button; // 导出组件

代码解析

  • Button 组件 :接收 onClickchildrentype 三个 props
    • onClick:按钮的点击事件。
    • children:按钮的内容(如文本)。
    • type:按钮的类型(如 primarysecondary),默认为 primary
  • buttonStyles :根据 type 动态设置按钮的样式。
  • export default Button:将组件导出,以便其他组件或页面使用。

在其他组件或页面中使用公用组件

封装好公用组件后,我们可以在其他组件或页面中通过 import 引入并使用它。

代码示例:在 App 组件中使用 Button 组件
javascript 复制代码
// src/App.js
import React from 'react';
import Button from './components/Button'; // 引入封装的 Button 组件

function App() {
  const handleClick = () => {
    console.log('Button clicked!');
  };

  return (
    <div>
      <h1>Welcome to My App</h1>
      {/* 使用 Button 组件 */}
      <Button onClick={handleClick}>Primary Button</Button>
      <Button type="secondary" onClick={() => console.log('Secondary Button clicked!')}>
        Secondary Button
      </Button>
    </div>
  );
}

export default App;

代码解析

  • import Button from './components/Button' :引入封装的 Button 组件。
  • 使用 Button 组件
    • 第一个 Button:使用默认的 typeprimary),并传递 onClickchildren
    • 第二个 Button:指定 typesecondary,并传递 onClickchildren

使用场景示例

假设你有一个登录页面和一个注册页面,它们都需要使用 Button 组件。

代码示例:在 LoginRegister 页面中使用 Button 组件
javascript 复制代码
// src/pages/Login.js
import React from 'react';
import Button from '../components/Button';

function Login() {
  const handleLogin = () => {
    console.log('Login button clicked!');
  };

  return (
    <div>
      <h2>Login Page</h2>
      <Button onClick={handleLogin}>Login</Button>
    </div>
  );
}

export default Login;


// src/pages/Register.js
import React from 'react';
import Button from '../components/Button';

function Register() {
  const handleRegister = () => {
    console.log('Register button clicked!');
  };

  return (
    <div>
      <h2>Register Page</h2>
      <Button type="secondary" onClick={handleRegister}>
        Register
      </Button>
    </div>
  );
}

export default Register;

代码解析

  • Login 页面和 Register 页面都使用 Button 组件,但分别使用了不同的 typeonClick 逻辑。
  • 通过复用 Button 组件,避免了重复编写按钮的样式和逻辑。

使用公用组件的注意事项

  1. props 设计要灵活

    • 通过 props 传递必要的数据和事件,确保组件可以被灵活使用。
    • 使用默认值(如 type = 'primary')来简化调用。
  2. 组件命名清晰

    • 组件的文件名和导出名称要有意义,如 Button.jsexport default Button
  3. 样式和逻辑分离

    • 如果样式复杂,可以考虑使用 CSS Modules、Styled Components 或 Tailwind CSS 来管理样式。
  4. 复用组件与业务组件分离

    • 将通用的公用组件(如 ButtonInput)放在 src/components 目录下。
    • 将业务相关的组件(如 LoginRegister)放在 src/pagessrc/features 目录下。
相关推荐
军军君0130 分钟前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
xiaoqi9221 小时前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos
打小就很皮...2 小时前
Tesseract.js OCR 中文识别
前端·react.js·ocr
qq_177767372 小时前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
2603_949462102 小时前
Flutter for OpenHarmony社团管理App实战:预算管理实现
android·javascript·flutter
wuhen_n2 小时前
JavaScript内存管理与执行上下文
前端·javascript
Hi_kenyon2 小时前
理解vue中的ref
前端·javascript·vue.js
jin1233223 小时前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos
2501_920931704 小时前
React Native鸿蒙跨平台医疗健康类的血压记录,包括收缩压、舒张压、心率、日期、时间、备注和状态
javascript·react native·react.js·ecmascript·harmonyos
落霞的思绪4 小时前
配置React和React-dom为CDN引入
前端·react.js·前端框架