1. 程式人生 > >React技術棧

React技術棧

React 是目前最熱門的前端框架。

  • Facebook 公司2013年推出
  • 現在最好的社群支援和生態圈
  • 大量的第三方工具

React 的優點

  • 元件模式:程式碼複用和團隊分工
  • 虛擬 DOM:效能優勢
  • 移動端支援:跨終端

React 的缺點

  • 學習曲線較陡峭
  • 全新的一套概念,與其他所有框架截然不同
  • 只有採用它的整個技術棧,才能發揮最大威力

總結:React 非常先進和強大,但是學習和實現成本都不低

JSX 語法

React 使用 JSX 語法,JavaScript 程式碼中可以寫 HTML 程式碼。

let myTitle = <h1>Hello, world!</h1>;

JSX 語法解釋

(1)JSX 語法的最外層,只能有一個節點。

// 錯誤
let myTitle = <p>Hello</p><p>World</p>;

(2)JSX 語法中可以插入 JavaScript 程式碼,使用大括號。

let myTitle = <p>{'Hello ' + 'World'}</p>

Babel 轉碼器

JavaScript 引擎(包括瀏覽器和 Node)都不認識 JSX,需要首先使用 Babel 轉碼,然後才能執行。

<script src="react.js"></script
> <script src="react-dom.js"></script> <script src="babel.min.js"></script> <script type="text/babel"> // ** Our code goes here! ** </script>

React 需要載入兩個庫:React 和 React-DOM,前者是 React 的核心庫,後者是 React 的 DOM 適配庫。

Babel 用來在瀏覽器轉換 JSX 語法,如果伺服器已經轉好了,瀏覽器就不需要載入這個庫。

課堂練習:JSX 語法

瀏覽器開啟demos/jsx-demo/index.html,按照《操作說明》,完成練習。

ReactDOM.render(
  <span>Hello World!</span>,
  document.getElementById('example')
);

示例:React 元件

React 允許使用者定義自己的元件,插入網頁。

瀏覽器開啟demos/react-component-demo/index1.html,按照《操作說明》,仔細檢視原始碼。

class MyTitle extends React.Component {
  render() {
    return <h1>Hello World</h1>;
  }
};

ReactDOM.render(
  <MyTitle/>,
  document.getElementById('example')
);

課堂練習:元件的引數

元件可以從外部傳入引數,內部使用this.props獲取引數。

開啟demos/react-component-demo/index2.html,按照《操作說明》,完成練習。

class MyTitle extends React.Component {
  render() {
    return <h1
      style={{color: this.props.color}}
    >Hello World</h1>;
  }
};

<MyTitle color="red" />,

示例:元件的狀態

元件往往會有內部狀態,使用this.state表示。

瀏覽器開啟demos/react-component-demo/index3.html,按照《操作說明》,仔細檢視原始碼。

課堂練習:React 元件實戰

瀏覽器開啟demos/react-component-demo/index4.html,按照《操作說明》,完成練習。

元件的生命週期

React 為元件的不同生命階段,提供了近十個鉤子方法。

  • componentWillMount():元件載入前呼叫
  • componentDidMount():元件載入後呼叫
  • componentWillUpdate(): 元件更新前呼叫
  • componentDidUpdate(): 元件更新後呼叫
  • componentWillUnmount():元件解除安裝前呼叫
  • componentWillReceiveProps():元件接受新的引數時呼叫

我們可以利用這些鉤子,自動完成一些操作。

課堂練習:元件的生命週期

元件可以通過 Ajax 請求,從伺服器獲取資料。Ajax 請求一般在componentDidMount方法裡面發出。

componentDidMount() {
  const url = '...';
  $.getJSON(url)
    .done()
    .fail();
}

開啟demos/react-lifecycle-demo/index.html,按照《操作說明》,完成練習。

React 元件庫

React 的一大優勢,就是網上有很多已經寫好的元件庫,可以使用。

示例:ReCharts

瀏覽器開啟demos/recharts-demo/index.html,按照《操作說明》,仔細檢視原始碼,體會 JSX 語法對錶達複雜元件的優勢。

<LineChart width={1000} height={400} data={data}>
  <XAxis dataKey="name"/>
  <YAxis/>
  <CartesianGrid stroke="#eee" strokeDasharray="5 5"/>
  <Line type="monotone" dataKey="uv" stroke="#8884d8" />
  <Line type="monotone" dataKey="pv" stroke="#82ca9d" />
</LineChart>

React 的核心思想

View 是 State 的輸出。

view = f(state)

上式中,f表示函式關係。只要 State 發生變化,View 也要隨之變化。

React 的本質是將圖形介面(GUI)函式化。

const person = {
  name: "michel",
  age: 31
}

const App = ({ person }) => <h1>{ person.name }</h1>

ReactDOM.render(<App person={person} />, document.body)

React 沒有解決的問題

React 本身只是一個 DOM 的抽象層,使用元件構建虛擬 DOM。

如果開發大應用,還需要解決兩個問題。

  • 架構:大型應用程式應該如何組織程式碼?
  • 通訊:元件之間如何通訊?

架構問題

React 只是檢視層的解決方案,可以用於任何一種架構。

  • MVC
  • MVVM
  • Observer
  • Reactive
  • ...

到底哪一種架構最合適 React ?

通訊問題

元件會發生三種通訊。

  • 向子元件發訊息
  • 向父元件發訊息
  • 向其他元件發訊息

React 只提供了一種通訊手段:傳參。對於大應用,很不方便。

狀態的同步

通訊的本質是狀態的同步。

React 同步狀態的基本方法:找到通訊雙方最近的共同父元件,通過它的state,使得子元件的狀態保持同步。

Flux 架構

Facebook 提出 Flux 架構的概念,被認為是 React 應用的標準架構。

最大特點:資料單向流動。與 MVVM 的資料雙向繫結,形成鮮明對比。

Flux 的核心思想

  • 不同元件的state,存放在一個外部的、公共的 Store 上面。
  • 元件訂閱 Store 的不同部分。
  • 元件傳送(dispatch)動作(action),引發 Store 的更新。

Flux 只是一個概念,有30多種實現。

目前最流行的兩個 React 架構

React 架構的最重要作用:管理 Store 與 View 之間的關係。

  • MobX:響應式(Reactive)管理,state 是可變物件,適合中小型專案
  • Redux:函式式(Functional)管理,state 是不可變物件,適合大型專案

MobX 架構

MobX 的核心是觀察者模式。

  • Store 是被觀察者(observable)
  • 元件是觀察者(observer)

一旦Store有變化,會立刻被元件觀察到,從而引發重新渲染。

MobX 的最簡單例子

const {observable, computed} = mobx;
const {observer} = mobxReact;

const person = observable({name: "張三", age: 31});

const App = observer(
  ({ person }) => <h1>{ person.name }</h1>
);

ReactDOM.render(<App person={person} />, document.body);
person.name = "李四";

程式碼:demos/mobx-demo/browser-demo目錄

示例:MobX

進入demos/mobx-demo目錄,按照《操作說明》,理解 MobX 框架。

UI 層是觀察者,Store 是被觀察者。

Store 所有的屬性,分成兩大類:直接被觀察的屬性和自動計算出來的屬性。

class Store {
  @observable name = 'Bartek';
  @computed get decorated() {
    return `${this.name} is awesome!`;
  }
}

UI 會觀察到 Store 的變化,自動重新渲染。

Redux 架構

Redux 的核心概念

  • 所有的狀態存放在Store。元件每次重新渲染,都必須由狀態變化引起。
  • 使用者在 UI 上發出action
  • reducer函式接收action,然後根據當前的state,計算出新的state

Redux 應用的架構

Redux 層儲存所有狀態,React 元件拿到狀態以後,渲染出 HTML 程式碼。

示例:Redux

進入demos/redux-demo目錄,按照《操作說明》,理解 Redux 框架。

  • Redux 將元件分成 UI 元件和容器元件兩類。
  • UI 元件是純元件,不包含 state 和生命週期方法,不涉及元件的行為,只涉及元件的外觀。
<div className="index">
  <p>{this.props.text}</p>
  <input
    defaultValue={this.props.name}
    onChange={this.props.onChange}
  />
</div>

容器元件正好相反。

  • 不涉及元件的外觀,只涉及元件的行為。
  • 負責訂閱 Store,將 Store 的資料處理以後,再通過引數傳給 UI 元件。
  • 使用者給出配置以後,由 Redux 生成。
// MyComponent 是純的 UI 元件
const App = connect(
  mapStateToProps,
  mapDispatchToProps
)(MyComponent);
  • mapStateToProps: 定義 UI 元件引數與 State 之間的對映
  • mapDispatchToProps:定義 UI 元件與 Action 之間的對映

拆分 UI 元件和容器元件的好處

  • UI 元件與後臺資料無關,可以由設計師負責
  • 容器元件只負責資料和行為,一旦 Store 的資料結構變化,只要調整容器元件即可
  • 表現層和功能層脫鉤,有利於程式碼重用,也有利於看清應用的資料結構和業務邏輯

Reducer 函式

reducer是一個純函式,用來接收action,算出新的state

function reducer(state = {
  text: '你好,訪問者',
  name: '訪問者'
}, action) {
  switch (action.type) {
    case 'change':
      return {
        name: action.payload,
        text: '你好,' + action.payload
      };
  }
}
  • Store由 Redux 提供的createStore方法生成,該方法接受reducer作為引數。
  • 為了把Store傳入元件,必須使用 Redux 提供的Provider元件在應用的最外面,包裹一層。
const store = createStore(reducer);

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.body.appendChild(document.createElement('div'))
);

相關推薦

如何從零學習 React 技術

教授 新人 註冊 將不 hat 前端 案例 產品 代碼   達人課是GitChat的一款輕閱讀產品,由特約講師獨家發布。每一個課程你都可獲得6-12篇的深度文章,同時可在讀者圈與講師互動交流。GitChat達人課,讓技術分享更簡單。    如何從零學習 React 技術棧 

重談react優勢——react技術回顧

alt 轉換函數 表現 組合 dom操作 ould 完成 itl 屬性 react剛剛推出的時候,講react優勢搜索結果是幾十頁。現在,react已經慢慢退火,該用用react技術棧的已經使用上,填過多少坑,加過多少班,血淚控訴也不下千文。今天,再談一遍react優勢,W

深入React技術之setState詳解

丟擲問題 class Example extends Component { contructor () { super() this.state = { value: 0, index: 0 } } componentDidMount ()

React 技術系列教程

上週中秋節,我待在家裡,寫完了 Redux 教程。 至此,《React 技術棧系列教程》算是比較完整了。 ES6 語法:教程 Babel:教程 React:教程,示例庫 Webpack:教程 React 專案腳手架:程

react 技術(全家桶)學習

專案地址 託管在 github 上的專案連結:https://github.com/uncleAndyChen/react-full-stack-learning 託管在 gitee 上的專案連結 :https://gitee.com/uncleAndyChen/react

React 技術學習,redux 知識點

如何合理地設計 state 把整個應用的狀態按照領域(Domain)分成若干子 state,子 state 之間不能儲存重複的資料。 state 以鍵值對的結構儲存資料,以記錄的 key/ID 作為記錄的索引,記錄中的其他欄位都依賴於索引。 state 中不能儲存可以通過已有資料計算而來

React 技術學習,js 知識點

相關函式 hasOwnProperty() 用來檢測一個物件是否含有特定的自身屬性;和 in 運算子不同,該方法會忽略掉那些從原型鏈上繼承到的屬性。 reduce Array的reduce()把一個函式作用在這個Array

《深入React技術》個人總結(打卡一)

雖說已經在用React寫了些專案,起初剛開始的時候並不喜歡react框架(之前是用vue的),到了後面才發現React的好處,深深陷進去了,所以買了本書《深入React技術棧》,細細解讀這款框架的魅力 今天閱讀了第一章節兩小節 1.1.1 React的簡介 react與angular等框

react技術實踐(1)

本文來自網易雲社群作者:汪洋背景最近開發一個全新AB測試平臺,思考了下正好可以使用react技術開發。實踐前技術準備首先遇到一個概念,redux。這貨還真不好理解,大體的理解:Store包含所有資料,檢視觸發一個Action,Store收到Action後,返回一個新的 Sta

React技術之為什麼選擇react

React起源於Facebook公司的內容專案,該公司在嘗試用H5來建設Instagram網站的過程中發現,對於複雜前端h5效能下降明顯,在對市場的mvc框架分析後,依然無法找到滿足自己需求的框架,於是決定自己開發一套,於是就有了之後的React,React於2

React技術

React 是目前最熱門的前端框架。 Facebook 公司2013年推出現在最好的社群支援和生態圈大量的第三方工具 React 的優點 元件模式:程式碼複用和團隊分工虛擬 DOM:效能優勢移動端支援:跨終端 React 的缺點 學習曲線較陡峭全新的一套概念,與其

React 技術系列教程阮一峰

上週中秋節,我待在家裡,寫完了 Redux 教程。 至此,《React 技術棧系列教程》算是比較完整了。 ES6 語法:教程 Babel:教程 React:教程,示例庫 Webpack:教程 React 專案腳手架:程式碼庫 Flex 佈局:教程,示例 CSS Modules:教程,示例庫 Re

react+redux+webpack+git技術

tps .net read nor 無法 mac icon ear es5 1 一、git bash here 2 mdkr 3 cnpm init -y 4 ls -a 5 ls -l 6 ls -la隱藏的也可查看 7 cat packag

React 專案的構建以及技術的應用

1、使用 react-app my-app 腳手架構建React 專案執行環境   當然這裡我們使用react 官方提供的webpack 腳手架工具,這也是大多人的選擇。如果您需要構建自己react 專案,便可大膽應用react 提供的create-r

React-Native學習筆記——技術及簡介

推薦的技術棧順序清單 1、阮一峰es6: http://es6.ruanyifeng.com/   es6中的新特性是後續內容的基礎,重點內容有let關鍵字、解構賦值、建構函式和原型鏈、Promise物件、yield關鍵字、Generator函式、aysnc/await等

React+Redux技術核心要點解析(中篇)

感謝作者郭永峰的授權釋出。 作者:郭永峰,前端架構師,現用友網路 FED團隊負責人,目前主要負責企業級應用前端技術平臺建設工作,在前端工程化實現、Node 應用開發、React技術、移動開發等方向有豐富實踐經驗。Github地址:https://gith

使用react+redux+react-redux+react-router+axios+scss技術從0到1開發一個applist應用

先看效果圖 github地址 github倉庫 線上訪問 初始化專案 #建立專案 create-react-app applist #如果沒有安裝create-react-app的話,先安裝 npm install -g create-react-app 目錄結構改造 |--config |--n

【轉】Java技術

健全 區別 hadoop let 原因 view eba pdf 觀察者 1 java基礎: 1.1 算法 1.1 排序算法:直接插入排序、希爾排序、冒泡排序、快速排序、直接選擇排序、堆排序、歸並排序、基數排序 1.2 二叉查找樹、紅黑樹、B樹、B+樹、LSM樹(分別有對

95後實習生的遠程辦公體驗(asp.net mvcC#技術

合作 第一天 好的 我想 能夠 工作 陽光 宿舍 工作效率 這個月我們做了一件別人看起來很瘋狂的事情,就是讓一批95後的實習生實行遠程辦公,效果還不錯,於是寫此文總結一下。 其實認真算算,我自己的遠程工作經驗有十年了吧,在北京工作的時候天氣不好就申請在

技術

sso jersey doc mobile 數字 miniui 郵箱驗證 ask and shirospring taskjeesite上傳下載郵箱驗證加密權限管理數字簽名短信驗證sso單點登陸shirobootstrappdf在線預覽jerseyshell編程docker