萬字血書React—走近React

来源:https://www.cnblogs.com/gfhcg/archive/2023/03/28/17265829.html
-Advertisement-
Play Games

配置開發環境 腳手架工具create-react-app 儲備知識:終端或命令行、代碼編輯器 React官方中文文檔 create-react-app 其是基於Node的快速搭建React項目的腳手架工具。 npx create-react-app testdemo cd testdemo npm ...


配置開發環境

腳手架工具create-react-app

儲備知識:終端或命令行、代碼編輯器

React官方中文文檔

create-react-app

其是基於Node的快速搭建React項目的腳手架工具。

npx create-react-app testdemo
cd testdemo
npm i

npx命令是npm v5.2.0引入的一條命令,無需安裝腳手架包,就可以直接使用這個包提供的命令

yarn是Facebook發佈的包管理器,功能與npm相同,具有快速、可靠和安全的特點

React with TypeScript

npx create-react-app testdemo-ts --template typescript
cd testdemo
npm i

About TypeScript

  • TypeScript是JavaScript的超集
  • 給原生JavaScript添加類型檢查
  • 與ES6一樣目前無法被主流瀏覽器直接讀取

Compile TypeScript

編譯器:ts-loader、awesome-typescript-loader以及babel-loader

編譯器配置文件:tsconfig.json

{
  "compilerOptions": {
    "noImplicitAny": false, //不需要顯示地聲明變數的類型any
    "target": "es5", //編譯後的目標js版本
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ], //庫文件,過這些庫文件,告訴typescript編譯器可以使用哪些功能
    "allowJs": true, //允許混合編譯js文件
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true, //允許使用commonJs方式import預設文件
    "strict": true,  
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext", //配置代碼模塊系統,Node.js的commonJs、ES6的esnext、requireJs的AMD
    "moduleResolution": "node",// 決定編譯器的工作方式
    "resolveJsonModule": true,
    "isolatedModules": true, //編譯器會將每個文件作為單獨的模塊使用
    "noEmit": true, //發生錯誤時候,編譯器不會生成Js代碼
    "jsx": "react-jsx" //允許編譯器支持編譯react代碼
  },
  "include": [
    "src"
  ] //使用此選項列出我們需要編譯的文件, “文件路徑”選項需要文件的相對或絕對路徑
}

Update to TypeScript

1、npm install --save typescript @types/node @types/react @types/react-dom @types/jest
2、所有js文件改為jsx文件
3、import react

React基礎

About React

History of FE

HTML、CSS、JavaScript——Ajax——jQuery——Angular MVC——Vue、React MVVM

Why is React?

  • 單向數據流
  1. 你只需要描述UI(HTML)看起來是什麼樣子,就和寫HTML一樣
  2. React負責渲染UI,併在數據變化時更新UI
  • 虛擬DOM

類似於Docker或VMware的Snapshot的快照技術

image

  • 組件化
  1. 保持交互的一致性
  2. 保持視覺風格的統一
  3. 便於程式員之間的協作
  • 學習一次,隨意使用(必殺技)
  1. 使用React可以開發Web應用
  2. 使用React可以開發移動端原生應用(react-native)
  3. 使用React可以開發VR(虛擬現實)(react 360)

What is React?

React是一個用於構建用戶界面(HTML頁面)的JavaScript庫

主要用來寫HTML頁面,或構建Web應用

如果從MVC角度來看,React僅僅是視圖層(V),只負責視圖的渲染,不提供完整的M和C的功能

(經典MVC模式中,M是指業務模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實現代碼分離,從而使同一個程式可以使用不同的表現形式。)

起源:Facebook的內部項目

JSX

What is JSX?

What's this?HTML?JS?

const element = <h1>Hello,world!</h1>

這是ReactJS自創的語言:JSX

  • JSX不是標準的ECMAScript語法,只是語法擴展
  • 對於React項目使用js和jsx都可以
  • ts對應tsx語法

拓展閱讀:react-jsx、react-jsxdev

JSX 其實是React.createElement的語法糖,下圖的兩種寫法完全等價:
image

Why is JSX?

  • React並不強制使用JSX,也可以使用原生的JavaScript
  • React認為視圖的本質是:渲染邏輯與UI視圖表現的內在統一
  • React把HTML與渲染邏輯進行了耦合,形成了JSX

Features of JSX

  • HTML代碼可以與JSX相容
  • 可以在JSX中嵌入表達式
  • 使用JSX指定子元素

Attention

  • React元素的屬性名使用小駝峰命名法
  • 特殊的屬性名:class->className、for->htmlFor、tabindex->tabIndex
  • 如果元素沒有子節點可以用/>結束
  • 推薦使用小括弧包裹JSX,從而避免JS中的自動插入分號陷阱

基本使用

JXS中使用(嵌入)Js表達式

數據存儲在JS中,語法:{JavaScript表達式} 註意:語法是單大括弧

const name = '張三'
// 1、使用JSX創建react元素
const title = <h1>Hello {name}</h1>

//2、渲染react元素
ReactDOM.render(title, document.getElementById('root'))

React DOM 在渲染所有輸入內容之前,預設會進行轉義。它可以確保在你的應用中,永遠不會註入那些並非自己明確編寫的內容。所有的內容在渲染之前都被轉換成了字元串。這樣可以有效地防止 XSS(cross-site-scripting, 跨站腳本)攻擊。

拓展閱讀:如何防止XSS攻擊?

JSX的條件渲染
  • 場景:loading效果
  • 條件渲染:根據條件渲染特點的JSX結構
  • 可以使用if/else或三元運算符或邏輯與運算符來實現
const loadData = () => {
  if (loading) {
    return <div>loading...</div>
  }

  return <div>數據載入完成</div>
}

JSX的列表渲染
  • 應該使用數組的map()方法(映射)
  • 渲染列表時應該添加key屬性,key屬性的值要保證唯一
  • 原則:map()遍歷誰,就給誰加key屬性
  • 註意:儘量避免使用索引號作為key
const songs = [
  { id: 1, name: '愛你' },
  { id: 2, name: '年少有為' },
  { id: 3, name: '南山南' },
]  
// 1、使用JSX創建react元素
const list = (
  <ul>
    {songs.map(item => <li key={item.id}>{item.name}</li>)}
  </ul>
)
JSX的樣式處理

詳見:React的行內樣式與CSS

CSS of React

The way of import css file

  • 直接引入整個css文件
import './index.css'
<div className="app">

使用簡單,但可能會造成樣式的全局污染和樣式衝突。

  • JSS模塊化引入組件
import style from './index.css'
<div className={style.app}>

需要額外配置,ts環境需要配置*.d.ts的類型聲明文件

declare module "*.css" {
    const css: {
        [key: string]: string //約定:導出key所在的對象,原始的類名和內容都會和轉化為這個對象
    };
    export default css;
}

CSS module/JSS

  • 每個jsx或tsx文件被視為一個獨立存在的原件
  • 原件所包含的所有內容也同樣都應該是獨立存在的

拓展閱讀:CSS in Js

CSS & TypeScript

Ts的優勢就是給Js進行類型檢查,那麼通過JSS將CSS轉換為Js對象,是不是也可以給CSS添加類型?

插件:typescript-plugin-css-modules

npm i typescript-plugin-css-modules --save-dev

在tsconfig.json文件compilerOptions新增:

"plugins": [{
   "name":"typescript-plugin-css-modules"
}]

新建.vscode文件夾——新建文件settings

{
    "typescript.tsdk": "node_modules/typescript/lib",
    "typescript.enablePromptUseWorkspaceTsdk": true
}

配置後會發現編寫style也會有隻能提示

Media & fonts

src/assets/images
src/assets/fonts
src/assets/icons

State & Props

Difference

  • props是組件對外的介面,而state是組件對內的介面
  • props用於組件間的數據傳遞,而state用於組件內部的數據傳遞

State

State是組件的“私有屬性”

初始化

//構造函數constructor是唯一可以初始化state的地方
constructor(props){
    super(props);
    this.state = {
        count: 0
    }
}

修改

//使用setState()修改數據,更新組件狀態,調用render函數重新渲染
onClick = {() => {
    this.setState({isOpen: !this.state.isOpen});
}}

非同步更新 同步執行

調用setState後,state不會立即改變,是非同步操作(React會將多個修改合併為一個)。所以,不要依賴當前的State,計算下個State。

setState本身並非非同步,但對state的處理機制給人一種非同步的假象。

onClick = {() => {
    this.setState((preState, preProps) => {
        return {count: preState.count + 1}
    },() => {
        console.log("count" ,this.state.conut)
    });
    
    this.setState((preState, preProps) => {
        return {count: preState.count + 1}
    },() => {
        console.log("count" ,this.state.conut)
    });
}}

Props

本質上,props就是傳入函數的參數,是父組件傳向子組件的數據。

父組件

<ul>
	{robots.map(r => <Robot id={r.id} name={r.name} email={r.email}></Robot>)}
</ul>

子組件

//為Robot指定類型React.FC,FC(functional component)函數式組件的介面,接受泛型參數P(Props)
const Robot: React.FC<RobotProps> = (props) => {
    const id = props.id;
    const name = props.name;
    const email = props.email;
    return (<div className={styles.cardContainer}>
        <img src={`https://robohash.org/${id}`} alt="robot" />
        <h2>{name}</h2>
        <p>{email}</p>
    </div>
    );
}

Immutable

props是只讀的,一旦創建不可被改變,只能通過銷毀、重建來改變數據。

優點:通過判斷記憶體是否一致,來確認對象是否有經過修改,極大提高性能效率

使用Immutable來編寫程式的方式就是函數式編程(組件)。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要: 介紹如何設置採樣大小和表級控制analyze。 本文分享自華為雲社區《GaussDB(DWS) 如何表級控制analyze》,作者:leapdb。 一、控制採樣大小 【設置全局採樣大小】 通過參數default_statistics_target設置全局預設採樣大小。 a.default_s ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 王慶勛 文章來源:GreatSQL社區原創 某銀行客戶在從Oracle遷移到MySQL的開發中,MySQL在READ-COMMITTED隔離級別 ...
  • 事先申明:所有android 類型的學習記錄全部基於《第一行代碼 Android》第三版,在此感謝郭霖老師的書籍幫助。 1.手動創建Activity 在Project類型目錄中尋找到 項目/app/src/main/java/com.example.activitytest 在 com.exampl ...
  • 自動化測試有2種形式,介面自動化和UI自動化。而UI自動化經常會被登錄節點堵塞,例如驗證碼、圖形、滑塊等,儘管有些方式可以識別圖形和定位滑塊位置,但成功率都不高,無法真正意義上實現自動化執行;而http介面的自動化測試前置如果依賴cookie,也無法實現自動化執行。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 背景 項目當中如果做新增/修改/刪除等等操作通常情況下都需要刷新數據或者刷新當前頁面. 思路 (1)如果頁面簡單,調用介面刷新數據即可. (2)如果頁面複雜,需要調用多個介面或者通知多個子組件做刷新,可以採用刷新當前頁面的方式 下麵整理了 ...
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="wi ...
  • Admin.NET 是一套基於Furion/.NET 6實現的通用管理平臺,模塊插件式開發,框架包含了常規的許可權管理、字典等管理模塊,以及一些Vue3的Demo案例,框架前後端分離。後端基於基於Furion/.NET 6實現,底層集成SqlSugar;前端則是採用Vue-Next-Admin的前端框... ...
  • Element UI 是一套基於 Vue.js 的組件庫,它提供了一系列常用的 UI 組件,包括表單、彈窗、佈局、導航等等。Element UI 的設計風格簡潔、易用、美觀,且易於定製。 Element UI 的主要特點包括: 基於 Vue.js 開發,組件易於使用和定製。 提供了豐富的 UI 組件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...