前端取經路——框架修行:React與Vue的雙修之路

大家好,我是老十三,一名前端開發工程師。在前端的江湖中,React與Vue如同兩大武林門派,各有千秋。今天,我將帶你進入這兩大框架的奧秘世界,共同探索組件生命周期、狀態管理、性能優化等核心難題的解決之道。無論你是哪派弟子,掌握雙修之術,才能在前端之路上游刃有余。準備好啟程了嗎?

掌握了DOM渡劫的九道試煉后,是時候踏入現代前端的核心領域——框架修行。在這條充滿挑戰的雙修之路上,我們將探索React與Vue這兩大主流框架的精髓,以及它們背后的設計哲學。

?? 第一難:生命周期 - 組件的"六道輪回"

問題:組件從創建到銷毀經歷了哪些階段?如何在正確的生命周期階段執行相應操作?

深度技術:

組件生命周期是前端框架的核心概念,描述了組件從創建、更新到銷毀的完整過程。理解生命周期,意味著掌握了何時獲取數據、何時操作DOM以及何時清理資源。

React和Vue在生命周期設計上既有相似之處,也有顯著區別。React強調函數式理念,推動Hooks模式;Vue則提供更直觀的選項式API,同時也支持組合式API。無論哪種方式,合理使用生命周期鉤子都是構建高性能應用的關鍵。

代碼示例:

// React Hooks生命周期
function HooksLifecycle() {const [count, setCount] = React.useState(0);const [userId, setUserId] = React.useState(1);const prevUserIdRef = React.useRef();// 相當于constructor + componentDidMount + componentDidUpdateReact.useEffect(() => {console.log('組件掛載或更新');// 設置定時器const timer = setInterval(() => {setCount(c => c + 1);}, 1000);// 返回清理函數,相當于componentWillUnmountreturn () => {console.log('組件卸載或更新前清理');clearInterval(timer);};}, []); // 空依賴數組,僅在掛載和卸載時執行// 監聽特定依賴變化React.useEffect(() => {console.log('userId發生變化,獲取新用戶數據');fetchUserData(userId);}, [userId]); // 僅當userId變化時執行// 模擬getDerivedStateFromPropsReact.useEffect(() => {if (prevUserIdRef.current !== userId) {console.log('從props派生狀態');}prevUserIdRef.current = userId;});// 模擬componentDidUpdate - 比較前后值const prevCountRef = React.useRef();React.useEffect(() => {const prevCount = prevCountRef.current;if (prevCount !== undefined && prevCount !== count) {console.log('count從', prevCount, '變為', count);}prevCountRef.current = count;});// 使用布局效果,在DOM變更后同步觸發React.useLayoutEffect(() => {console.log('DOM更新后立即執行,瀏覽器繪制前');// 獲取DOM測量或直接操作DOM});return (<div><h1>Hooks計數器: {count}</h1><button onClick={() => setCount(count + 1)}>增加</button><button onClick={() => setUserId(userId + 1)}>切換用戶</button></div>);
}// Vue 3組合式API生命周期
import { ref, onMounted, onBeforeMount, onUpdated, onBeforeUpdate, onBeforeUnmount, onUnmounted, watch } from 'vue';const LifecycleDemo = {setup() {const count = ref(0);const message = ref('Hello Vue 3');onBeforeMount(() => {console.log('1. onBeforeMount: 組件掛載前');});onMounted(() => {console.log('2. onMounted: 組件已掛載');// 適合進行DOM操作、網絡請求、訂閱事件const timer = setInterval(() => {count.value++;}, 1000);// 清理函數onBeforeUnmount(() => {clearInterval(timer);});});onBeforeUpdate(() => {console.log('3. onBeforeUpdate: 組件更新前');});onUpdated(() => {console.log('4. onUpdated: 組件已更新');});onBeforeUnmount(() => {console.log('5. onBeforeUnmount: 組件卸載前');});onUnmounted(() => {console.log('6. onUnmounted: 組件已卸載');});// 監聽數據變化watch(count, (newValue, oldValue) => {console.log(`count從${oldValue}變為${newValue}`);});return {count,message};}
};

?? 第二難:狀態管理 - 數據的"太極之道"

問題:如何優雅地管理應用狀態?Redux和Vuex各有什么特點?

深度技術:

狀態管理是前端應用的核心挑戰之一。Redux遵循嚴格的單向數據流和不可變數據原則,強調純函數reducer;Vuex則采用更貼近Vue的響應式設計。理解這兩種范式的差異和適用場景,是框架修行的關鍵一步。

代碼示例:

// Redux Toolkit示例
import { createSlice, configureStore } from '@reduxjs/toolkit';// 創建slice
const todoSlice = createSlice({name: 'todos',initialState: {items: [],filter: 'all'},reducers: {addTodo: (state, action) => {state.items.push({id: Date.now(),text: action.payload,completed: false});},toggleTodo: (state, action) => {const todo = state.items.find(todo => todo.id === action.payload);if (todo) {todo.completed = !todo.completed;}},setFilter: (state, action) => {state.filter = action.payload;}}
});// 導出actions
export const { addTodo, toggleTodo, setFilter } = todoSlice.actions;// 創建store
const store = configureStore({reducer: {todos: todoSlice.reducer}
});// React組件中使用Redux Toolkit
import { useSelector, useDispatch } from 'react-redux';function TodoApp() {const dispatch = useDispatch();const todos = useSelector(state => state.todos.items);const filter = useSelector(state => state.todos.filter);const [newTodo, setNewTodo] = React.useState('');const handleSubmit = e => {e.preventDefault();if (!newTodo.trim()) return;dispatch(addTodo(newTodo));setNewTodo('');};return (<div><h1>Todo應用</h1><form onSubmit={handleSubmit}><inputvalue={newTodo}onChange={e => setNewTodo(e.target.value)}placeholder="添加新任務"/><button type="submit">添加</button></form><div><button onClick={() => dispatch(setFilter('all'))}>全部</button><button onClick={() => dispatch(setFilter('active'))}>進行中</button><button onClick={() => dispatch(setFilter('completed'))}>已完成</button><span>當前: {filter}</span></div><ul>{todos.map(todo => (<likey={todo.id}style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}onClick={() => dispatch(toggleTodo(todo.id))}>{todo.text}</li>))}</ul></div>);
}// Pinia示例
import { defineStore } from 'pinia';export const useTodoStore = defineStore('todos', {state: () => ({items: [],filter: 'all'}),getters: {visibleTodos: (state) => {switch (state.filter) {case 'active':return state.items.filter(todo => !todo.completed);case 'completed':return state.items.filter(todo => todo.completed);default:return state.items;}}},actions: {addTodo(text) {this.items.push({id: Date.now(),text,completed: false});},toggleTodo(id) {const todo = this.items.find(todo => todo.id === id);if (todo) {todo.completed = !todo.completed;}},setFilter(filter) {this.filter = filter;}}
});// Vue組件中使用Pinia
import { useTodoStore } from './stores/todo';const TodoApp = {setup() {const store = useTodoStore();const newTodo = ref('');const handleSubmit = () => {if (!newTodo.value.trim()) return;store.addTodo(newTodo.value);newTodo.value = '';};return {store,newTodo,handleSubmit};},template: `<div><h1>Todo應用</h1><form @submit.prevent="handleSubmit"><inputv-model="newTodo"placeholder="添加新任務"/><button type="submit">添加</button></form><div><button @click="store.setFilter('all')">全部</button><button @click="store.setFilter('active')">進行中</button><button @click="store.setFilter('completed')">已完成</button><span>當前: {{ store.filter }}</span></div><ul><liv-for="todo in store.visibleTodos":key="todo.id":style="{ textDecoration: todo.completed ? 'line-through' : 'none' }"@click="store.toggleTodo(todo.id)">{{ todo.text }}</li></ul></div>`
};

?? 第三難:組件通信 - 數據的"乾坤大挪移"

問題:在React和Vue中,如何實現組件之間的數據傳遞和通信?有哪些最佳實踐?

深度技術:

組件通信是前端開發中的核心問題。React和Vue提供了多種組件通信方式,從簡單的props傳遞到復雜的狀態管理,從事件總線到上下文共享。理解這些通信方式的適用場景和最佳實踐,是構建可維護應用的關鍵。

代碼示例:

// React組件通信示例// 1. Props傳遞 - 父子組件通信
function ParentComponent() {const [count, setCount] = useState(0);return (<div><h1>父組件</h1><ChildComponent count={count} onIncrement={() => setCount(c => c + 1)} /></div>);
}function ChildComponent({ count, onIncrement }) {return (<div><p>子組件接收到的count: {count}</p><button onClick={onIncrement}>增加</button></div>);
}// 2. Context API - 跨層級組件通信
const ThemeContext = React.createContext('light');function ThemeProvider({ children }) {const [theme, setTheme] = useState('light');const toggleTheme = () => {setTheme(prev => prev === 'light' ? 'dark' : 'light');};return (<ThemeContext.Provider value={{ theme, toggleTheme }}>{children}</ThemeContext.Provider>);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79614.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch API 1 - 概述、數學運算、nn、實用工具、函數、張量

文章目錄 torch張量創建操作索引、切片、連接與變異操作 加速器生成器隨機采樣原地隨機采樣準隨機采樣 序列化并行計算局部禁用梯度計算數學運算常量逐點運算歸約操作比較運算頻譜操作其他操作BLAS 和 LAPACK 運算遍歷操作遍歷操作遍歷操作遍歷操作遍歷操作遍歷操作遍歷操作遍歷…

java命令行打包class為jar并運行

1.創建無包名類: 2.添加依賴jackson 3.引用依賴包 4.命令編譯class文件 生成命令: javac -d out -classpath lib/jackson-core-2.13.3.jar:lib/jackson-annotations-2.13.3.jar:lib/jackson-databind-2.13.3.jar src/UdpServer.java 編譯生成class文件如下 <

ABC 轉 STL 全攻略:格式解析、方法實操與問題解決

在 3D 建模與設計領域&#xff0c;不同格式文件間的轉換是一項基礎且重要的操作。ABC&#xff08;Alembic&#xff09;和 STL&#xff08;Standard Triangle Language&#xff09;是其中常見的兩種格式。ABC 格式因其高效存儲和傳輸 3D 數據的特性&#xff0c;常被用于影視特效…

編寫一個處理txt的loader插件,適用于wbepack

處理txt的webpack的loader插件 編寫一個處理txt的loader插件&#xff0c;適用于wbepack 編寫一個處理txt的loader插件&#xff0c;適用于wbepack 實現一個處理txt的插件&#xff0c;給文本每行前后添加**** module.exports function txtLoader(content) {// 確保 Loader 是異…

DeepSeek的100個應用場景

在春節前夕&#xff0c;浙江杭州的AI企業DeepSeek推出了其開源模型DeepSeek-R1&#xff0c;以僅相當于Open AI最新模型1/30的訓練成本&#xff0c;在數學、編程等關鍵領域展現出媲美GPT-o1的出色性能。發布僅數日&#xff0c;DeepSeek-R1便迅速攀升至中美兩國蘋果應用商店免費榜…

ev_loop_fork函數

libev監視器介紹&#xff1a;libev監視器用法-CSDN博客 libev loop對象介紹&#xff1a;loop對象-CSDN博客 libev ev_loop_fork函數介紹:ev_loop_fork函數-CSDN博客 libev API吐血整理&#xff1a;https://download.csdn.net/download/qq_39466755/90794251?spm1001.2014.3…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】金融風控分析案例-10.1 風險數據清洗與特征工程

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 PostgreSQL金融風控分析案例&#xff1a;風險數據清洗與特征工程實戰一、案例背景&#xff1a;金融風控數據處理需求二、風險數據清洗實戰&#xff08;一&#xff09;缺失值…

OpenCV 的 CUDA 模塊中用于將一個多通道 GpuMat 圖像拆分成多個單通道圖像的函數split()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::split 是 OpenCV CUDA 模塊中的一個函數&#xff0c;用于將一個多通道的 GpuMat 圖像拆分成多個單通道的 GpuMat 圖像。這個函數是 CP…

【WebRTC-13】是在哪,什么時候,創建編解碼器?

Android-RTC系列軟重啟&#xff0c;改變以往細讀源代碼的方式 改為 帶上實際問題分析代碼。增加實用性&#xff0c;方便形成肌肉記憶。同時不分種類、不分難易程度&#xff0c;在線征集問題切入點。 問題&#xff1a;編解碼器的關鍵實體類是什么&#xff1f;在哪里&什么時候…

c語言第一個小游戲:貪吃蛇小游戲03

我們為貪吃蛇的節點設置為一個結構體&#xff0c;構成貪吃蛇的身子的話我們使用鏈表&#xff0c;鏈表的每一個節點是一個結構體 顯示貪吃蛇身子的一個節點 我們這邊node就表示一個蛇的身體 就是一小節 輸出結果如下 顯示貪吃蛇完整身子 效果如下 代碼實現 這個hasSnakeNode(…

架構思維:通用架構模式_系統監控的設計

文章目錄 引言什么是監控三大常見監控類型1. 次數監控2. 性能監控3. 可用率監控 落地監控1. 服務入口2. 服務內部3. 服務依賴 監控時間間隔的取舍小結 引言 架構思維&#xff1a;通用架構模式_從設計到代碼構建穩如磐石的系統 架構思維&#xff1a;通用架構模式_穩如老狗的SDK…

精益數據分析(46/126):深入剖析用戶生成內容(UGC)商業模式

精益數據分析&#xff08;46/126&#xff09;&#xff1a;深入剖析用戶生成內容&#xff08;UGC&#xff09;商業模式 在創業與數據分析的征程中&#xff0c;每一種商業模式都蘊含著獨特的價值與挑戰。今天&#xff0c;我們依舊懷揣著共同進步的信念&#xff0c;深入研讀《精益…

QMK鍵盤固件中LED鎖定指示燈的配置與使用詳解(實操部分+拓展)

QMK鍵盤固件中LED鎖定指示燈的配置與使用詳解 大家好!今天就跟大家一起探索QMK固件中LED鎖定指示燈的配置與使用。無論你是鍵盤DIY新手還是老司機,相信這篇教程都能幫你解鎖新技能! 一、基礎配置:定義LED引腳 在QMK固件中配置LED鎖定指示燈非常簡單,只需在config.h文件…

CVE體系若消亡將如何影響網絡安全防御格局

CVE體系的核心價值與當前危機 由MITRE運營的通用漏洞披露&#xff08;CVE&#xff09;項目的重要性不容低估。25年來&#xff0c;它始終是網絡安全專業人員理解和緩解安全漏洞的基準參照系。通過提供標準化的漏洞命名與分類方法&#xff0c;這套體系為防御者建立了理解、優先級…

一周學完計算機網絡之三:1、數據鏈路層概述

簡單的概述 數據鏈路層是計算機網絡體系結構中的第二層&#xff0c;它在物理層提供的基本服務基礎上&#xff0c;負責將數據從一個節點可靠地傳輸到相鄰節點。可以將其想象成一個負責在兩個相鄰的網絡設備之間進行數據 “搬運” 和 “整理” 的 “快遞中轉站”。 幾個重要概念…

?WordToCard使用分享?

https://www.wordtocard.com 家人們&#xff0c;今天發現了一個超好用的工具——WordToCard&#xff01;&#x1f61c; 它可以把WordToCard文檔轉換成漂亮的知識卡片&#xff0c;學習筆記、知識整理和內容分享都變得超輕松&#xff5e;&#x1f917; 支持各種WordToCard語法…

擴展:React 項目執行 yarn eject 后的 package.json 變化詳解及參數解析

擴展&#xff1a;React 項目執行 yarn eject 后的 package.json 變化詳解及參數解析 什么是 yarn eject&#xff1f;React 項目執行 yarn eject 后的 package.json 變化詳解1. 腳本部分 Scripts 被替換2. 新增構建依賴 dependencies&#xff08;部分&#xff09;3. 新增 Babel …

[Java實戰]Spring Boot 整合 Redis(十八)

[Java實戰]Spring Boot 整合 Redis&#xff08;十八&#xff09; 在現代的分布式應用開發中&#xff0c;Redis 作為一種高性能的鍵值存儲數據庫&#xff0c;被廣泛用于緩存、消息隊列、排行榜等多種場景。Spring Boot 提供了強大的支持&#xff0c;使得整合 Redis 變得非常簡單…

【氮化鎵】GaN在不同電子能量損失的SHI輻射下的損傷

該文的主要發現和結論如下: GaN的再結晶特性 :GaN在離子撞擊區域具有較高的再結晶傾向,這導致其形成永久損傷的閾值較高。在所有研究的電子能量損失 regime 下,GaN都表現出這種傾向,但在電子能量損失增加時,其效率會降低,尤其是在材料發生解離并形成N?氣泡時。 能量損失…

R語言實戰第5章(1)

第一部分&#xff1a;數學、統計和字符處理函數 數學和統計函數&#xff1a;R提供了豐富的數學和統計函數&#xff0c;用于執行各種計算和分析。這些函數可以幫助用戶快速完成復雜的數學運算、統計分析等任務&#xff0c;例如計算均值、方差、相關系數、進行假設檢驗等。字符處…