React 入門教程:構建第一個 React 應用

本教程將帶你從零開始構建你的第一個 React 應用。我們將創建一個簡單的計數器應用,涵蓋 React 的基本概念和開發流程。

準備工作

在開始之前,請確保你的開發環境滿足以下要求:

  • Node.js (建議使用最新的 LTS 版本)

  • npm 或 yarn (Node.js 安裝時會自帶 npm)

  • 代碼編輯器 (如 VS Code)

第一步:創建 React 應用

React 官方推薦使用?create-react-app?工具來快速搭建項目:

npx create-react-app my-first-react-app
cd my-first-react-app
npm start

執行這些命令后,你的默認瀏覽器應該會自動打開?http://localhost:3000?并顯示 React 的歡迎頁面。

第二步:理解項目結構

讓我們看一下?create-react-app?生成的主要文件和目錄:

my-first-react-app/
├── node_modules/     # 所有依賴項
├── public/           # 靜態文件
│   ├── index.html    # 主HTML文件
│   └── ...
├── src/              # React 源代碼
│   ├── App.js        # 主React組件
│   ├── index.js      # 應用入口點
│   └── ...
├── package.json      # 項目配置和依賴
└── ...

第三步:創建第一個組件

讓我們修改?src/App.js?來創建我們的計數器組件:

import React, { useState } from 'react';function App() {// 使用 useState Hook 來管理狀態const [count, setCount] = useState(0);// 增加計數const increment = () => {setCount(count + 1);};// 減少計數const decrement = () => {setCount(count - 1);};// 重置計數const reset = () => {setCount(0);};return (<div style={{ textAlign: 'center', marginTop: '50px' }}><h1>我的第一個 React 應用</h1><h2>計數器: {count}</h2><button onClick={increment} style={{ margin: '5px' }}>增加</button><button onClick={decrement} style={{ margin: '5px' }}>減少</button><button onClick={reset} style={{ margin: '5px' }}>重置</button></div>);
}export default App;

第四步:理解代碼

讓我們分解一下這個簡單的組件:

  1. 導入 Reactimport React, { useState } from 'react';?- 導入 React 和 useState Hook

  2. 函數組件:我們使用函數式組件而不是類組件,這是 React 的現代寫法

  3. useState Hookconst [count, setCount] = useState(0);?創建了一個狀態變量?count?和更新它的函數?setCount,初始值為 0

  4. 事件處理:我們定義了三個函數來處理按鈕點擊事件,分別用于增加、減少和重置計數器

  5. JSX:返回的 JSX 描述了 UI 的結構和外觀

第五步:運行應用

確保你的開發服務器正在運行(如果沒有,使用?npm start?啟動它)。你應該能在瀏覽器中看到:

  • 一個標題 "我的第一個 React 應用"

  • 顯示當前計數的文本

  • 三個按鈕:增加、減少和重置

嘗試點擊這些按鈕,觀察計數器的變化。

第六步:添加樣式

讓我們為計數器添加一些基本樣式。在?src/App.js?中,我們可以添加 CSS-in-JS 樣式:

// 在 return 語句前定義樣式對象
const styles = {container: {textAlign: 'center',marginTop: '50px',fontFamily: 'Arial, sans-serif'},counter: {fontSize: '48px',margin: '20px 0',color: '#333'},button: {padding: '10px 20px',fontSize: '16px',margin: '5px',cursor: 'pointer',backgroundColor: '#61dafb',border: 'none',borderRadius: '5px',color: 'white'},buttonHover: {backgroundColor: '#4fa8d3'}
};// 然后修改 JSX 部分
return (<div style={styles.container}><h1>我的第一個 React 應用</h1><h2 style={styles.counter}>計數器: {count}</h2><button onClick={increment} style={styles.button}onMouseOver={(e) => e.target.style.backgroundColor = styles.buttonHover.backgroundColor}onMouseOut={(e) => e.target.style.backgroundColor = styles.button.backgroundColor}>增加</button>{/* 其他按鈕類似 */}</div>
);

第七步:組件拆分

隨著應用增長,最好將組件拆分為更小的可重用部分。讓我們創建一個單獨的?Counter?組件:

  1. 創建?src/components/Counter.js:

    import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);const increment = () => setCount(count + 1);const decrement = () => setCount(count - 1);const reset = () => setCount(0);return (<div style={{ textAlign: 'center', margin: '20px' }}><h2>計數器: {count}</h2><button onClick={increment}>增加</button><button onClick={decrement}>減少</button><button onClick={reset}>重置</button></div>);
    }export default Counter;
  2. 修改?src/App.js:

    import React from 'react';
    import Counter from './components/Counter';function App() {return (<div style={{ textAlign: 'center', marginTop: '50px' }}><h1>我的第一個 React 應用</h1><Counter /></div>);
    }export default App;

第八步:添加多個計數器

現在我們可以輕松地添加多個計數器實例:

function App() {return (<div style={{ textAlign: 'center', marginTop: '50px' }}><h1>我的第一個 React 應用</h1><Counter /><Counter /><Counter /></div>);
}

每個計數器都有自己獨立的狀態!

第九步:測試與部署

添加單元測試

React 應用通常使用 Jest 和 React Testing Library 進行測試。CRA 已經配置好了這些工具。

創建?src/components/Counter.test.js

import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import Counter from './Counter';test('計數器初始值正確', () => {const { getByText } = render(<Counter initialValue={5} />);expect(getByText('當前值: 5')).toBeInTheDocument();
});test('增加按鈕工作正常', () => {const { getByText } = render(<Counter />);fireEvent.click(getByText('+'));expect(getByText('當前值: 1')).toBeInTheDocument();
});

運行測試:

npm test

構建生產版本

準備部署時,運行:

npm run build

這會:

  1. 優化代碼(壓縮、tree-shaking 等)

  2. 生成靜態文件到?build?目錄

  3. 準備好部署到任何靜態文件服務器

部署選項

有多種方式可以部署 React 應用:

  1. Vercel:最簡單的部署平臺之一

    npm install -g vercel
    vercel
  2. Netlify:拖放?build?文件夾到 Netlify

  3. GitHub Pages

    • 安裝?gh-pagesnpm install gh-pages --save-dev

    • 在?package.json?中添加:

      "homepage": "https://username.github.io/repo-name",
      "scripts": {"predeploy": "npm run build","deploy": "gh-pages -d build"
      }
    • 運行?npm run deploy

React 生態系統豐富而充滿活力,持續學習和實踐是掌握它的關鍵。記住,最好的學習方式是構建真實項目——嘗試擴展這個計數器應用,或者開始一個全新的項目!?

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

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

相關文章

vue3中,element-plus中el-input的v-model和value的用法示例

el-input的v-model&#xff0c;邦定響應式變量 <el-col :span"6"><el-form-item label"檢驗類別" prop"verifyType"><el-input v-model"applyAllInfo.applyBasicInfo.verifyTypeName" readonly /></el-form-item…

策略模式隨筆~

若感行文枯燥&#xff0c;請移步至文末Gitee地址中查看源碼自行測試感受策略模式之魅力。 一、策略模式的核心概念 策略模式的定義 定義算法族&#xff0c;封裝每個算法&#xff0c;使其可互換。 核心三要素 Context&#xff1a;上下文&#xff0c;負責接收客戶端請求并委托…

Linux的目錄結構(介紹,具體目錄結構)

目錄 介紹 具體目錄結構 簡潔的目錄解釋 詳細的目錄解釋 介紹 Linux的文件系統是采用級層式的樹狀目錄結構&#xff0c;在此結構的最上層是根目錄“/”。Linux的世界中&#xff0c;一切皆文件&#xff08;比如&#xff1a;Linux會把硬件映射成文件來管理&#xff09; 具體目…

AWS CloudFront加速S3配置跨域

1、點擊分配 源我們就選擇S3–>選擇我們要加速的S3存儲桶 2、創建OAC訪問方式 在我們的來源訪問處–>來源訪問控制設置(推薦)–>選擇創建新的OAC(Create new OAC)–>自定義名字按默認選項保存–>選擇剛剛新創建的OAC 3、選擇查看器的配置 根據具體情況&#x…

進程控制(上)【Linux操作系統】

進程控制 寫時拷貝 本質是一種減少深拷貝的方法 Linux中有很多拷貝的場景都用得上寫時拷貝&#xff0c;下面以創建子進程時的寫時拷貝為例&#xff1a; 子進程被創建的時候&#xff1a; 會繼承父進程的mm_struct和頁表 所以子進程剛剛繼承時&#xff0c;父子進程的代碼和數據…

Flutter 強制橫屏

在 Flutter 中&#xff0c;可以通過設置 SystemChrome 來強制應用橫屏顯示。以下是實現這一功能的詳細步驟和代碼示例&#xff1a; 步驟 1&#xff1a;導入必要的包 確保在文件頂部導入了 services.dart 包&#xff0c;因為 SystemChrome 類位于該包中。 import package:flut…

Git完全指南:從入門到精通版本控制 ------- Git核心命令(6)

Git核心命令完全指南&#xff1a;從入門到高效協作 前言 在軟件開發領域&#xff0c;Git已成為現代版本控制的代名詞。據統計&#xff0c;全球超過90%的開發團隊使用Git進行代碼管理。然而&#xff0c;許多開發者僅停留在基礎命令的機械使用層面&#xff0c;未能真正掌握Git命…

關于Newtonsoft.Json

歷史 Newtonsoft.Json&#xff08;也稱為 Json.NET&#xff09;是由 James Newton - King 開發的一個開源的 JSON 處理庫&#xff0c;它于 2007 年首次發布。在早期&#xff0c;.NET 平臺缺乏一個強大且靈活的 JSON 處理工具&#xff0c;Newtonsoft.Json 應運而生&#xff0c;…

git reset詳解

一、git reset 的核心作用 用于 移動當前分支的 HEAD 指針 到指定的提交&#xff0c;并可選擇是否修改工作區和暫存區。 ?? 注意&#xff1a;若提交已被推送到遠程倉庫&#xff0c;強制重置&#xff08;--hard&#xff09;后需謹慎操作&#xff0c;避免影響協作。 二、三種模…

【unity游戲開發入門到精通——UGUI】CanvasScaler畫布縮放器組件

注意&#xff1a;考慮到UGUI的內容比較多&#xff0c;我將UGUI的內容分開&#xff0c;并全部整合放在【unity游戲開發——UGUI】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 一、CanvasScaler畫布縮放器組件是什么二、CanvasScaler的三種適配模式1、Cons…

Kubernetes控制平面組件:API Server Webhook 授權機制 詳解

云原生學習路線導航頁&#xff08;持續更新中&#xff09; kubernetes學習系列快捷鏈接 Kubernetes架構原則和對象設計&#xff08;一&#xff09;Kubernetes架構原則和對象設計&#xff08;二&#xff09;Kubernetes架構原則和對象設計&#xff08;三&#xff09;Kubernetes控…

Python自動化辦公

第五篇&#xff1a;Python自動化辦公&#xff1a;10行代碼搞定重復性工作 適合讀者&#xff1a;職場人士、數據分析師 | 閱讀時長&#xff1a;12分鐘 引言 每天重復處理Excel、PDF或郵件&#xff1f;Python可以幫你自動化這些枯燥任務&#xff0c;節省90%的時間。本文通過實際…

【3】k8s集群管理系列--包應用管理器helm之chart資源打包并推送到harbor鏡像倉庫

一、chart資源打包 helm package ./web-chart # 當前目錄會生成一個tgz的壓縮文件二、安裝help push插件&#xff08;用于推送前面打包的文件&#xff0c;到鏡像倉庫&#xff09; .1 下載help-push二進制文件 wget https://github.com/chartmuseum/helm-push/releases/down…

【SpringBoot Druid Mysql多數據源整合】

SpringBoot Druid Mysql多數據源整合 一、背景二、配置結果2.1 SpringBoot java 類配置2.1.1 啟動類配置2.1.2 java Config配置 2.2 SpringBoot yml 配置 三、mybatis插件配置3.1 PageHelper的yml配置3.2 mybatis設置自定義字段默認值 四、配置解釋 一、背景 公司項目需要連接另…

GGML源碼逐行調試(中)

目錄 前言1. 簡述2. 加載模型超參數3. 加載詞匯表4. 初始化計算上下文5. 初始化計算后端6. 創建模型張量7. 分配緩沖區8. 加載模型權重結語下載鏈接參考 前言 學習 UP 主 比飛鳥貴重的多_HKL 的 GGML源碼逐行調試 視頻&#xff0c;記錄下個人學習筆記&#xff0c;僅供自己參考&…

kubectl的使用

查看集群有多少節點 kubectl get nodes 獲取集群狀態的摘要信息&#xff08;組件信息&#xff09; kubectl get cs 查看所有命名空間下的所有pod的狀態和信息 kubectl get pods --all-namespaces 查看所有命名空間的狀態和信息 kubectl get namespaces /ns 查看kube-system…

git在分支上會退到某個指定的commit

1、在idea上先備份好分支&#xff08;基于現有分支new branch&#xff09; 2、在gitlab管理端刪除現有分支 3、在idea中大卡terminal&#xff0c;執行 git log 查看commit log ,找到要會退到的commit唯一碼&#xff0c;然后執行git reset 唯一碼 4、查看本地代碼狀態 git st…

動態路由, RIP路由協議,RIPv1,RIPv2

動態路由 1、回顧 路由&#xff1a;從源主機到目標主機的過程 源主機發送數據給目標主機&#xff0c;源主機會查看自身的路由信息 如果目標主機是自己同網段&#xff0c;源主機查看的是直連路由 如果目標主機和自己不同網段&#xff0c;源主機查看的是靜態路由、動態路由、默…

前端面試-工程化(webpack、vite)

Webpack 相關問題&#xff08;25道&#xff09; Webpack 的核心概念有哪些&#xff1f;&#xff08;Entry、Output、Loader、Plugin、Module、Bundle&#xff09;如何配置 Webpack 的多入口和多出口&#xff1f;Webpack 的 Tree Shaking 實現原理是什么&#xff1f;Loader 和 …

idea 2024 build菜單不見了

Q如題 idea 2024 新版UI添加build和recompile菜單 A如圖&#xff0c;右鍵頂部欄之后&#xff0c;點擊Add to Main Toolbar菜單&#xff0c;在里面就能找到Build菜單&#xff0c;添加接口。 Recompile菜單的話在Customize Toolbar中搜索添加才行。