摘要:則是最優秀的解決方案之一。衍生任何源自狀態并且不會再有任何進一步的相互作用的東西就是衍生。例如事件觸發,數據請求等。通常的流程是改變狀態,狀態改變時,需要監聽到狀態的改變,并在上做出一致的響應。利用也能將狀態轉變為可觀察對象。
當網頁邏輯變得更復雜,頁面的狀態管理將變成一個難題。
因此,不斷有新的狀態管理解決方案出現在我們的視野。MobX則是最優秀的解決方案之一。
安裝
cnpm install mobx --save
基本概念:
狀態
在一個項目中,我們可能會用一個index變量來控制列表中的某一項顯示為選中狀態。那么這個index變量就可以認為是一個狀態值。當我們想要控制更多的元素,那么則需要更多的狀態值,許多狀態值或者數據組成的對象,就可以理解為一個項目的狀態。
我們常常會將所有的狀態值放在一個對象中來統一管理。
var state = { index: 1, todos: [...], isLogin: false // ... }
衍生
任何 源自狀態并且不會再有任何進一步的相互作用的東西就是衍生。
例如在狀態對象中,保存了了需要完成的事件列表todos,以及一個已經完成事件的數量,那么我們就可以衍生出未完成事件的數量。
MobX區分兩種衍生:
Computed: 計算值。
Reactions: 反應,當狀態改變時,需要做哪些UI操作來和狀態的改變保持一致。
動作
動作:action 是指改變狀態的代碼。例如事件觸發,數據請求等。
通常的流程是action改變狀態,狀態改變時,需要監聽到狀態的改變,并在UI上做出一致的響應。
我們可以利用mobx提供的observable將狀態對象轉換為可觀察的對象,這樣我們就能夠借助mobx監聽到狀態的改變,并做出對應的響應了。
observableimport { observable } from "mobx"; var index = 10; // 轉化為可觀察對象 var oIndex = observable(index);
oIndex是變量index的可觀察對象。當我們想要訪問與修改存儲在oIndex中的狀態時。
// 訪問 oIndex.get(); // 10 // 設置 oIndex.set(20); oIndex.get(); // 20autorun
當可觀察對象中保存的值發生變化時,可以在mobx.autorun中被觀察到。例如下面的例子中,用index表示body的邊框寬度。我們將index轉化為可觀察對象,并在不同的時機改變觀察對象的值,并在autorun中,進行對應的UI響應。
import { observable, autorun } from "mobx"; var index = 0; var oIndex = observable(index); autorun(() => { document.body.style.border = `${oIndex.get() * 2}px solid red`; }) oIndex.set(10); setTimeout(() => { oIndex.set(20); }, 1000)
我們發現,當我們想要改變body的邊框時,只需要利用oIndex.set改變狀態值就可以了。這正是響應式編程的特點,我們不再每次狀態改變時,都去執行一次對應的UI改變,我們只需要將UI變化(衍生)定義好,僅僅改變狀態值就行了,MobX幫助我們完成了剩余的其他工作。
computed利用mobx.computed也能將狀態轉變為可觀察對象。但是通常情況下,computed觀察的值,是通過其他已有狀態值衍生而來。
import { observable, autorun, computed } from "mobx"; var index = 0; var oIndex = observable(index); var oComputed = computed(() => oIndex.get() % 2 == 0) autorun(() => { document.body.style.background = oComputed.get() ? "red" : "orange"; }) setInterval(() => { oIndex.set(oIndex.get() + 1) }, 500)
經過這幾個例子,相信大家都已經能感受到可觀察對象中值的變化能夠在autorun中對應到UI變化上,因此后面的例子就直接log出最新的值,不再列出新的UI變化了
在計算總成績,計算總價格等場景,computed也能很好的勝任。
將Object轉化為可觀察對象除了能夠將基礎類型轉化為可觀察對象,observable也能夠將普通對象轉化為可觀察對象。
// 待續
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107138.html
摘要:異步剪貼板操作過去的數年中,各瀏覽器基本上都在使用來進行剪貼板交互。而提供了新的,則為我們提供了另一種異步式的剪貼板操作方式,本文即是對該機制與接口規范的詳細介紹。 showImg(https://segmentfault.com/img/remote/1460000013854167); 前端每周清單第 55 期: MobX 4 特性概覽,iOS Hacks 分享, 分布式事務詳解 ...
摘要:前言初衷以系列故事的方式展現源碼邏輯,盡可能以易懂的方式講解源碼本系列文章用故事解讀源碼一用故事解讀源碼二用故事解讀源碼三用故事解讀源碼四裝飾器和用故事解讀源碼五文章編排每篇文章分成兩大段,第一大段以簡單的偵探系列故事的形式講解所涉及人物場 ================前言=================== 初衷:以系列故事的方式展現 MobX 源碼邏輯,盡可能以易懂的方式...
摘要:當我們想要擴展一個對象的能力時,通??梢酝ㄟ^添加原型方法,修改構造函數,繼承等方式。構造函數繼承戰士戰士的移動血條戰士的移動速度原型的繼承戰士的奔跑動作戰士的基礎攻擊接下來我們要創建裝飾類。 當我們想要擴展一個對象的能力時,通常可以通過添加原型方法,修改構造函數,繼承等方式。除此之外,我們還可以通過妝飾者模式來達到目的。 例如一個游戲角色,我們在不改變這個角色對象的條件下,給角色穿一件...
摘要:最簡單的情況張三的存貸這里我們創建了實例探長實例觀察員這個示例和我們之前在首篇文章用故事解讀源碼一中所用示例是一致的。 ================前言=================== 初衷:以系列故事的方式展現 MobX 源碼邏輯,盡可能以易懂的方式講解源碼; 本系列文章: 《【用故事解讀 MobX源碼(一)】 autorun》 《【用故事解讀 MobX源碼(二)】...
閱讀 2381·2021-10-09 09:41
閱讀 3172·2021-09-26 09:46
閱讀 835·2021-09-03 10:34
閱讀 3151·2021-08-11 11:22
閱讀 3364·2019-08-30 14:12
閱讀 711·2019-08-26 11:34
閱讀 3343·2019-08-26 11:00
閱讀 1749·2019-08-26 10:26