【前端前沿看點】微信小程式狀態管理——Redux VS Mobx mvvm完成
一、微信小程式自身的應用狀態是怎樣定義的呢?
page({
data:{
item:'',
isLoading:true
},
onLoad:function(){
this.setData({
isLoading:false
})
}
})
二、為什麼使用應用狀態管理工具?
同一資料,一次請求,應用全域性共享。
MVVM架構開發中清晰的資料流向——單向資料流。
將分散在不同頁面的資料與應用狀態統一管理,共享資料與狀態變化。
適應元件化、模組化開發的資料結構,提高程式碼重複使用率、提高開發效率。
三、應用狀態管理工具有哪些?
前端MVVM架構基礎庫有很多,目前主流的有React、Vue、Angular,不同的庫有不同的應用狀態管理方案,比如React常用的Flux,Redux,Mobx,Vue的Vuex,Angular的ngrx/store,Redux並不是React的專屬,而是針對Redux有最優的解決方案,當然Redux同樣也能移植到其他框架使用,比如可以在微信小程式中使用。
四、微信小程式如何選擇應用狀態管理工具庫?
目前微信有移植的Redux與Mobx來作為應用狀態管理,Redux 和 Mobx 都是當下比較火熱的資料流模型,一個背靠函式式,似乎成為了開源界標配,一個基於面向物件,低調的前行。
函式式 vs 面向物件
函式式的優點:
將資料和處理邏輯分離,程式碼更加簡潔,模組化,可讀性好
易測試、易維護,測試環境容易模擬
邏輯程式碼可複用性強
相對比面向物件的程式設計:
javascript的弱型別,表明它基於物件,不適合完全函式式表達。
數學思維和資料處理適合用函式式,而業務邏輯的處理適合用面向物件。
邏輯嚴謹的函數語言程式設計相當完美,但為了實現具體業務功能不得不寫更多細粒度程式碼來實現,而面向物件的方式更為簡潔和靈活。
Redux vs Mobx
那麼具體到這兩種模型,又有一些特定的優缺點呈現出來。
先來看 Redux 的特點:
reducer
import{ combineReducers }from'redux'
import{ createReducer }from'redux-immutablejs'
import{ fromJS }from'immutable'
import{
EXAMPLE
}from'../constants'
const example = createReducer(fromJS({
title:"專案構建成功"
}),{
[EXAMPLE]:(state, action)=>{
return state
title: action.payload.title
})
}
})
const rootReducer = combineReducers({
example
})
exportdefault rootReducer
action
import{
EXAMPLE
}from'../constants'
function example(val){
return{
type: EXAMPLE,
payload:{
title: val
}
}
}
exportfunction changeTitle(val){
return(dispatch, getState)=>{
dispatch(example(val))
}
}
宣告式程式設計 reducer
純函式 action 無副作用
不可變資料 immutable
對比Mobx:
var extendObservable =require('../libs/mobx').extendObservable;
var apiPath =require('../config/apiPath')
var{formatTime}=require('../utils/tool')
var app = getApp()
var userInfo =function(){
extendObservable(this,{
title:'我的預約',
data:{},
order:[]
})
this.receive =function(){
var that =this
app.getUserInfo(function(userInfo){
that.data = userInfo
})
}
this.getUserOrder =function(){
var that =this
wx.request({
url: apiPath.GETUSERORDER,
method:'GET',
header:{
'Authorization':`Bearer ${wx.getStorageSync('token') || []}`,
'Content-Type':'application/json'
},
success:function(json){
if(json.statusCode ==200){
that.order = json.data
}
},
fail:function(e){
console.log(e)
}
})
}
}
資料流流動不自然,只有用到的資料才會引發繫結,區域性精確更新,但免去了粒度控制煩惱。
想要時間回溯能力需要自建回溯資料較複雜,因為資料只有一份引用。
自始至終一份引用,不需要 immutable,也沒有複製物件的額外開銷。
資料流動由函式呼叫一氣呵成,便於除錯。
由於沒有 magic,所以沒有中介軟體機制,沒法通過 magic 加快工作效率(這裡 magic 是指 action 分發到 reducer 的過程)。
完美支援 typescript。
專案中如何選擇
兩者還有更本質的區別在於Redux將state與action互相獨立,因此一個action可以將資料分發到多個state上,多個state都屬於全域性唯一的store中;而Mobx中action屬於
store定義的object物件,因此只能對自身的state進行資料處理。越複雜的專案Redux的優勢越明顯。
從目前經驗來看,建議前端資料流不太複雜的情況,使用 Mobx,因為更加清晰,實現同一業務的程式碼更少;如果前端資料流極度複雜,建議使用 Redux+immutable,通過中介軟體減緩巨大業務複雜度。另外,用Mobx的時候可以使用typescript來輔助。
五、在小程式中的使用Mobx
在小程式專案中由於小程式框架自身的特性,元件化使用較為複雜,因此不會將頁面切分成細粒度元件,因此使用Mobx對於小程式來說要更為靈活。
index.js
var observer =require('../../libs/observer').observer;
varToast=require('../../components/toast/index')
Page(observer(Object.assign({},Toast,{
props:{
userInfo:require('../../stores/userInfo').default
},
onLoad:function(){
this.props.userInfo.receive()
wx.setNavigationBarTitle({
title:'我的'
})
},
onShow:function(){
this.props.userInfo.getUserOrder()
}
})))
index.wxml
<importsrc="../../components/toast/index.wxml"/>
<templateis="zan-toast"data="{{ zanToast }}"></template>
<viewclass="container">
<viewclass="userinfo">
<imageclass="userinfo-avatar"src="{{props.userInfo.data.avatarUrl}}"background-size="cover"></image>
<textclass="userinfo-nickname">{{props.userInfo.data.nickName}}</text>
</view>
<viewclass="userorder">
<viewclass="userorder-title">{{props.userInfo.title}}</view>
<viewclass="userorder-list">
<viewclass="orderinfo"wx:key="{{index}}"wx:for-index="key"wx:for="{{props.userInfo.order}}">
<viewclass="orderinfo-date">發車時間:{{item.trainDate}}</view>
<viewclass="orderinfo-traininfo">車次資訊:{{item.trainCode+' '+item.startCity+'——'+item.endCity+' '+item.seatName}}</view>
<viewclass="orderinfo-date">預約時間:{{item.created}}</view>
</view>
</view>
</view>
</view>
六、參考文件
相關推薦
【前端前沿看點】微信小程式狀態管理——Redux VS Mobx mvvm完成
一、微信小程式自身的應用狀態是怎樣定義的呢? page({ data:{ item:'', isLoading:true}, onLoad:function(){this.setData({ isLoading:false})}}) 二、為什麼使用應用狀態管理工具? 同一資
【前端前沿看點】深度本質分析對比weex和react native
前言 weex的思想是多個平臺,只寫一套程式碼,而react-native的思想是多個平臺可以寫多套程式碼,但其使用的是同一套語言框架。 weex的目標在於抹平各個平臺的差異性,從而簡化應用開發。而react-native承認了各個平臺之間的差異,退而求其次,在語言和框架層面對平臺進行抽象,從方法論的角
【前端前沿看點】React和Vue深度對比
關於react和vue的對比已經很久了,本人一直是react的重度使用者,為了對比vue和react的使用感受,特意瞭解相關知識,並且搭建了一些簡單的demo以做對比,最終整理成文。 至於angular和vue還有react的對比,這裡暫時不細聊。最近 小尤和大漠 之間
【純前端】微信小程式驗證碼
index.wxml 驗證碼: <input type='text' bindinput='makecodeInput'/> <view class='makecode' bindtap='getcode'>{{code}}</view
【學習筆記】微信小程式騰訊雲部署之新手問題點
2017年8月31號微信小程式團隊釋出新的開發者工具1.01.170831,這幾天差不多把前端頁面設計有了大概的瞭解,正發愁怎麼設計後臺資料互動,新工具就來了。以下是設定介紹。 官方連結[https:
【※墨痕】微信小程式工具註冊步驟
1、在微信公眾平臺官網首頁( mp.weixin.qq.com)點選右上角的“立即註冊”按鈕。 2、選擇註冊的帳號型別 選擇“小程式”,點選“檢視型別區別”可檢視不同型別帳號的區別和優優勢 3、填寫郵箱和密碼 填寫未註冊過公眾平臺、開放平臺、企業
【※墨痕】微信小程式的開發步驟2
1、登陸微信公眾平臺後,點選小程式,進入小程式開發,找到下面的工具,點選進去微信開發者工具 2、點選下載微信小程式開發工具
【轉】微信小程式模板訊息無限制群發
模版訊息推送是微信小程式採用的通知形式, 使用者本人在小程式頁面有互動行為後,可觸發下發通知 ,通過微信聊天列表中的服務通知可快捷進入檢視訊息。此外,點選檢視詳情還能跳轉到下發訊息的小程式的指定頁面。但是為了避免這種通知被濫用,帶來不好的使用者體驗,小程式也對模板訊息推送做了相應的限制。為了
【轉載】微信小程式-開發入門(一)
微信小程式已經火了一段時間了,之前一直也在關注,就這半年的發展來看,相對原生APP大部分公司還是不願意將主營業務放到微信平臺上,以免受制於騰訊,不過就小程式的應用場景(用完即走和二維碼分發等)還是很值得我們學習的,技術上面如果瞭解React的話,會發現他們在元件化上面有很多雷同之處。說白了,小程式就是基於微信
【最佳實踐】微信小程式客服訊息實時通知如何快速低成本實現?
我們做微信小程式開發的都知道,只要在小程式頁面中新增如下程式碼即可進入小程式的客服會話介面: <button open-type="contact" >聯絡我們</button> 微信小程式客服會話介面如下圖所示:
用 mpvue 寫個【微博-青銅版】微信小程式
第一次寫小程式,由於偏愛 Vue,所以選則了 mpvue 這個框架。那就寫個青銅版微博來練練手吧。 效果截圖: 圖1:微博首頁 圖2:發微博 圖3:我的 技術要點 1、小程式框架:mpvue 2、http 請求庫:fly.js 3、狀態管理:vuex 4、資料來源:微博開放平臺 ap
【 分類 】- 微信小程式
專欄達人 授予成功建立個人部落格專欄
【微信小程式】微信小程式掉進的坑之與後臺資料互動
一、與後臺的資料互動 注:服務端語言為Java. 在進行資料互動時,用的是Servlet進行資料的獲取和回傳。 在小程式中提交引數時需要在header寫入 header: {
【總結】微信小程式
最近小程式有個需求要做一個類似輪播的自定義樣式,搜了一下外掛們,一般都用到了jQuery,但是小程式又不支援操作DOM,所以直接自己捲起袖子幹吧。 如果有任何有問題的地方,歡迎各位看官指出,大家一起討論才能進步地更快XD 文章基本流程:
【小程式】微信小程式開發實踐
帳號相關流程 註冊範圍 企業 政府 媒體 其他組織 換句話講就是不讓個人開發者註冊。 :) 填寫企業資訊 不能使用和之前的公眾號賬戶相同的郵箱,也就是說小程式是和微信公眾號一個層級的。 填寫公司機構資訊,對公賬戶資訊 繫結管理員微信 企業認
【筆記】微信小程式
本意是想在小程式使用者授權失敗時,可以在頁面中提供一個按鈕,讓使用者點選按鈕能夠進行再次授權。 附button文件 問題:在小程式中設定的按鈕,在設定了bindtap的情況下點選,都會自動跳轉到log/log介面。 經查錯發現,是因為在
【微信小程式】微信小程式與後臺的互動
js onLoad: function (options) { var that = this; var list = that.data.list; var currentPage = that.data.currentPage; wx.sh
【視訊分享】微信小程式入門與實戰
看到網友留言想要小程式的,想了想還是把這個提前吧,那幾個留言要小程式的記得讚賞嘿嘿。小程式官方正
【總結】微信小程式JAVA伺服器統一下單請求BODY欄位中文簽名錯誤總結
之前網上找了好久此問題都沒有解決,總結一下基本有一下幾種: 1.更改Tomcat配置 編碼改為UTF-8 2.String body = new String("body中文欄位值".toString().getBytes("ISO8859-1"),"UTF-8");更改欄位編碼 簽
【開源】微信小程式、小遊戲以及 Web 通用 Canvas 渲染引擎
Cax 小程式、小遊戲以及 Web 通用 Canvas 渲染引擎 特性 Learn Once, Write Anywhere(小程式、小遊戲、PC Web、Mobile Web) 支援小程式、小遊戲以及 Web 瀏覽器渲染 小程式、小遊戲和 Web 擁有相同簡潔輕巧的 API 高效能的渲染架構 超輕量