Mobx入門(二)

概念回顧

observable 類似于 store
observer 是裝飾后的react組件
action 用來改變 observable 的狀態(tài)

Class聲明 Observerable

class AppState {
    @observable timer = 2
    @action clearTimer() {
        this.timer = 0
    }
}

var appState = new AppState()
@observer
class App extends React.Component {
  componentDidMount() {
    this.props.appState.timer++

  }
  render() {
    return (
      <div>
        <div className="App">
          <h1>Time passed: {this.props.appState.timer}</h1>
        </div>
      </div>
    );
  }
};

ReactDOM.render(<App appState={appState} />, document.getElementById('root'));

組件內(nèi)定義局部observerable

@observer
class TodoList extends React.Component {
  @observable newTodoTitle = "";

  render() {
    return (
      <div>
        <form onSubmit={this.handleFormSubmit}>
          New Todo:
          <input
            type="text"
            value={this.newTodoTitle}
            onChange={this.handleInputChange}
          />
          <button type="submit">Add</button>
        </form>
        <hr />
        <ul>
          {this.props.store.todos.map(todo => (
            <Todo todo={todo} key={todo.id} />
          ))}
        </ul>
        Tasks left: {this.props.store.unfinishedTodoCount}
      </div>
    );
  }

  @action
  handleInputChange = e => {
    this.newTodoTitle = e.target.value;
  };

  @action
  handleFormSubmit = e => {
    this.props.store.addTodo(this.newTodoTitle);
    this.newTodoTitle = "";
    e.preventDefault();
  };
}

computed

class AppState {
    @observable timer = 2
    @computed get timessTwo() {
        return this.timer * 2
    }
    set timessTwo(timessTwo) {
        this.timer = timessTwo / 2
    }
}
@observer
class App extends React.Component {
  componentDidMount() {
    this.props.appState.timessTwo++
  }
  render() {
    return (
      <div>
        <div className="App">
          <h1>Time passed: {this.props.appState.timer}</h1>
          <h2>after times 2 :{this.props.appState.timessTwo}</h2>
        </div>
      </div>
    );
  }
};

autorun & reaction

監(jiān)聽

autorun(() => {
    console.log(appState.timer)
})
const reaction1 = reaction(
    () => appState.timer ,
    timer => console.log(`reaction 1: ${timer}`)
);

開發(fā)工具

cnpm i mobx-react-devtools
import DevTools from "mobx-react-devtools";

{process.env.NODE_ENV !== 'production' ? <DevTools /> : null}

嚴格模式

import { configure } from "mobx";
configure({ enforceActions: true }) // 不允許在action之外進行狀態(tài)修改

異步

1 runInAction

mobx.configure({ enforceActions: true })

class Store {
    @observable githubProjects = []
    @observable state = "pending" // "pending" / "done" / "error"

    @action
    fetchProjects() {
        this.githubProjects = []
        this.state = "pending"
        fetchGithubProjectsSomehow().then(
            projects => {
                const filteredProjects = somePreprocessing(projects)
                // 將‘“最終的”修改放入一個異步動作中
                runInAction(() => {
                    this.githubProjects = filteredProjects
                    this.state = "done"
                })
            },
            error => {
                // 過程的另一個結(jié)局:...
                runInAction(() => {
                    this.state = "error"
                })
            }
        )
    }
}

2 await/async

class Store {
    @observable githubProjects = []
    @observable state = "pending" // "pending" / "done" / "error"

    @action
    async fetchProjects() {
        this.githubProjects = []
        this.state = "pending"
        try {
            const projects = await fetchGithubProjectsSomehow()
            const filteredProjects = somePreprocessing(projects)
            // await 之后态秧,再次修改狀態(tài)需要動作:
            runInAction(() => {
                this.state = "done"
                this.githubProjects = filteredProjects
            })
        } catch (error) {
            runInAction(() => {
                this.state = "error"
            })
        }
    }
}

3 flow(generator function)

class Store {
    @observable githubProjects = []
    @observable state = "pending"

    fetchProjects = flow(function * () { // <- 注意*號宪躯,這是生成器函數(shù)!
        this.githubProjects = []
        this.state = "pending"
        try {
            const projects = yield fetchGithubProjectsSomehow() // 用 yield 代替 await
            const filteredProjects = somePreprocessing(projects)
            // 異步代碼塊會被自動包裝成動作并修改狀態(tài)
            this.state = "done"
            this.githubProjects = filteredProjects
        } catch (error) {
            this.state = "error"
        }
    })
}

tip

使用大量的小組件

@observer 組件會追蹤它們使用的所有值概疆,并且當它們中的任何一個改變時重新渲染圈驼。 所以你的組件越小匣椰,它們需要重新渲染產(chǎn)生的變化則越小;這意味著用戶界面的更多部分具備彼此獨立渲染的可能性顺呕。

腳手架

https://github.com/mobxjs/mobx-react-boilerplate

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末必搞,一起剝皮案震驚了整個濱河市必指,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恕洲,老刑警劉巖塔橡,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霜第,居然都是意外死亡葛家,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門泌类,熙熙樓的掌柜王于貴愁眉苦臉地迎上來癞谒,“玉大人,你說我怎么就攤上這事刃榨〉猓” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵枢希,是天一觀的道長桌吃。 經(jīng)常有香客問我,道長苞轿,這世上最難降的妖魔是什么茅诱? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任逗物,我火速辦了婚禮,結(jié)果婚禮上瑟俭,老公的妹妹穿的比我還像新娘翎卓。我一直安慰自己,他們只是感情好摆寄,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布莲祸。 她就那樣靜靜地躺著,像睡著了一般椭迎。 火紅的嫁衣襯著肌膚如雪锐帜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音智政,去河邊找鬼蝙斜。 笑死,一個胖子當著我的面吹牛蛮拔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痹升,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼建炫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疼蛾?” 一聲冷哼從身側(cè)響起肛跌,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎察郁,沒想到半個月后衍慎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡皮钠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年稳捆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麦轰。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡乔夯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出款侵,到底是詐尸還是另有隱情末荐,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布喳坠,位于F島的核電站鞠评,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壕鹉。R本人自食惡果不足惜剃幌,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一聋涨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧负乡,春花似錦牍白、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至切省,卻和暖如春最岗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朝捆。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工般渡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芙盘。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓驯用,卻偏偏與公主長得像,于是被迫代替她去往敵國和親儒老。 傳聞我的和親對象是個殘疾皇子蝴乔,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容