LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

学WEB前端开发你还在用HTML结构?组件化思想才是现代化前端的核心理念

admin
2024年12月24日 11:39 本文热度 173
本文转载于稀土掘金技术社区,作者:狂炫一碗大米饭


https://juejin.cn/post/7451058158206009371

前言

场景:你是一个小组长,你的老板要你去开发一个项目,你作为组长要如何分配下去工作呢?一个一个页面写或者每人写几个页面?那不得每写一个页面或功能的 UI 需要从头开始重新编写?NO,今天我要和你介绍现代化前端的核心概念——组件化思想!

什么是组件化思想

组件化思想:是一种软件架构和开发思想,目的是将应用程序或系统分解为独立且可复用的“组件”。每个组件都拥有明确的功能、职责和接口,并且通过标准化的方式与其他组件交互。组件化思想广泛应用于前端开发、后端开发、移动开发等多个领域,尤其在现代前端框架(如 React、Vue、Angular)和微服务架构中得到深刻体现。

就像我们实际生产中,我们生产一件东西,不可能一件一件从头到尾的去完成,肯定是一个部件一个部件的生产,然后最后组装在一起。

在我们前端里也一样,在做前端开发时,如果不使用组件化思想那是不是每个页面或功能的 UI 需要从头开始重新编写,导致大量的代码重复。不同页面或部分可能会实现相似的功能或 UI 组件,如按钮、表单、导航栏等。由于没有组件的概念,所有这些公共部分都需要在每个页面中手动复制和粘贴,这样不仅导致冗余代码,还增加了维护和更新的困难。

如果不使用组件化思想 我们怎么开发?

  1. 传统的页面结构

    • 在没有组件化的项目中,通常会将整个应用或功能都放在一个页面文件中。所有的 HTML 结构、CSS 样式和 JavaScript 功能都放在一起。例如,一个传统的页面结构可能是一个大的 HTML 文件,其中包含所有的业务逻辑和视图层。
  2. 手动 DOM 操作

    • 在没有组件化的情况下,开发者可能会手动操作 DOM 来更新视图。这种方法的代码可能会非常冗长且容易出错,因为你需要在每次界面更新时手动操作 DOM,并且手动管理事件、状态等。
  3. 全局状态管理

    • 如果不使用组件化思想,那么通常会使用全局变量 或全局对象 来存储和共享数据。所有页面或功能模块通过这些全局变量来传递和更新数据。这种方式很容易导致全局状态的混乱和难以维护的问题。
  4. 代码重复与功能分离

    • 没有组件化,功能通常是集中在一个地方实现,导致代码重复和无法复用。这意味着,如果需要相似功能的不同部分,开发者需要再次写一遍代码。

就比如在我们的一个项目中可能多个页面都需要显示一个按钮,那难道我需要每个页面都去写一个相同的按钮元素嘛?

<!-- 页面 1 -->
<button>Submit</button>

<!-- 页面 2 -->
<button>Submit</button>

<!-- 页面 3 -->
<button>Submit</button>

当你需要改变按钮的样式或行为时,你必须在每个页面上都修改相同的代码。这样做既不高效,也容易出错。

这时候杠精可能就会说了:这也没复杂多少啊,也就每个页面多写了一行代码。这是功能简单,代码就一行,那要是一个复杂的功能呢?

例如,如果在多个地方需要同样的登录表单,但没有组件化思想,你可能不得不为每个页面编写重复的表单代码。

<!-- 登录表单 1 -->
<form>
  <input type="text" name="username" placeholder="Username" />
  <input type="password" name="password" placeholder="Password" />
  <button type="submit">Login</button>
</form>


<!-- 登录表单 2 -->
<form>
  <input type="text" name="username" placeholder="Username" />
  <input type="password" name="password" placeholder="Password" />
  <button type="submit">Login</button>
</form>

代码重复是一方面,没有组件化状态管理也会混乱在没有组件化的前提下,应用的状态管理会变得混乱且难以追踪。如果应用中有多个页面需要共享和更新状态(如用户信息、购物车数据等),没有组件来封装每个部分的状态,状态可能会混杂在一起,导致逻辑复杂,难以维护和调试。

例如,多个页面可能需要访问同一份数据,如果没有组件化,每个页面都需要自己处理状态,并在每个页面之间传递数据。

使用组件化思想

核心概念

  1. 组件:组件是具有特定功能的、独立的、可重用的单元。每个组件通常有自己的内部状态、UI 渲染、业务逻辑等,外部通过接口或属性与其他组件交互。组件可以是“视图组件”(如 UI 组件)或“业务组件”(如数据处理、API 请求等)。
  2. 独立性与封装性:每个组件应该尽可能独立,负责完成一个特定的功能或任务。每个组件的内部实现细节应该对外部隐藏,只暴露出必要的接口或 API。组件之间通过明确的通信方式(如事件、回调函数或数据传递)进行交互。
  3. 复用性:组件化的一个核心优势是复用。组件应该尽量做到通用和可复用,使得同样的组件可以在不同的场景中重复使用,减少重复代码,提高开发效率。
  4. 组合性:组件可以嵌套或组合在一起形成复杂的界面或功能。组件化的一个重要特性是“组合”的能力,即通过将多个小的组件组合成更大的组件,从而构建复杂的应用。
  5. 解耦性:组件之间应尽量解耦,减少相互依赖。良好的解耦可以使得系统更加灵活和可维护。当需要修改一个组件时,不会影响到其他组件的正常工作。

以react为例展示一下组件化思想

这个项目展示了一个待办事项应用,其中每个功能都拆分为独立的组件。每个组件负责不同的功能,这些组件之间通过props传递数据,从而实现交互。项目结构

src/
  ├── components/
  │   ├── TodoApp.jsx
  │   ├── TodoList.jsx
  │   ├── TodoItem.jsx
  │   ├── AddTodo.jsx
  ├── App.jsx
  ├── main.jsx

组件化思想的实现

  1. TodoApp:这个组件是应用的核心,它负责整个待办事项列表的状态管理,并将数据传递给TodoList 和AddTodo 组件。
  2. TodoList:显示所有的待办事项,它从TodoApp 组件接收待办事项列表并渲染每个TodoItem
  3. TodoItem:每个待办事项项,展示单个待办事项的内容,并允许用户标记任务为完成。
  4. AddTodo:提供输入框,允许用户添加新的待办事项。它通过回调函数将新增的待办事项传递给TodoApp
TodoApp.jsx

import React, { useState } from 'react';
import TodoList from './TodoList';
import AddTodo from './AddTodo';

const TodoApp = () => {
  const [todos, setTodos] = useState([
    { id1text'Learn React'completedfalse },
    { id2text'Build a To-Do App'completedfalse },
  ]);

  // 添加新待办事项
  const addTodo = (text) => {
    const newTodo = {
      id: todos.length + 1,
      text: text,
      completedfalse,
    };
    setTodos([...todos, newTodo]);
  };

  // 切换待办事项完成状态
  const toggleTodo = (id) => {
    setTodos(todos.map(todo => 
      todo.id === id ? { ...todo, completed: !todo.completed } : todo
    ));
  };

  return (
    <div>
      <h1>To-Do List</h1>
      <AddTodo addTodo={addTodo} />
      <TodoList todos={todos} toggleTodo={toggleTodo} />
    </div>

  );
};

export default TodoApp;
TodoList.jsx

import React from 'react';
import TodoItem from './TodoItem';

const TodoList = ({ todos, toggleTodo }) => {
  return (
    <ul>
      {todos.map(todo => (
        <TodoItem key={todo.id} todo={todo} toggleTodo={toggleTodo} />
      ))}
    </ul>

  );
};

export default TodoList;
TodoItem.jsx

import React from 'react';

const TodoItem = ({ todo, toggleTodo }) => {
  return (
    <li
      style={{
        textDecoration: todo.completed ? 'line-through: 'none',
        cursor: 'pointer',
      }}
      onClick={() =>
 toggleTodo(todo.id)}
    >
      {todo.text}
    </li>

  );
};

export default TodoItem;
AddTodo.jsx

import React, { useState } from 'react';

const AddTodo = ({ addTodo }) => {
  const [newTodoText, setNewTodoText] = useState('');

  const handleChange = (event) => {
    setNewTodoText(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    if (newTodoText.trim()) {
      addTodo(newTodoText);
      setNewTodoText('');
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        value={newTodoText}
        onChange={handleChange}
        placeholder="Add a new task"
      />

      <button type="submit">Add</button>
    </form>

  );
};

export default AddTodo;
App.jsx

import React from 'react';
import TodoApp from './components/TodoApp';

const App = () => {
  return (
    <div>
      <TodoApp />
    </div>

  );
};

export default App;
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
,
  document.getElementById('root')
);

总结

在我们的现代化前端开发中组件化思想和很重要的,组件化思想能够有效提升软件系统的可维护性、可扩展性和开发效率。通过将系统拆解成小而独立的组件,开发人员可以更专注于业务逻辑的实现,减少冗余代码,提高复用性。我们通过一个例子展示了如何利用组件化思想进行项目的开发。通过将应用拆分成小而独立的组件,每个组件只负责特定的功能,不仅提高了开发效率,还增强了代码的可维护性和可复用性。



该文章在 2024/12/24 11:40:32 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved