亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

在knockoutjs 上自己實現的flux(實例講解)

2019-11-19 14:42:53
字體:
來源:轉載
供稿:網友

在knockoutjs 上實現 Flux 單向數據流 狀態機,主要解決多個組件之間對數據的耦合問題。

一、其實簡單

flux的設計理念和實現方案,很大程度上人借鑒和參考了Vuex的實現,只是簡化了某些過程,數據流向圖如下:

image

從上圖,中以看出數據的改變是單向循環的。我想這就是Flux理念的核心所在吧。Vuex中對Action規范為Action和Mutation,由action去觸發Mutation,action是可以異步的,而Mutation則是同步更新。而我在設計ko的Flux時,去掉了Mutation這個環節,是因為我理解為,異步的請求一般情況下都是與api接口有關系,這塊內容存在極大的變化性,應該從業務或項目構架上做一層區分。

二、如果使用

當然,flux只是針對knockoutjs的,所以你使用之前必須引入knockoutjs。flux主要的方法和對象

2.1 靜態方法

方法 說明
flux.use 在require模式下,將flux與ko做關聯的方法,當然他必須先與createStore方法調用。
flux.createStore 創建一個store(狀態器)實例,當然此方法是有返回值,他的返回值可以調用register方法注冊到指定的域上,但第一次調用此方法時是創建rootStore(根狀態器),他不允許被注冊到域的。

2.1.1 flux.createStore參數格式

參數名稱 說明
state 狀態器相關狀態數據
actions 更改state上的狀態方法,方法的第一個參數為state,第二參數開始則為傳入的相關內容
getters 獲取state上的相關狀態數據,當然返回是一個ko監控對象。

2.2 實例方法

createStore方法的執行,會在ko實例上增加$store屬性,此屬性是狀態器的實例對象,在任何位置都可以調用他的dispatch來觸發事件。

方法 說明
register 創建和注冊一個狀態域,域與域之間是相互獨立存儲的,域之間action或get名稱是可以重復的
unRegister 移除一個狀態域
dispatch 根據actionName調用指定的action,無返回值
get 根據getName調用指定的get,有返回值

三、簡單的使用

本示例定義了四個ko綁定區域,分別是:app1, app2, app3, app4。實現app4中對name的改變自動影響到app1,而app3對列表的改變自動影響到app2。

image

3.1 定義vm并初始化store

function ViewModel(){ this.list = ko.observableArray(); this.name = ko.observable('無名氏'); this.count = ko.computed(function(){  //必須用this,這個時候ko.$store還沒創建完成,應該ko.computed創建時會執行一次此處  //如果是子vm依賴主vm,還是可以用ko.$store的  return this.list().length + '個數'; //需要對監控對象求值,否則computed不能有效 },this);}var fullVm = new ViewModel(); var index = 1;fullVm.vf={ add: function(){  ko.$store.dispatch('addClass',{title: 'title' + (index++)}); }}var opt = { state: {  class: fullVm }, actions:{  "setName":function(state, name){   state.class.name(name);  },  "addClass":function(state, classInfo){   state.class.list.push(classInfo);  } }, getters:{  "getName":function(state){   return state.class.name;  } }}flux.createStore(opt);

根據上述代碼,首先定義了ViewModel的一個類,并創建了一個fullVm的一個實例,然后直接在fullVm實例上增加了add方法。

opt的state引用的是fullVm,其中還配置了actions和getters相關對象,然后調用flux.createStore(opt)方法。創建一個store,并關聯到ko.$store對象上。

3.2 與視圖綁定

html代碼:

<div id="app1"> app1: <span data-bind="text:ko.$store.get('getName')"></span></div><div id="app4"> app4: <input type="text" data-bind="value:name" /> <button type="text" data-bind="click:changeName" >改變名字</button> <span data-bind="text:ko.$store.state.class.name"></span></div><hr><div id="app2"> app2: <ul data-bind="foreach:list" >  <li data-bind="text:title" ></li> </ul></div><div id="app3"> app3:  <button type="button" data-bind="click:vf.add" >添加</button> <span data-bind="text:count"></span></div>

js代碼:

var app1 = ko.applyBindings(fullVm, document.getElementById("app1"));var app2 = ko.applyBindings(fullVm, document.getElementById("app2"));var app3 = ko.applyBindings(fullVm, document.getElementById("app3"));//測試兩個vm之間的依賴 解藕var app4 = ko.applyBindings({ name: ko.observable(), changeName:function(data,event){  ko.$store.dispatch('setName', this.name()); }}, document.getElementById("app4"));

四、域的實例

html代碼:

<div id="app1"> <span data-bind="text:name" ></span></div><div id="app2"> <span data-bind="text:name"></span> <span data-bind="text:full"></span> <button type="button" data-bind="click:changeName" >換名</button></div>

js代碼:

function rootViewModel(){ this.name = ko.observable('root'); }var rVM = new rootViewModel();flux.createStore({ state: rVM}); //創建root狀態器var treeNode={ name: ko.observable('node'), changeName:function(){  ko.$store.areas.treeNode.state.name('新名字'); }, full: ko.computed(function(){  //computed的職責:1. 監控其他對象屬性的變化,而影響自身對象(flux解決);2. 合并自身對象的幾個屬性(在function下,有this可解)  //不能通過ko.$store訪問對象本身,因為首次對象本身還沒初始化好  var store = ko.$store;  //(store.areas.treeNode? store.areas.treeNode.state.name() : '') 這樣也是不行,因為解決第一次通不過,后面肯定不行  return store.state.name(); })}ko.$store.register('treeNode', flux.createStore({ state: treeNode})); //創建子狀態機var app1 = ko.applyBindings(rVM, document.getElementById("app1"));var app2 = ko.applyBindings(treeNode, document.getElementById("app2"));

五、其他

當然模塊化的引用,也是支持。具體實例細節可參考test中的測試示例。

項目的git地址:https://gitee.com/ko-plugins/flux.git,歡迎大家指正和提出寶貴的意見。

以上這篇在knockoutjs 上自己實現的flux(實例講解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久伊人精品天天| 欧美老女人bb| 国产精品户外野外| 91亚洲一区精品| 欧美日韩国产页| 日韩精品在线观看一区二区| 欧美夫妻性生活xx| 精品久久久在线观看| 欧美黑人国产人伦爽爽爽| 97在线看福利| 国产亚洲综合久久| 久久亚洲精品毛片| 日本一欧美一欧美一亚洲视频| 国产91在线高潮白浆在线观看| 欧美性猛交丰臀xxxxx网站| 日韩免费在线观看视频| 97色在线视频| 97国产精品视频| 成人在线精品视频| 日韩国产精品亚洲а∨天堂免| 精品国产91久久久久久| 91欧美视频网站| 色婷婷av一区二区三区在线观看| 国产精品视频区| 92国产精品视频| 亚洲国产高清高潮精品美女| 亚洲精品99久久久久| 国产+成+人+亚洲欧洲| 亚洲精品一区二区三区不| 国产精品劲爆视频| 亚洲国产一区二区三区在线观看| 亚洲国产精品视频在线观看| 98精品国产高清在线xxxx天堂| 欧美午夜片在线免费观看| 国产精品xxxxx| 亚洲自拍小视频| 自拍视频国产精品| 国产亚洲欧美日韩精品| 日本在线观看天堂男亚洲| 中文字幕无线精品亚洲乱码一区| 成人免费网站在线| 亚洲成人久久一区| 亚洲一区中文字幕| 亚洲日本中文字幕免费在线不卡| 国产免费一区二区三区在线能观看| 国产精品你懂得| 欧美性xxxxxxx| 欧美小视频在线观看| 中文字幕亚洲色图| 亚洲japanese制服美女| 亚洲天堂男人的天堂| 久久精品99久久香蕉国产色戒| 久久久国产视频91| 久久99青青精品免费观看| 欧美国产高跟鞋裸体秀xxxhd| 国产精品美女久久久久av超清| 欧美黄色三级网站| 亚洲电影免费观看| 国产有码在线一区二区视频| 国产一区二区三区毛片| 久久综合伊人77777| 久久久伊人日本| 欧美亚洲第一区| 亚洲精品电影在线| 国产日韩精品电影| 色多多国产成人永久免费网站| xx视频.9999.com| 国产噜噜噜噜久久久久久久久| 欧美大尺度在线观看| 久久青草精品视频免费观看| 97热精品视频官网| 国产精品99久久久久久久久| 日本19禁啪啪免费观看www| 中文字幕亚洲情99在线| 亚洲精品欧美日韩| 亚洲一区二区久久久久久| 国产午夜精品全部视频播放| 亚洲图片欧美午夜| 一区三区二区视频| 久久久久一本一区二区青青蜜月| 欧洲亚洲免费在线| 一本色道久久综合亚洲精品小说| 国产欧美在线播放| 欧美理论电影在线观看| 68精品国产免费久久久久久婷婷| 久久韩剧网电视剧| 97视频在线观看成人| 国产精品免费久久久久久| 国产精品久久久久一区二区| 欧美激情亚洲另类| 日本精品久久电影| 国产精品嫩草影院久久久| 国产精品第3页| 91理论片午午论夜理片久久| 九九九久久国产免费| 日韩久久午夜影院| 精品美女久久久久久免费| 国产成人精品网站| 日韩av在线不卡| 亚洲国产成人精品久久久国产成人一区| 欧美福利视频在线观看| 国产欧美日韩专区发布| 中文字幕欧美在线| 欧美日韩激情视频8区| 国产亚洲福利一区| 亚洲第一av网站| 亚洲自拍欧美另类| 中文字幕9999| 91av视频在线播放| 精品国内亚洲在观看18黄| 亚洲欧洲美洲在线综合| 亚洲欧美制服另类日韩| 国产免费久久av| 中文字幕亚洲欧美日韩2019| 亚洲在线免费视频| 7m第一福利500精品视频| 亚洲午夜未删减在线观看| 亚洲人成欧美中文字幕| 91av视频导航| 日韩成人在线观看| 欧美成人精品一区二区三区| 精品久久久久久国产91| 日韩在线精品一区| 欧美成人激情在线| 亚洲国产精品人久久电影| 97久久精品人人澡人人爽缅北| 亚洲一区二区福利| 91香蕉电影院| 国产精品无码专区在线观看| 久久精品色欧美aⅴ一区二区| 国外成人性视频| 欧美精品videofree1080p| 国产在线精品一区免费香蕉| 亚洲性视频网站| 国产精品国产三级国产aⅴ浪潮| 久久久久久久影视| 国产69精品久久久久9| 亚洲欧美色图片| 日韩亚洲成人av在线| 亚洲成人999| 成人亚洲激情网| 亚洲免费av片| 日韩欧美一区二区在线| 欧美日韩人人澡狠狠躁视频| 久久久亚洲影院你懂的| 国产精品视频区| 欧美视频在线免费看| 日韩美女视频中文字幕| 日韩av网站导航| 国产在线999| 亚洲最大在线视频| 97欧美精品一区二区三区| 日韩高清电影好看的电视剧电影| 欧美中文字幕在线播放| 欧美乱大交xxxxx| 宅男66日本亚洲欧美视频| 欧美自拍视频在线| 国产精品www| 亚洲精品国产综合久久| 欧美成人精品不卡视频在线观看| 久久久亚洲影院| 中文字幕av日韩| 日韩中文字幕在线精品| 国产日韩专区在线|