一文帶你了解React框架

前言

由于 React的設計思想極其獨特,屬于革命性創新,性能出眾,代碼邏輯卻非常簡單。所以,越來越多的人開始關注和使用,認為它可能是將來 Web 開發的主流工具。

這個項目本身也越滾越大,從最早的UI引擎變成了一整套前后端通吃的 Web App 解決方案。衍生的 React Native 項目,目標更是宏偉,希望用寫 Web App 的方式去寫 Native App。如果能夠實現,整個互聯網行業都會被顛覆,因為同一組人只需要寫一次UI ,就能同時運行在服務器、瀏覽器和手機。
React主要用于構建UI。你可以在React里傳遞多種類型的參數,如聲明代碼,幫助你渲染出UI、也可以是靜態的HTML DOM元素、也可以傳遞動態變量、甚至是可交互的應用組件。

React具備以下優勢:
1.聲明式設計:React 使創建交互式 UI 變得輕而易舉。為你應用的每一個狀態設計簡潔的視圖,當數據變動時 React 能高效更新并渲染合適的組件
2.組件化: 構建管理自身狀態的封裝組件,然后對其組合以構成復雜的 UI。
3.高效:React通過對DOM的模擬,最大限度地減少與DOM的交互。
4.靈活:無論你現在使用什么技術棧,在無需重寫現有代碼的前提下,通過引入 React 來開發新功能。

讓我們來一起學習吧!

1. React入門

1.1. React的基本認識

1). Facebook開源的一個js庫
2). 一個用來動態構建用戶界面的js庫
3). React的特點Declarative(聲明式編碼)Component-Based(組件化編碼)Learn Once, Write Anywhere(支持客戶端與服務器渲染)高效單向數據流
4). React高效的原因虛擬(virtual)DOM, 不總是直接操作DOM(批量更新, 減少更新的次數) 高效的DOM Diff算法, 最小化頁面重繪(減小頁面更新的區域)

1.2. React的基本使用

1). 導入相關js庫文件(react.js, react-dom.js, babel.min.js)
2). 編碼:<div id="container"></div><script type="text/babel">var aa = 123#  #var bb = 'test'ReactDOM.render(<h1 id={bb}>{aa}</h1>, containerDOM)</script>

1.3. JSX的理解和使用

1). 理解* 全稱: JavaScript XML* react定義的一種類似于XML的JS擴展語法: XML+JS* 作用: 用來創建react虛擬DOM(元素)對象
2). 編碼相關* js中直接可以套標簽, 但標簽要套js需要放在{}中* 在解析顯示js數組時, 會自動遍歷顯示* 把數據的數組轉換為標簽的數組: var liArr = dataArr.map(function(item, index){return <li key={index}>{item}</li>})
3). 注意:* 標簽必須有結束* 標簽的class屬性必須改為className屬性* 標簽的style屬性值必須為: {{color:'red', width:12}}* 必須只有一個根標簽

1.4. 幾個重要概念理解

1). 模塊與組件

1. 模塊:理解: 向外提供特定功能的js程序, 一般就是一個js文件為什么: js代碼更多更復雜作用: 復用js, 簡化js的編寫, 提高js運行效率
2. 組件: 理解: 用來實現特定界面功能效果的代碼集合(html/css/js/img)為什么: 一個界面的功能太復雜了作用: 復用編碼, 簡化項目界面編碼, 提高運行效率

2). 模塊化與組件化

1. 模塊化:當應用的js都以模塊來編寫的, 這個應用就是一個模塊化的應用
2. 組件化:當應用是以多組件的方式實現功能, 這上應用就是一個組件化的應用

2. react組件化開發

2.1. 基本理解和使用

1). 自定義的標簽: 組件類(函數)/標簽
2). 創建組件類//方式1: 無狀態函數(簡單組件, 推薦使用)function MyComponent1(props) {return <h1>自定義組件標題11111</h1>}//方式2: ES6類語法(復雜組件, 推薦使用)class MyComponent3 extends React.Component {render () {return <h1>自定義組件標題33333</h1>}}
3). 渲染組件標簽ReactDOM.render(<MyComp />,  cotainerEle)
4). ReactDOM.render()渲染組件標簽的基本流程React內部會創建組件實例對象/調用組件函數, 得到虛擬DOM對象將虛擬DOM并解析為真實DOM插入到指定的頁面元素內部

2.2. 組件的3大屬性: state

1. 組件被稱為"狀態機", 頁面的顯示是根據組件的state屬性的數據來顯示
2. 初始化指定:constructor() {super()this.state = {stateName1 : stateValue1,stateName2 : stateValue2}}
3. 讀取顯示: this.state.stateName1
4. 更新狀態-->更新界面 : this.setState({stateName1 : newValue})

2.2. 組件的3大屬性: props

所有組件標簽的屬性的集合對象
給標簽指定屬性, 保存外部數據(可能是一個function)
在組件內部讀取屬性: this.props.propertyName
作用: 從目標組件外部向組件內部傳遞數據
對props中的屬性值進行類型限制和必要性限制Person.propTypes = {name: React.PropTypes.string.isRequired,age: React.PropTypes.number.isRequired}
擴展屬性: 將對象的所有屬性通過props傳遞<Person {...person}/>

2.2. 組件的3大屬性: refs

組件內包含ref屬性的標簽元素的集合對象
給操作目標標簽指定ref屬性, 打一個標識
在組件內部獲得標簽對象: this.refs.refName(只是得到了標簽元素對象)
作用: 找到組件內部的真實dom元素對象, 進而操作它

2.3. 組件中的事件處理

1. 給標簽添加屬性: onXxx={this.eventHandler}
2. 在組件中添加事件處理方法eventHandler = (event) => {}
3. 使自定義方法中的this為組件對象在constructor()中bind(this)使用箭頭函數定義方法
4. 事件監聽綁定事件監聽事件名回調函數觸發事件用戶對對應的界面做對應的操作編碼

2.4. 組件的組合使用

1)拆分組件: 拆分界面,抽取組件
2)實現靜態組件: 使用組件實現靜態頁面效果
3)實現動態組件① 動態顯示初始化數據② 交互功能(從綁定事件監聽開始)

2.5. 組件收集表單數據

受控組件: 輸入過程中自動收集數據
非受控組件: 提交時手動讀取數據

2.6. 組件的生命周期

1. 組件的三個生命周期狀態:Mount:插入真實 DOMUpdate:被重新渲染Unmount:被移出真實 DOM
2. 生命周期流程:* 第一次初始化顯示: ReactDOM.render(<Xxx/>, containDom)constructor()componentWillMount() : 將要插入回調render() : 用于插入虛擬DOM回調componentDidMount() : 已經插入回調* 每次更新state: this.setState({})componentWillReceiveProps(): 接收父組件新的屬性componentWillUpdate() : 將要更新回調render() : 更新(重新渲染)componentDidUpdate() : 已經更新回調* 刪除組件: ReactDOM.unmountComponentAtNode(div): 移除組件componentWillUnmount() : 組件將要被移除回調
3. 常用的方法render(): 必須重寫, 返回一個自定義的虛擬DOMconstructor(): 初始化狀態(state={}), 綁定this(可以箭頭函數代替)componentDidMount() : 只執行一次, 已經在dom樹中, 適合啟動/設置一些監聽

在這里插入圖片描述

2.7. 虛擬DOM與DOM diff算法

1). 虛擬DOM是什么?

一個虛擬DOM(元素)是一個一般的js對象, 準確的說是一個對象樹(倒立的)
虛擬DOM保存了真實DOM的層次關系和一些基本屬性,與真實DOM一一對應
如果只是更新虛擬DOM, 頁面是不會重繪的

2). Virtual DOM 算法的基本步驟

用JS對象樹表示DOM樹的結構;然后用這個樹構建一個真正的DOM樹插到文檔當中
當狀態變更的時候,重新構造一棵新的對象樹。然后用新的樹和舊的樹進行比較,記錄兩棵樹差異
把差異應用到真實DOM樹上,視圖就更新了

3). 進一步理解

Virtual DOM 本質上就是在 JS 和 DOM 之間做了一個緩存。
可以類比 CPU 和硬盤,既然硬盤這么慢,我們就在它們之間加個緩存:既然 DOM 這么慢,我們就在它們 JS 和 DOM 之間加個緩存。CPU(JS)只操作內存(Virtual DOM),最后的時候再把變更寫入硬盤(DOM)。
在這里插入圖片描述

2.8. 命令式編程與聲明式編程

聲明式編程只關注做什么, 而不關注怎么做(流程),  類似于填空題
命令式編程要關注做什么和怎么做(流程), 類似于問答題var arr = [1, 3, 5, 7]
// 需求: 得到一個新的數組, 數組中每個元素都比arr中對應的元素大10: [11, 13, 15, 17]
// 命令式編程
var arr2 = []
for(var i =0;i<arr.length;i++) {arr2.push(arr[i]+10)
}
console.log(arr2)
// 聲明式編程
var arr3 = arr.map(function(item){return item +10
})
// 聲明式編程是建立命令式編程的基礎上// 數組中常見聲明式方法map() / forEach() / find() / findIndex()

面試法寶

很多伙伴找到我詢問面試題,問我針對于前端有沒有比較體系化的面試題總結,今天就給大家推薦這款面試法寶
點擊鏈接直達

https://www.nowcoder.com/link/jihexinliang260

就是我們的牛客網,各大互聯網大廠面試真題。從基礎到入階乃至原理刨析類面試題 應有盡有,趕快來裝備自己吧!助你面試穩操勝券,solo全場面試官
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

Web前端JQuery面試題(一)

Web前端JQuery面試題&#xff08;一&#xff09; 一&#xff1a;選擇器 基本選擇器 什么是#id&#xff0c;element&#xff0c;.class&#xff0c;*&#xff0c;selector1, selector2, selectorN&#xff1f;答&#xff1a; 根據給定的id匹配一個元素&#xff0c;用于搜索&…

前端云原生——微信小程序云服務配置

前端同樣涉及云原生前言創建使用云開發項目搭建云環境測試云服務1. 獲取openid&#xff08;上傳本地login云函數&#xff09;1.1 創建部署login文件時報錯2. 自定義sum函數并創建部署3. 上傳圖片4. 前端操作數據庫5. 即時通信demo面試法寶歡迎各位小伙伴們&#xff01; 為大家推…

45天帶你玩轉Node(第一天)初探Node.js

45天帶你玩轉Node 粉絲要求博主系統的寫一篇關于Node.js的學習資料&#xff0c;但其實我們的Node.js知識點并不少&#xff0c;所以博主為大家搭建了一個專欄&#xff0c;為了方便大家系統的學習Node.js&#xff0c;大家記得訂閱哦&#xff01;雖然我們的Node.js還很年輕&#…

VLC的一些接口

其他參考鏈接&#xff1a; 1、https://www.cnblogs.com/smartsensor/p/4343769.html /*Set the video scaling factor。 Zero is a special value; it will adjust the video to the outputwindow/drawable (in windowed mode) or the entire screen. */ 設置縮放系數 void li…

【轉載】 安卓版手機微信如何清理微信空間

在手機微信的使用過程中&#xff0c;隨著手機微信使用的時間越長&#xff0c;手機微信占用的空間越大&#xff0c;其實手機微信存儲了很多聊天記錄包括圖片、視頻等大文件信息&#xff0c;此時如果手機存儲空間比較緊張&#xff0c;可以使用微信自帶的清理工具對手機微信空間進…

45天帶你玩轉Node(第二天)走進Node.js

45天帶你玩轉Node 粉絲要求博主系統的寫一篇關于Node.js的學習資料&#xff0c;但其實我們的Node.js知識點并不少&#xff0c;所以博主為大家搭建了一個專欄&#xff0c;為了方便大家系統的學習Node.js&#xff0c;大家記得訂閱哦&#xff01;雖然我們的Node.js還很年輕&#…

Windows2008安裝組件命令行工具ServerManagerCmd用法介紹

轉自&#xff1a;http://blog.sina.com.cn/s/blog_537de4b5010128al.html Windows2008 安裝組件服務等內容比原來復雜的多&#xff0c;用鼠標點來點去&#xff0c;既繁瑣也緩慢&#xff0c;所幸微軟提供了命令行工具ServerManagerCmd.exe 用法: ServerManagerCmd.exe安裝和刪除…

記錄今天登錄oracle時遇到的一個小問題--不能登錄

因為最近的項目使用的是oracle數據庫&#xff0c;所以我就裝了一個Windows虛擬機&#xff0c;在虛擬機上安裝了oracle 10g。之前一直都是掛起的&#xff0c;今天打開想練練的時候&#xff0c;發現plsql工具連接不上了。 用戶名是scott&#xff0c;密碼是scott&#xff0c;就是連…

深入Vue原理_數據響應式

歡迎各位小伙伴們&#xff01; 為大家推薦一款刷題神奇哦 點擊鏈接訪問牛客網 各大互聯網大廠面試真題。從基礎到入階乃至原理刨析類面試題 應有盡有&#xff0c;趕快來裝備自己吧&#xff01;助你面試穩操勝券&#xff0c;solo全場面試官 數據響應式響應式是什么如何實現數據響…

python scipy樣條插值函數大全(interpolate里interpld函數)

scipy樣條插值 scipy樣條插值1、樣條插值法是一種以可變樣條來作出一條經過一系列點的光滑曲線的數學方法。插值樣條是由一些多項式組成的&#xff0c;每一個多項式都是由相鄰的兩個數據點決定的&#xff0c;這樣&#xff0c;任意的兩個相鄰的多項式以及它們的導數(不包括仇階導…

EKS獨領風騷

前言 隨著公司的逐漸發展&#xff0c;開拓了更加多的子項目與小程序&#xff0c;這些都需要進行宣傳&#xff0c;但是管理以及部署新的應用是一個繁瑣的工程&#xff0c;部署麻煩而且更新業務的時候非常不方面。尤其面向用戶的時候&#xff0c;體驗感很差。于是想要使用docker…

Linux進程管理之ps的使用

主題Linux進程管理之ps工具的使用 一ps工具的介紹 ps: process state 進程狀態ps - report a snapshot of the current processesLinux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中 默認顯示的內容很少 [rootcentos65 ~]# psPID TTY TIME CMD2018 pts/0 …

openstack Q版部署-----安裝報錯問題

1、實例開機提示找不到磁盤Booting from Hard Disk... GRUB. 開啟 CPU 虛擬化支持。 將計算節點 nova.conf 配置修改如下即可&#xff1a; [libvirt] cpu_mode none virt_type qemu重啟服務 systemctl restart libvirtd.service openstack-nova-compute.service 2、錯誤: 超過…

深入Vue原理_雙向數據綁定(視圖/數據)

歡迎各位小伙伴們&#xff01; 為大家推薦一款刷題神奇哦 點擊鏈接訪問牛客網 各大互聯網大廠面試真題。從基礎到入階乃至原理刨析類面試題 應有盡有&#xff0c;趕快來裝備自己吧&#xff01;助你面試穩操勝券&#xff0c;solo全場面試官 文章目錄數據的變化反應到視圖命令式操…

【BZOJ3894】文理分科

已經連續很久沒有當場想出來題了。。。。 $yyb$認為這是一道傻逼題&#xff0c;但是我并不這么認為。。。。 題面 https://www.lydsy.com/JudgeOnline/problem.php?id3894 題解 加點&#xff1a;三叉戟結構的小技巧。 假設割$S$表示不學文&#xff0c;割$T$表示不學理。 對于一…

CodeForces 1131G. Most Dangerous Shark

題目簡述&#xff1a;從左到右依次有$n \leq 10^7$個Domino骨牌&#xff0c;高度為$h_i$&#xff0c;手動推倒他的花費為$c_i$。每個骨牌之間的距離為$1$。一個骨牌可以被向左或者向右推倒。當第$i$個骨牌被推倒時&#xff0c;他會以相同方向推倒與其距離$<h_i$的所有骨牌。…

大廠直通車【C認證】踵磅來襲

歡迎各位小伙伴們&#xff01; 首先為大家推薦一款刷題神奇哦 點擊鏈接訪問牛客網 各大互聯網大廠面試真題。從基礎到入階乃至原理刨析類面試題 應有盡有&#xff0c;趕快來裝備自己吧&#xff01;助你面試穩操勝券&#xff0c;solo全場面試官 你還在以為CSDN僅僅是一個簡簡單單…

理解JavaScript中的原型繼承(2)

兩年前在我學習JavaScript的時候我就寫過兩篇關于原型繼承的博客&#xff1a; 理解JavaScript中原型繼承 JavaScript中的原型繼承 這兩篇博客講的都是原型的使用&#xff0c;其中一篇還有我學習時的錯誤理解。今天看《Understanding Scopes》這讓我從新思考了一下原型繼承&…

深入Vue原理_全面剖析發布訂閱模式

文章目錄發布訂閱模式優化優化思路思考理解發布訂閱模式(自定義事件)收集更新函數觸發更新函數6.5 總結總結寫在最后本期推薦歡迎各位小伙伴們&#xff01; 為大家推薦一款刷題神奇哦 點擊鏈接訪問牛客網 各大互聯網大廠面試真題。從基礎到入階乃至原理刨析類面試題 應有盡有&a…

前端面試系列-JS 異步編程

并發與并行的區別&#xff1f; 并發是宏觀概念&#xff0c;我分別有任務 A 和任務 B&#xff0c;在一段時間內通過任務間的切換完成了這兩個任務&#xff0c;這種情況就可以稱之為并發。并行是微觀概念&#xff0c;假設 CPU 中存在兩個核心&#xff0c;那么我就可以同時完成任務…