主頁 > 企業開發 > 萬字血書React—走近React

萬字血書React—走近React

2023-03-29 08:02:50 企業開發

配置開發環境

腳手架工具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 = https://www.cnblogs.com/gfhcg/archive/2023/03/28/() => {
  if (loading) {
    return 
loading...
} return
資料加載完成
}
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://www.cnblogs.com/gfhcg/archive/2023/03/28/{`https://robohash.org/${id}`} alt="robot" />
        <h2>{name}</h2>
        <p>{email}</p>
    </div>
    );
}

Immutable

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

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

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/548486.html

標籤:其他

上一篇:webgl 系列 —— 著色器語言

下一篇:vue全家桶進階之路23:Element UI

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more