從 0 到 1 玩轉 React:打造你的趣味美食相冊

想象一下,你想制作一個超酷的 “美食相冊” 網頁,能展示各種美食圖片,還能隨時切換查看不同美食。這聽起來是不是很有趣?別擔心,React 能幫你輕松實現!作為前端開發領域最受歡迎的庫之一,React 以其高效的組件化開發模式和虛擬 DOM 技術,讓網頁開發變得簡單又有趣。接下來,就讓我們從入門開始,一步步揭開 React 的神秘面紗,打造屬于自己的美食相冊!?

一、React 入門準備:搭建開發環境?

在開始編寫代碼之前,我們需要先搭建好 React 的開發環境。就像廚師做菜前要準備好鍋碗瓢盆一樣,我們也得把 “工具” 準備齊全。?

1.1 安裝 Node.js?

React 項目的運行依賴 Node.js,它就像是我們開發的 “發動機”。你可以在Node.js 官方網站下載并安裝最新版本的 Node.js。安裝完成后,在命令行中輸入node -v和npm -v,如果能顯示出版本號,就說明安裝成功啦!?

1.2 創建 React 項目?

有了 Node.js,我們就可以使用create-react-app工具來創建 React 項目了。打開命令行,輸入以下命令:

npx create-react-app food-album

這里的food-album是我們項目的名字,你也可以換成自己喜歡的名字。等待一會兒,一個基礎的 React 項目就創建好啦!進入項目目錄:

cd food-album

然后啟動項目:

npm start

這時,你的瀏覽器會自動打開http://localhost:3000,展示出一個默認的 React 頁面,這就意味著我們的開發環境搭建成功了!?

二、初識 React 組件:構建美食相冊的 “積木”?

在 React 中,組件是構建頁面的基本單元,就像搭積木一樣,我們可以把不同的組件組合在一起,拼成我們想要的頁面。接下來,我們就來創建第一個 React 組件 —— 美食卡片組件。?

2.1 函數式組件?

在 React 中,創建組件有兩種常見方式,我們先來看函數式組件。在src目錄下創建一個新文件FoodCard.js,輸入以下代碼:

import React from'react';const FoodCard = (props) => {return (<div className="food-card"><img src={props.image} alt={props.name} /><h2>{props.name}</h2><p>{props.description}</p></div>);
};export default FoodCard;

這段代碼定義了一個名為FoodCard的函數式組件。它接收一個props參數,props就像是組件的 “快遞包裹”,里面裝著組件需要的數據。在組件內部,我們使用JSX語法(一種類似 HTML 的語法)來描述組件的結構,通過{props.image}、{props.name}等方式來展示傳遞進來的數據。?

2.2 類組件(了解即可)?

除了函數式組件,還有類組件。雖然現在函數式組件更常用,但了解類組件也能幫助我們更好地理解 React 的發展。以下是FoodCard類組件的實現方式:

import React, { Component } from'react';class FoodCard extends Component {render() {return (<div className="food-card"><img src={this.props.image} alt={this.props.name} /><h2>{this.props.name}</h2><p>{this.props.description}</p></div>);}
}export default FoodCard;

類組件通過繼承React.Component,并實現render方法來返回組件的結構。使用this.props來訪問傳遞的數據,相比函數式組件,類組件的語法稍微復雜一些。?

2.3 使用組件?

創建好組件后,我們要在頁面中使用它。打開src/App.js文件,修改代碼如下:

import React from'react';
import FoodCard from './FoodCard';
import './App.css';function App() {return (<div className="App"><h1>我的美食相冊</h1><FoodCardimage="https://example.com/pizza.jpg"name="美味披薩"description="香濃芝士,美味可口"/><FoodCardimage="https://example.com/sushi.jpg"name="精致壽司"description="新鮮食材,口感豐富"/></div>);
}export default App;

在這里,我們引入了FoodCard組件,并在App組件中使用了兩次,通過傳遞不同的image、name和description數據,展示了不同的美食卡片。?

三、React 狀態(State):讓美食相冊 “動起來”?

現在我們的美食相冊只能展示固定的美食,如果想要點擊按鈕切換不同的美食,或者實現其他交互效果,就需要用到 React 的狀態(State)了。狀態就像是組件的 “小秘密”,它的值可以改變,并且當狀態改變時,組件會重新渲染,更新頁面展示。?

3.1 函數式組件的狀態?

在FoodCard.js中,我們為美食卡片添加一個 “喜歡” 按鈕,點擊按鈕可以切換美食是否被喜歡的狀態。修改代碼如下:

import React, { useState } from'react';const FoodCard = (props) => {// 使用useState Hook創建狀態const [isLiked, setIsLiked] = useState(false);return (<div className="food-card"><img src={props.image} alt={props.name} /><h2>{props.name}</h2><p>{props.description}</p><button onClick={() => setIsLiked(!isLiked)}>{isLiked? '取消喜歡' : '喜歡'}</button></div>);
};export default FoodCard;

這里我們使用了useState Hook,它是 React 中用于在函數式組件中添加狀態的方法。useState(false)初始化了一個名為isLiked的狀態,初始值為false,并返回一個更新狀態的函數setIsLiked。當點擊按鈕時,通過setIsLiked(!isLiked)來切換isLiked的狀態,從而改變按鈕的文字顯示。?

3.2 狀態的重要性?

狀態的引入讓我們的組件變得更加靈活和交互性更強。比如,我們還可以根據狀態來改變美食卡片的樣式,或者實現更多復雜的交互邏輯。在實際開發中,合理管理和使用狀態是非常關鍵的。?

四、React 生命周期(了解進階):組件的 “一生”?

在類組件中,React 提供了生命周期方法,這些方法會在組件的不同階段自動調用,就像人的一生會經歷出生、成長、衰老等階段一樣,組件也有自己的 “一生”。雖然現在函數式組件配合 Hook 更常用,但了解生命周期方法能幫助我們更好地理解 React 的運行機制。?

4.1 掛載階段?

當組件首次被渲染到頁面上時,會經歷掛載階段。這個階段常用的生命周期方法有componentDidMount,它會在組件掛載完成后立即調用。比如,我們可以在這個方法中發送網絡請求獲取美食數據:

class FoodCard extends Component {componentDidMount() {// 模擬發送網絡請求獲取美食數據fetch('https://example.com/api/food').then(response => response.json()).then(data => {// 更新組件狀態或進行其他操作});}render() {return (<div className="food-card"><img src={this.props.image} alt={this.props.name} /><h2>{this.props.name}</h2><p>{this.props.description}</p></div>);}
}

4.2 更新階段?

當組件的狀態或props發生變化時,會進入更新階段。componentDidUpdate方法會在組件更新完成后調用,我們可以在這個方法中進行一些依賴于更新后的操作。?

4.3 卸載階段?

當組件從頁面中移除時,會進入卸載階段。componentWillUnmount方法會在組件卸載前調用,我們可以在這里進行一些清理工作,比如取消網絡請求、清除定時器等。?

五、React 組件通信:讓美食相冊 “協作” 起來?

在一個復雜的應用中,多個組件之間常常需要相互通信,傳遞數據和信息。比如,我們想在美食相冊的頂部添加一個篩選按鈕,根據用戶選擇的美食類型來展示相應的美食卡片,這就涉及到組件之間的通信了。?

5.1 父子組件通信?

最常見的組件通信方式是父子組件通信。父組件可以通過props向子組件傳遞數據,子組件也可以通過回調函數向父組件傳遞信息。例如,我們在App.js中添加一個篩選功能:

import React, { useState } from'react';
import FoodCard from './FoodCard';
import './App.css';function App() {const [selectedType, setSelectedType] = useState('all');const foodList = [{id: 1,image: "https://example.com/pizza.jpg",name: "美味披薩",description: "香濃芝士,美味可口",type: "西餐"},{id: 2,image: "https://example.com/sushi.jpg",name: "精致壽司",description: "新鮮食材,口感豐富",type: "日料"},{id: 3,image: "https://example.com/dumplings.jpg",name: "美味餃子",description: "傳統美食,味道鮮美",type: "中餐"}];const filteredFoodList = selectedType === 'all'? foodList : foodList.filter(food => food.type === selectedType);return (<div className="App"><h1>我的美食相冊</h1><div><button onClick={() => setSelectedType('all')}>全部</button><button onClick={() => setSelectedType('西餐')}>西餐</button><button onClick={() => setSelectedType('日料')}>日料</button><button onClick={() => setSelectedType('中餐')}>中餐</button></div>{filteredFoodList.map(food => (<FoodCardkey={food.id}image={food.image}name={food.name}description={food.description}/>))}</div>);
}export default App;

在這個例子中,App組件作為父組件,通過props向FoodCard子組件傳遞美食數據。同時,父組件通過useState管理selectedType狀態,并在按鈕的點擊事件中更新狀態,從而實現篩選功能。?

5.2 其他通信方式?

除了父子組件通信,還有兄弟組件通信、跨層級組件通信等。可以通過狀態提升、使用 Context API、Redux 等方式來實現更復雜的組件通信需求。?

六、總結?

通過以上內容,我們從 React 的開發環境搭建開始,學習了組件的創建和使用、狀態的管理、生命周期方法以及組件通信等核心知識,并通過打造一個趣味美食相冊的實例,將這些知識應用到實際開發中。當然,React 的世界還有很多有趣和強大的功能等待我們去探索,比如路由管理、與后端 API 的交互、性能優化等等。希望這篇入門分享能激發你對 React 的興趣,讓你在前端開發的道路上越走越遠!快動手嘗試一下,打造屬于你自己的酷炫 React 應用吧!?

通過美食相冊案例,相信你對 React 有了初步認識。若你想深入了解某部分內容,請你關注我,后續我會更新相關內容。

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

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

相關文章

深入淺出:RocketMQ與Kafka的雙劍合璧,實現高可用與高吞吐

本文在創作過程中借助 AI 工具輔助資料整理與內容優化。圖片來源網絡。 文章目錄 引言一、RocketMQ與Kafka的江湖地位1.1 RocketMQ的獨門絕技1.2 Kafka的凌厲攻勢 二、雙劍合璧的策略&#xff1a;雙寫隊列2.1 策略概述2.2 代碼實現 三、雙劍合璧的實戰應用3.1 電商訂單處理3.2 …

Apache POI-02.入門案例-通過POI向Excel文件寫入文件內容-通過POI讀取Excel文件內容

一.入門案例 向excel文件中寫入并讀出 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; impor…

MongoDB06 - MongoDB 地理空間

MongoDB06 - MongoDB 地理空間 文章目錄 MongoDB06 - MongoDB 地理空間一&#xff1a;地理空間數據基礎1&#xff1a;地理數據表示方式1.1&#xff1a;GeoJSON 格式1.2&#xff1a;傳統坐標對 2&#xff1a;地理空間索引2.1&#xff1a;2dsphere 索引2.2&#xff1a;2d索引2.3&…

Bugku——WEB篇(持續更新ing)

目錄 一、滑稽 二、計算器 方法一 方法二 三、alert 四、你必須讓他停下 五、頭等艙 六、GET 七、POST 方法一 方法二 八、source 九、矛盾 十、備份是個好習慣 一、滑稽 1.啟動環境后&#xff0c;訪問URL&#xff0c;頁面出現了一堆滑稽表情 2.按f12(或fnf12)打…

Linux 網絡命名空間的奧秘:深入解析struct net與內核模塊編譯陷阱

引言:網絡隔離的基石 在Linux容器化技術(如Docker)和云計算網絡中,網絡命名空間是實現網絡隔離的核心機制。每個隔離的網絡環境都由一個關鍵的內核數據結構描述——struct net。這個結構體不僅是網絡隔離的技術基礎,也是內核開發者常遇到的編譯陷阱源頭。 一、解剖網絡命…

idea的EasyCode插件連接瀚高數據庫(APP)

文章目錄 環境癥狀問題原因解決方案 環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;5.6.5 癥狀 客戶在idea工具中使用EasyCode插件連接瀚高數據庫的企業版時&#xff0c;連接設置的url中提示“jdbc:highgo不存在”的錯誤 問題原因 E…

VMware設置虛擬機為固定IP

1. 修改虛擬網絡編輯器 打開虛擬機網絡“編輯” 點擊“VMnet8” 選擇“NAT”模式 修改網關&#xff1a;前面的不要修改&#xff0c;最后一位設置為“1”&#xff0c;然后確定 記住這里的網關&#xff0c;后面的配置要保持一致 設置子網IP和子網掩碼&#xff1a;一般就…

智核引擎融合生成式AI,重塑企業知識圖譜與研發創新范式!

目錄 系統架構設計核心實現步驟步驟1&#xff1a;知識圖譜構建與數據預處理步驟2&#xff1a;生成式AI與知識圖譜融合&#xff08;RAG增強&#xff09;步驟3&#xff1a;智能推理工作流 核心流程可視化企業級部署方案性能優化策略應用場景示例結語 本文將手把手實現企業級知識圖…

LogisticRegression(solver = ‘lbfgs‘)的ConvergenceWarning問題解決

&#x1f466;&#x1f466;一個帥氣的boy&#xff0c;你可以叫我Love And Program &#x1f5b1; ?個人主頁&#xff1a;Love And Program的個人主頁 &#x1f496;&#x1f496;如果對你有幫助的話希望三連&#x1f4a8;&#x1f4a8;支持一下博主 LogisticRegression的Co…

web3 docs

區塊鏈重構信任機制&#xff0c;去中心化&#xff0c;用唯一的hash編號來實現防篡改。以數字貨幣的形式交易&#xff0c;個人持有唯一的數字秘鑰(唯一&#xff0c;不可篡改) 詳見 以太坊的白皮書 和 數字貨幣 (加密貨幣實現隱私交易) 底層基礎的很多特點 1.例如p2p&#xf…

AI入門 | 計算自注意力時QK^T的計算復雜度是多少?

0. 背景 假設我們有兩個矩陣&#xff1a; 矩陣 A&#xff0c;尺寸為 (n, d_k)矩陣 B&#xff0c;尺寸為 (d_k, n) 我們要計算它們的乘積 C A * B。 那么這個過程所需的計算量是多少&#xff1f; 1. 結果矩陣的尺寸 首先&#xff0c;結果矩陣 C 的尺寸是由第一個矩陣的行數…

NeRF-Lidar實景重建:大疆Mavic 4 Pro低成本建模方案(2025實戰指南)

摘要 面對傳統激光雷達建模??成本高昂??&#xff08;單設備超$20萬&#xff09;與??操作復雜??的行業痛點&#xff0c;本文提出基于消費級無人機大疆Mavic 4 Pro的??NeRF-LiDAR融合重建方案??&#xff0c;實現厘米級精度建模成本降低至1/10。核心技術突破在于&…

x64dbg設置條件斷點

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、x64是什么?二、條件斷點1.CreateWindowExW函數設置當窗口名稱為xxx字符串時候break總結前言 提示:這里可以添加本文要記錄的大概內容: x64dbg設置條件斷點 版本 2024 mar 27 提示:以…

RNN人名分類器案例

RNN人名分類器案例 1 任務目的&#xff1a; 目的: 給定一個人名&#xff0c;來判定這個人名屬于哪個國家 典型的文本分類任務: 18分類---多分類任務 2 數據格式 注意&#xff1a;兩列數據&#xff0c;第一列是人名&#xff0c;第二列是國家類別&#xff0c;中間用制表符號&q…

鴻蒙HarmonyOS 關于圖片、視頻的選擇詳解

背景 在聊天軟件中&#xff0c;發送相冊中視頻和照片、用相機拍攝視頻和圖片發送是很常用的功能。在Android和iOS端&#xff0c;大部分應用都通過API方式定義UI來實現相冊選擇照片、視頻&#xff0c;相機拍攝照片、視頻&#xff0c;它們一般都支持以下功能&#xff1a; 相冊選…

iOS 網絡請求斷連重試失敗?抓包分析丟包原因的完整流程

在移動 App 的開發中&#xff0c;中斷網絡環境&#xff08;如切換到飛行模式再回網&#xff09;后&#xff0c;App 在重連過程中有時會出現請求未重新發送或丟包的情況。這類問題難重現、難定位&#xff0c;尤其在 iOS 平臺上更容易被忽視。我們最近就遇到一個用戶反饋“切換網…

使用 DHTMLX Gantt 添加迷你地圖:提升大型項目可視化與導航體驗

在應對數千個任務構成的大型項目時&#xff0c;DHTMLX Gantt 以其卓越的性能表現和流暢渲染能力廣受歡迎。然而&#xff0c;在實際使用中&#xff0c;終端用戶往往需要快速定位到時間線中的特定位置&#xff0c;這在面對龐雜任務結構時尤為困難。為此&#xff0c;DHTMLX 提供了…

ROM修改進階教程------用于自啟腳本來打開系統的一些常用開關等指令 備份收藏 【一】

在定制化rom中。有很多項目需要反編譯系統的相關應用來實現。但有些功能項完全可以使用指令來更改。那么結合自啟腳本就可以很方便的來實現很多功能。網絡雖然有很多類似的指令,但一些相關定制化項目的指令很少見而且不全面。此博文將全面收錄此類指令。方便rom修改用戶借鑒參…

騰訊云TSE注冊中心實戰:Nacos高可用集群搭建與流量治理避坑指南

1. 為什么選擇騰訊云TSE托管Nacos&#xff1f; 在微服務架構中&#xff0c;注冊中心承擔著服務發現與配置管理的核心職能。Nacos作為阿里開源的動態服務發現組件&#xff0c;已成為國內微服務生態的事實標準。騰訊云微服務引擎TSE&#xff08;Tencent Cloud Service Engine&am…

領域驅動設計(DDD)【26】之CQRS模式初探

文章目錄 一 CQRS初探&#xff1a;理解基本概念1.1 什么是CQRS&#xff1f;1.2 CQRS與CRUD的對比1.3 為什么需要CQRS&#xff1f; 二 CQRS深入&#xff1a;架構細節2.1 基本架構組成2.2 數據流示意圖 三 CQRS實戰&#xff1a;電商訂單案例3.1 傳統CRUD方式的訂單處理3.2 CQRS方…