這是一個用來初步瞭解如何經過 React + Mobx 構建應用的 DEMO,經過 Webpack 進行打包。
技術棧: React + Mobx + React-Mobx + SCSS。
因爲剛接觸 React 不久,寫的很差或者有誤還請指出,萬分感謝。react
React 是一個用於構建用戶界面的 JavaScript 框架,也就是說 React 是一個 UI 框架,他把重點放在了 MVC 中的 V(View) 層上。git
React 能夠經過 ES6 的 class 來聲明一個自定義組件,該組件繼承基類 React.Component 的全部屬性和方法。github
class MyComponent extends React.Component { render () { return ( // jsx ) } }
這裏有幾點要強調的地方:編程
1.原生 HTML 標籤以小寫開頭,自定義 React 組件的首字母要大寫。數據結構
2.JSX 語法很相似 XML,它不是必須的,但我以爲用它來編程很方便。框架
3.組件內的 render 函數是必須的,它返回一顆組件樹,最終會被渲染成 HTML。函數
實例化根組件,啓動框架,將虛擬的 DOM 節點掛載到真實的 DOM 節點。工具
ReactDOM.render(jsx, DOM)
class MyComponent extends React.Component { constructor (...arg) { super(...arg) // 定義組件的初始狀態 this.state = { //... name: 'Couzin' } } handlerClick () { // 調用後觸發從新渲染 this.setState = { name: 'HUnter' } } render () { return ( <div> <button onClick="this.handlerClick.bind(this) >click</button> </div> ) } }
state 是組件私有的,能夠經過 setState 來修改 state,而且觸發 View 的從新渲染。this
當一個組件依賴父組件中的數據時,就須要用 props 來傳遞數據了。code
class Father extends React.Component { render () { return ( <div> {/* ... */} <Child author="HUnter" /> </div> ) } } class Child extends React.Component { render () { return ( <div> <p>{this.props.author}</p> </div> ) } }
子組件中經過 this.props 就能夠拿到 props 上的數據了,實現了從 父組件 ------> 子組件的數據傳遞。
另外再說起一下 this.props.children:
class Father extends React.Component { render () { return ( <div> {/* ... */} <Child author="HUnter"> <h1>hello world</h1> </Child> </div> ) } } class Child extends React.Component { render () { return ( <div> <p>{this.props.author}</p> {this.props.children} {/* 至關於<h1>hello world</h1> */} </div> ) } }
也就是說 this.props.children 就是組件內嵌套的元素。
瞭解了上面的這些使用方法,差很少就能夠開始簡單的使用 React 了。
Mobx 是一個狀態管理工具,它能夠把你的應用變爲響應式。
Mobx 提供狀態給 React 使用,下面有一些概念
Mobx 爲現有數據結構添加了可觀察的功能,只須要經過 @observable 這個裝飾器就可使你的屬性變爲可觀察的。
class MyStore { @observable myName = 'hunter' }
任何源自 state 而且不會再有進一步相互做用的東西就是衍生。Mobx 有兩種類型的衍生:
computed values 從當前可觀察狀態中衍生出的值。
reactions 當前狀態改變時要發生的反作用。
當相關數據變化時會自動更新。經過 @computed 裝飾器調用的 setter/getter 函數進行使用。
class MyStore { @observable myName = 'HUnter' @computed get getNameLength () { return this.myName.length } }
reactions 與 computed values 相比起來使用較少,它是當前狀態改變所觸發的反作用。
只有在 actions 中,才能夠修改 Mobx 中 state 的值。注意當你使用裝飾器模式時,@action 中的 this 沒有綁定在當前這個實例上,要用過 @action.bound 來綁定 使得 this 綁定在實例對象上。
@action.bound setName () { this.myName = 'HUnter' }
actions ------> state ------> view
上面簡單介紹了 Mobx 的使用,咱們知道當 React 組件中 state 變化後,要經過 setState 來觸發視圖的更新,Mobx 中定義了 React 組件中的 state 以及如何修改 state,那麼怎麼在 state 改變後觸發視圖的更新呢?Mobx-React 提供了 observer 將 React 組件的轉變爲響應式組件,確保 state 改變時能夠強制刷新組件。作法很簡單:
@observer class MyComponent extends React.Component { // ... }
1.定義 observable state
class Store { @observable data = [] // @computed ... // @action ... }
2.建立視圖
經過 React 建立視圖時,推薦建立無狀態組件,即組件內沒有內部的 state 和 生命週期函數。理想狀況下,大部分組件都應該是無狀態組件,僅經過 props 得到數據。
@observer class MyComponent extends React.Component { }
3.經過調用 Mobx 中的 actions 改變狀態。
@observer class MyComponent extends React.Component { render () { let store = { this.props } return ( <div> <input onChange={store.setName} /> </div> ) } }
上面大體講了如何簡單使用 React + Mobx 來實現一個簡單的應用,描述的比較淺顯。具體源碼請見 github。