LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

學(xué)WEB前端開發(fā)你還在用HTML結(jié)構(gòu)?組件化思想才是現(xiàn)代化前端的核心理念

admin
2024年12月24日 11:39 本文熱度 495
本文轉(zhuǎn)載于稀土掘金技術(shù)社區(qū),作者:狂炫一碗大米飯


https://juejin.cn/post/7451058158206009371

前言

場景:你是一個小組長,你的老板要你去開發(fā)一個項(xiàng)目,你作為組長要如何分配下去工作呢?一個一個頁面寫或者每人寫幾個頁面?那不得每寫一個頁面或功能的 UI 需要從頭開始重新編寫?NO,今天我要和你介紹現(xiàn)代化前端的核心概念——組件化思想!

什么是組件化思想

組件化思想:是一種軟件架構(gòu)和開發(fā)思想,目的是將應(yīng)用程序或系統(tǒng)分解為獨(dú)立且可復(fù)用的“組件”。每個組件都擁有明確的功能、職責(zé)和接口,并且通過標(biāo)準(zhǔn)化的方式與其他組件交互。組件化思想廣泛應(yīng)用于前端開發(fā)、后端開發(fā)、移動開發(fā)等多個領(lǐng)域,尤其在現(xiàn)代前端框架(如 React、Vue、Angular)和微服務(wù)架構(gòu)中得到深刻體現(xiàn)。

就像我們實(shí)際生產(chǎn)中,我們生產(chǎn)一件東西,不可能一件一件從頭到尾的去完成,肯定是一個部件一個部件的生產(chǎn),然后最后組裝在一起。

在我們前端里也一樣,在做前端開發(fā)時,如果不使用組件化思想那是不是每個頁面或功能的 UI 需要從頭開始重新編寫,導(dǎo)致大量的代碼重復(fù)。不同頁面或部分可能會實(shí)現(xiàn)相似的功能或 UI 組件,如按鈕、表單、導(dǎo)航欄等。由于沒有組件的概念,所有這些公共部分都需要在每個頁面中手動復(fù)制和粘貼,這樣不僅導(dǎo)致冗余代碼,還增加了維護(hù)和更新的困難。

如果不使用組件化思想 我們怎么開發(fā)?

  1. 傳統(tǒng)的頁面結(jié)構(gòu)

    • 在沒有組件化的項(xiàng)目中,通常會將整個應(yīng)用或功能都放在一個頁面文件中。所有的 HTML 結(jié)構(gòu)、CSS 樣式和 JavaScript 功能都放在一起。例如,一個傳統(tǒng)的頁面結(jié)構(gòu)可能是一個大的 HTML 文件,其中包含所有的業(yè)務(wù)邏輯和視圖層。
  2. 手動 DOM 操作

    • 在沒有組件化的情況下,開發(fā)者可能會手動操作 DOM 來更新視圖。這種方法的代碼可能會非常冗長且容易出錯,因?yàn)槟阈枰诿看谓缑娓聲r手動操作 DOM,并且手動管理事件、狀態(tài)等。
  3. 全局狀態(tài)管理

    • 如果不使用組件化思想,那么通常會使用全局變量 或全局對象 來存儲和共享數(shù)據(jù)。所有頁面或功能模塊通過這些全局變量來傳遞和更新數(shù)據(jù)。這種方式很容易導(dǎo)致全局狀態(tài)的混亂和難以維護(hù)的問題。
  4. 代碼重復(fù)與功能分離

    • 沒有組件化,功能通常是集中在一個地方實(shí)現(xiàn),導(dǎo)致代碼重復(fù)和無法復(fù)用。這意味著,如果需要相似功能的不同部分,開發(fā)者需要再次寫一遍代碼。

就比如在我們的一個項(xiàng)目中可能多個頁面都需要顯示一個按鈕,那難道我需要每個頁面都去寫一個相同的按鈕元素嘛?

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

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

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

當(dāng)你需要改變按鈕的樣式或行為時,你必須在每個頁面上都修改相同的代碼。這樣做既不高效,也容易出錯。

這時候杠精可能就會說了:這也沒復(fù)雜多少啊,也就每個頁面多寫了一行代碼。這是功能簡單,代碼就一行,那要是一個復(fù)雜的功能呢?

例如,如果在多個地方需要同樣的登錄表單,但沒有組件化思想,你可能不得不為每個頁面編寫重復(fù)的表單代碼。

<!-- 登錄表單 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>

代碼重復(fù)是一方面,沒有組件化狀態(tài)管理也會混亂在沒有組件化的前提下,應(yīng)用的狀態(tài)管理會變得混亂且難以追蹤。如果應(yīng)用中有多個頁面需要共享和更新狀態(tài)(如用戶信息、購物車數(shù)據(jù)等),沒有組件來封裝每個部分的狀態(tài),狀態(tài)可能會混雜在一起,導(dǎo)致邏輯復(fù)雜,難以維護(hù)和調(diào)試。

例如,多個頁面可能需要訪問同一份數(shù)據(jù),如果沒有組件化,每個頁面都需要自己處理狀態(tài),并在每個頁面之間傳遞數(shù)據(jù)。

使用組件化思想

核心概念

  1. 組件:組件是具有特定功能的、獨(dú)立的、可重用的單元。每個組件通常有自己的內(nèi)部狀態(tài)、UI 渲染、業(yè)務(wù)邏輯等,外部通過接口或?qū)傩耘c其他組件交互。組件可以是“視圖組件”(如 UI 組件)或“業(yè)務(wù)組件”(如數(shù)據(jù)處理、API 請求等)。
  2. 獨(dú)立性與封裝性:每個組件應(yīng)該盡可能獨(dú)立,負(fù)責(zé)完成一個特定的功能或任務(wù)。每個組件的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)應(yīng)該對外部隱藏,只暴露出必要的接口或 API。組件之間通過明確的通信方式(如事件、回調(diào)函數(shù)或數(shù)據(jù)傳遞)進(jìn)行交互。
  3. 復(fù)用性:組件化的一個核心優(yōu)勢是復(fù)用。組件應(yīng)該盡量做到通用和可復(fù)用,使得同樣的組件可以在不同的場景中重復(fù)使用,減少重復(fù)代碼,提高開發(fā)效率。
  4. 組合性:組件可以嵌套或組合在一起形成復(fù)雜的界面或功能。組件化的一個重要特性是“組合”的能力,即通過將多個小的組件組合成更大的組件,從而構(gòu)建復(fù)雜的應(yīng)用。
  5. 解耦性:組件之間應(yīng)盡量解耦,減少相互依賴。良好的解耦可以使得系統(tǒng)更加靈活和可維護(hù)。當(dāng)需要修改一個組件時,不會影響到其他組件的正常工作。

以react為例展示一下組件化思想

這個項(xiàng)目展示了一個待辦事項(xiàng)應(yīng)用,其中每個功能都拆分為獨(dú)立的組件。每個組件負(fù)責(zé)不同的功能,這些組件之間通過props傳遞數(shù)據(jù),從而實(shí)現(xiàn)交互。項(xiàng)目結(jié)構(gòu)

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

組件化思想的實(shí)現(xiàn)

  1. TodoApp:這個組件是應(yīng)用的核心,它負(fù)責(zé)整個待辦事項(xiàng)列表的狀態(tài)管理,并將數(shù)據(jù)傳遞給TodoList 和AddTodo 組件。
  2. TodoList:顯示所有的待辦事項(xiàng),它從TodoApp 組件接收待辦事項(xiàng)列表并渲染每個TodoItem。
  3. TodoItem:每個待辦事項(xiàng)項(xiàng),展示單個待辦事項(xiàng)的內(nèi)容,并允許用戶標(biāo)記任務(wù)為完成。
  4. AddTodo:提供輸入框,允許用戶添加新的待辦事項(xiàng)。它通過回調(diào)函數(shù)將新增的待辦事項(xiàng)傳遞給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 },
  ]);

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

  // 切換待辦事項(xiàng)完成狀態(tài)
  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')
);

總結(jié)

在我們的現(xiàn)代化前端開發(fā)中組件化思想和很重要的,組件化思想能夠有效提升軟件系統(tǒng)的可維護(hù)性、可擴(kuò)展性和開發(fā)效率。通過將系統(tǒng)拆解成小而獨(dú)立的組件,開發(fā)人員可以更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),減少冗余代碼,提高復(fù)用性。我們通過一個例子展示了如何利用組件化思想進(jìn)行項(xiàng)目的開發(fā)。通過將應(yīng)用拆分成小而獨(dú)立的組件,每個組件只負(fù)責(zé)特定的功能,不僅提高了開發(fā)效率,還增強(qiáng)了代碼的可維護(hù)性和可復(fù)用性。



該文章在 2024/12/24 11:40:32 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊、財務(wù)費(fèi)用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
午夜福利在线视频国产不卡 | 亚洲综合日韩一区 | 亚洲精品中文子幕乱码 | 亚洲国产精品一区二区第一页 | 中文字幕精选三级欧美 | 亚洲精品在线直播 |