1. 程式人生 > >React+mobx入門教程

React+mobx入門教程

名字完全是為了SEO優化...

談不上是教程,就說說我的理解,按照我的理解,也許你能入門快點。

我剛接觸React的時候,第一個問題是我為什麼要用他,這是我的習慣。

從很多角度上來講我覺得React理念不錯,但是並沒有什麼卵用,當然,學來裝逼還是不錯的。

首先從實現的角度講,我可以用JS、JQ、CSS實現我能接觸的專案,全世界70%的專案複雜度都很低。

從速度角度,想用好React相當於要接觸一個龐大的技術棧,學習成本很高的。

所以,我很早就知道React,卻從來都沒學。

這回因為換了一家公司,專案需要,我就學了,比如:node,ES6,Koa(以及Koa的各種模組),webpack(各種外掛和loader),React,mobx...

時間還好吧,不到10天我就開始有改bug的能力了,而且我還寫了一個差不多的腳手架(直接可以寫程式碼,自動打包,熱部署)。

其實React本身還挺簡單的,只是React的話,推薦阮一峰前輩的React入門:http://www.ruanyifeng.com/blog/2015/03/react.html

React想說的就兩件事:元件,狀態。

1.所有的內容都是以元件為單位的。

2.使用者操作引起狀態的變化,狀態引起元件的變化(重新渲染)。

知道這兩點,加上幾個demo,你就可以使用React了,但是你實際用起來就會發現一些問題。

最大的問題就是:元件之間怎麼交流?(包括父子,兄弟)

從React的角度來說,沒有什麼好的解決方案,網上有一些,不過我沒仔細看(能知道終極解決方案,我就不浪費時間學半成品了)

終極解決方案:mobx

看到這,如果你沒看阮一峰前輩的入門教程,就別繼續看了。

React的元件都有一個state屬性,這就是React元件的狀態了,只要狀態改變了,就會觸發render重新渲染。

於是你寫了以下程式碼:(ES6語法哈~可以百度ES6 React)

import React from 'react';
class Try extends React.Component{
    state = {
        number: 0
    }

    render (){
        return (<div onClick={ this.addNumber.bind(this) }>數字:{ this.state.number }</div>);
    }

    addNumber(){
        this.setState({number: this.state.number+=1});
    }
}

就這點程式碼,你可以反覆嘗試一下,比如類名第一個字母小寫;改變state用this.state.number += 1;onClick寫成onclick。別問我怎麼知道的,都是淚。

這是一個元件,你可以不用mobx也沒關係,但是如果兩個元件溝通呢?

render( <div> <Rtbox0 /><Rtbox1 /> </div> );

這種情況,Rtbox0要改變Rtbox1的狀態怎麼辦?Rtbox0改完Rtbox1,Rtbox1又改另外的元件,另外的元件又改Rtbox0怎麼辦?

所以大家要把狀態共享出來,或者說,得弄個小廣播,一個元件狀態改變了,在一個公共的地方喊一聲,我變了!其他的元件根據他的變化做一些動作。

mobx乾的就是這麼一件事,網上說的都太官方,而且基本上都是翻譯老外的文章。

所以,mobx只是一個程式設計師在遇到上面的問題後想出的解決方案。

如果是你怎麼解決?

mobx是這樣的:在引用元件之前,定義一個東西,可以是任何東西,當然,這個東西經過加工過(mobx-react),然後傳入想用這個東西的元件

這個元件必須是經過mobx修飾的。

這時候,你傳入的東西,作用於是全域性的,也就是一旦變化了,誰都能感知,我估計,mobx修飾元件就是把這個全域性的跟元件內的state做關聯

全域性的變了,區域性的也變了,進而觸發區域性的render。

我理解的大致就是這樣,mobx實現這個功能的原理我還沒資本研究。

總結

說了一大堆,可能廢話居多。

總結起來我現在寫React的方式就是:

由於資料的變化引起的元件變化,要使用mobx,在引入元件之前建立一個什麼東西共享。比如:登入以後,使用者資訊所有元件共享

如果是元件內部變化引起的元件變化,就使用內部的state就可以了,不要去影響全域性。比如:點選某個地方顯示一些東西,就元件內部自己處理吧

我還是感覺React和mobx的這種合作很原始,就像是一個孩子剛學會咀嚼,還不會評價味道。