React.js小書總結

(遷移自舊博客2017 08 27)javascript

<h1>第一階段</h1>前端

  • react的組件至關於MVC裏面的View。
  • react.js 將幫助咱們將界面分紅了各個獨立的小塊,每個塊就是組件,這些組件之間能夠組合、嵌套,就成了咱們的頁面。
  • react.js 不是一個框架,它只是一個庫。它只提供 UI (view)層面的解決方案。在實際的項目當中,它並不能解決咱們全部的問題,須要結合其它的庫,例如 Redux、React-router 等來協助提供完整的解決方法。

<!-- more -->java

  • 組件化能夠幫助咱們解決前端結構的複用性問題,整個頁面能夠由這樣的不一樣的組件組合、嵌套構成。
  • react-dom 負責把這個用來描述 UI 信息的 JavaScript 對象變成 DOM 元素,而且渲染到頁面上。
  • 在 JavaScript 寫的標籤的」語法叫 JSX。JSX 是 JavaScript 語言的一種語法擴展,長得像 HTML,但並非 HTML。
  • JSX 其實就是 JavaScript 對象。JSX 在編譯的時候會變成相應的 JavaScript 對象描述。
ReactDOM.render(
  <Header />,
  document.getElementById('root')
)

ReactDOM.render 功能就是把組件渲染而且構造 DOM 樹,而後插入到頁面上某個特定的元素上(在這裏是 id 爲 root 的 div 元素)。react


  • render 方法必需要返回一個 JSX 元素,必需要用一個外層的 JSX 元素把全部內容包裹起來。返回並列多個 JSX 元素是不合法的。
  • 直接在JSX中加入if語句會渲染出無效的javascript。
  • 能夠這麼寫,當即執行函數: { ( ()=>{ if ( i = 0){ ... } } ) ( ) }
<div>
  <Title /> //Title組件
  <Title />
  <Title />
</div>

自定義的組件都必需要用大寫字母開頭,普通的 HTML 標籤都用小寫字母開頭。redux

  • on* 的事件監聽只能用在普通的 HTML 的標籤上,而不能用在組件標籤上。
  • 通常在某個類的實例方法裏面的 this 指的是這個實例自己。

下面這兩種方法均可以綁定事件監聽:設計模式

class Dog extends Component {
  bark () {
    console.log('bark')
  }
  
  run () {
    console.log('run')
  }
  
  handleClick(){
    this.bark();
    this.run();
  }
  
  render () {
    return (<div onClick = {this.handleClick.bind(this)}>DOG</div>)
  }
}

注意return以後的代碼。架構

class Dog extends Component {
  bark () {
    console.log('bark')
  }
  
  run () {
    console.log('run')
  }
  
  handleClick(){
    this.bark();
    this.run();
  }
  
  render () {
    return (<div onClick = {()=>{this.handleClick()}}>DOG</div>)
  }
}

咱們要改變組件的狀態的時候,不能直接用 this.state = xxx 這種方式來修改,若是這樣作 React.js 就沒辦法知道你修改了組件的狀態,它也就沒有辦法更新頁面。因此,必定要使用 React.js 提供的 setState 方法,它接受一個對象或者函數做爲參數。app

...
  constructor (props) {
    super(props)
    this.state = {
      name: 'Tomy',
      isLiked: false
    }
  }

  handleClickOnLikeButton () {
    this.setState({
      isLiked: !this.state.isLiked
    })
  }
...

注:上述方法不會當即更新,不能夠作後續運算。 setState的第二種使用方式:框架

...
  handleClickOnLikeButton () {
    this.setState((prevState) => {
      return { count: 0 }
    })
    this.setState((prevState) => {
      return { count: prevState.count + 1 } // 上一個 setState 的返回是 count 爲 0,當前返回 1
    })
    this.setState((prevState) => {
      return { count: prevState.count + 2 } // 上一個 setState 的返回是 count 爲 1,當前返回 3
    })
    // 最後的結果是 this.state.count 爲 3
  }
...

在使用 React.js 的時候,並不須要擔憂屢次進行 setState 會帶來性能問題。dom


  • List item每一個組件均可以接受一個 props 參數,它是一個對象,包含了全部你對這個組件的配置。
  • 默認配置 defaultProps。
  • props 一旦傳入進來就不能改變。
  • state 是讓組件控制本身的狀態,props 是讓外部對組件本身進行配置。
  • 在 React.js 處理列表就是用 map 來處理、渲染的。
  • 若是一個文件導出的是一個類,那麼這個文件名就用大寫開頭。四個組件類文件導出都是類,因此都是大寫字母開頭。

<h1>第二階段</h1>

當某個狀態被多個組件依賴或者影響的時候,就把該狀態提高到這些組件的最近公共父組件中去管理,用 props 傳遞數據或者函數來管理這種 依賴或着影響的行爲。

React.js 控制組件在頁面上掛載和刪除過程裏面幾個方法:

  • componentWillMount:組件掛載開始以前,也就是在組件調用 render 方法以前調用。
  • componentDidMount:組件掛載完成之後,也就是 DOM 元素已經插入頁面後調用。
  • componentWillUnmount:組件對應的 DOM 元素從頁面中刪除以前調用。

咱們能夠給任意表明 HTML 元素標籤加上 ref 從而獲取到它 DOM 元素而後調用 DOM API。可是記住一個原則:能不用 ref 就不用。

使用自定義組件的時候,能夠在其中嵌套 JSX 結構。嵌套的結構在組件內部均可以經過 props.children 獲取到,這種組件編寫方式在編寫容器類型的組件當中很是有用。而在實際的 React.js 項目當中,咱們幾乎天天都須要用這種方式來編寫組件。

在 React.js 中你須要把 CSS 屬性變成一個對象再傳給元素:

<h1 style={{fontSize: '12px', color: 'red'}}>React.js 小書</h1>

組件的私有方法都用 _ 開頭,全部事件監聽的方法都用 handle 開頭。把事件監聽方法傳給組件的時候,屬性名用 on 開頭。

組件的內容編寫順序以下:(對本身要求嚴格遵照)

  1. static 開頭的類屬性,如 defaultProps、propTypes。
  2. 構造函數,constructor。
  3. getter/setter(還不瞭解的同窗能夠暫時忽略)。
  4. 組件生命週期。
  5. _ 開頭的私有方法。
  6. 事件監聽方法,handle*。
  7. render開頭的方法,有時候 render() 方法裏面的內容會分開到不一樣函數裏面進行,這些函數都以 render 開頭。 render() 方法。

<h1>第三階段</h1> **高階組件**就是一個函數(而不是組件),傳給它一個組件,它返回一個新的組件。新的組件使用傳入的組件做爲子組件。

const NewComponent = higherOrderComponent(OldComponent)

高階組件的做用是用於代碼複用,能夠把組件之間可複用的代碼、邏輯抽離到高階組件當中。新的組件和傳入的組件經過 props 傳遞信息。


一個組件能夠經過 getChildContext 方法返回一個對象,這個對象就是子樹的 context,提供 context 的組件必須提供 childContextTypes 做爲 context 的聲明和驗證。

若是一個組件設置了 context,那麼它的子組件均可以直接訪問到裏面的內容,它就像這個組件爲根的子樹的全局變量。任意深度的子組件均可以經過 contextTypes 來聲明你想要的 context 裏面的哪些狀態,而後能夠經過 this.context 訪問到那些狀態。

context 打破了組件和組件之間經過 props 傳遞數據的規範,極大地加強了組件之間的耦合性。並且,就如全局變量同樣,context 裏面的數據能被隨意接觸就能被隨意修改,每一個組件都可以改 context 裏面的內容會致使程序的運行不可預料。

可是這種機制對於前端應用狀態管理來講是頗有幫助的,由於畢竟不少狀態都會在組件之間進行共享,context 會給咱們帶來很大的方便。一些第三方的前端應用狀態管理的庫(例如 Redux)就是充分地利用了這種機制給咱們提供便利的狀態管理服務。但咱們通常不須要手動寫 context,也不要用它,只須要用好這些第三方的應用狀態管理庫就好了。

Redux是一種新型的前端「架構模式」。常常和 React.js 一併提出,你要用 React.js 基本都要伴隨着 Redux 和 React.js 結合的庫 React-redux。

Redux 和 React-redux 並非同一個東西。Redux 是一種架構模式(Flux 架構的一種變種),它不關注你到底用什麼庫,你能夠把它應用到 React 和 Vue,甚至跟 jQuery 結合都沒有問題。而 React-redux 就是把 Redux 這種架構模式和 React.js 結合起來的一個庫,就是 Redux 架構在 React.js 中的體現。


矛盾:react中不一樣模塊(組件)之間須要共享數據,可能有的模塊(組件)還須要修改這些數據。因此就有了「模塊(組件)之間須要共享數據」和「數據可能被任意修改致使不可意料的結果」之間的矛盾。 因而咱們必須解決這個問題,react.js團隊的作法是提升數據修改的門檻:模塊(組件)之間的共享數據不能隨意修改,只能執行容許的某些修改,並且必須通知我。

function dispatch (action) {
 switch (action.type) {
  case 'UPDATE_TITLE_TEXT':
  appState.title.text = action.text
  break
  case 'UPDATE_TITLE_COLOR':
  appState.title.color = action.color
  break
  default:
  break
     }
  }

全部對數據的操做必須經過dispatch函數。
dispatch

設計模式之觀察者模式: 也被稱做發佈/訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽同一個主題對象。這個主題對象在狀態發生變化時,會通知全部的觀察者對象,使他們可以自動更新本身。

相關文章
相關標籤/搜索