当前位置: 首页 > Web前端 > vue.js

创建Vue技术栈中的“时间宝石”

时间:2023-03-31 22:15:13 vue.js

鐜颁唬娴忚鍣ㄧ殑鍔熻兘瓒婃潵瓒婂己澶э紝鍓嶇闇€瑕佸鐞嗙殑涓氬姟閫昏緫涔熻秺鏉ヨ秺澶嶆潅銆傛彁渚涜壇濂界殑浜や簰鏄垜浠竴鐩磋拷姹傜殑锛屾垜浠篃鍦ㄥ仛鍙鍖栨姤琛ㄥ伐鍏锋湁涓€涓噸瑕佺殑鍔熻兘锛屾彁鍗囩敤鎴蜂綋楠岋紝undo&redo锛岃繖涓姛鑳界粰鐢ㄦ埛瀹夊叏鎰熷拰淇濇姢鎰燂紝鐢ㄦ埛涓嶄細鎷呭績鎿嶄綔浠栦滑鎵€鍋氱殑浜掑姩灏嗘秷澶憋紝鏃犳硶杩芥函銆備负浜嗗疄鐜拌繖涓姛鑳斤紝鎴戠爺绌朵簡涓€浜涘疄鐜版柟寮忥紝鏈夌殑鍩轰簬Immutable鏁版嵁缁撴瀯锛屾湁鐨勫熀浜庢爤鏁版嵁缁撴瀯鏉ョ鐞嗐€傛垜浠殑瀹為檯椤圭洰浣跨敤Vuex浣滀负鍏ㄥ眬鐘舵€佺鐞嗗伐鍏枫€傜湡姝i€傚悎鎴戜滑瀹為檯椤圭洰鐨勫叾瀹炴槸鍩轰簬Vuex鐨剆tore瀹炰緥API鐨勫疄鐜般€傞€氳繃Vuex瀛樺偍鐨勬墍鏈夌姸鎬佸湪鍔ㄤ綔/绐佸彉琚Е鍙戞椂瀛樺偍涓哄巻鍙茶褰曪紝鎴戜滑鍙互鍦ㄩ渶瑕佷娇鐢ㄦ椂闅忔剰鈥滅┛姊€濄€?閴翠簬姝わ紝鎴戠粨鍚坰tateshot寮€鍙戜簡涓€娆惧彲浠モ€滅┛瓒娾€濈殑Vuex鎻掍欢銆傛湰鏂囧皢浠嬬粛涓€涓熀浜嶸uexAPI鐨勨€滄椂闂存梾琛屸€濇彃浠躲€備互鍔ㄦ€佺綉鏍煎竷灞€涓轰緥锛屼娇鐢╯tateshot.js瀹炵幇鐨剈ndo&redo鍔熻兘锛屽ぇ鑷存晥鏋滃涓嬶細TimeTravelWhyTimeGem锛屼竴涓己澶х殑鏃堕棿瀹濈煶锛屽叿鏈夋搷绾垫椂闂寸殑鑳藉姏銆傚綋鎴戝悗鎮旀椂锛岃繖瀵逛汉绫绘潵璇存槸涓€绉嶇濂囩殑鎰熻銆傚綋鎴戝仛浜嗕竴浠朵簨鎯呭悗鎮旂殑鏃跺€欙紝鎴戞兂鎴戜笉鍋氫細鏇村ソ锛屾垜鎯冲洖鍒版渶鍒濄€傛€庝箞鏍凤紝閭f垜浠渶瑕佷竴涓叿鏈夊己澶х殑鏃堕棿绌挎鍔熻兘鐨勨€滄椂闂村疂鐭斥€濓紝鎴戜滑鏉ュ垱寤哄畠鏉ュ疄鐜扳€滄椂闂村疂鐭斥€漹uex-stateshot鐨勫疄鐜颁娇鐢ㄤ簡Vuex鐨勪竴浜汚PI锛宻tateshot.js鐢ㄤ簬璁板綍鍘嗗彶鐘舵€侊紝骞舵墽琛屾挙娑堝拰閲嶅仛銆傚綋鎴戜滑瑙﹀彂涓€涓猘ctions/mutations鏃讹紝鎴戜滑鍙互閫氳繃璁㈤槄鏉ヨЕ鍙戜竴涓猻napshot鏉ヨ褰曞巻鍙茬姸鎬乻napshot锛屾柟渚挎垜浠瑄ndo&redo銆備笅闈㈡垜浠潵璁よ瘑涓€涓嬭繖浜汚PI锛宻ubscribe銆乻ubscribeAction銆乺egisterModule銆乧reateNamespacedHelpersVuexAPIVuex.Store瀹炰緥鏂规硶鍜岃緟鍔╁嚱鏁版彁渚涗簡涓€浜涘钩鏃跺彲鑳界敤涓嶅埌鐨凙PI锛岃€岃繖浜汚PI瀵逛簬寮€鍙慥uex鎻掍欢闈炲父鏈夌敤銆俿tore.subscribe璁㈤槄store鐨勫彉鍖栥€俬andler浼氬湪姣忔鍙樺紓瀹屾垚鍚庤璋冪敤锛屾帴鏀跺彉寮傚拰鍙樺紓鍚庣殑鐘舵€佷綔涓哄弬鏁帮細store.subscribe((mutation,state)=>{console.log(mutation.type)console.log(mutation.payload)})store.subscribeAction浠?.1.0寮€濮嬶紝subscribeAction鎻愪緵浜嗗紑鍙慥uex鎻掍欢鐨勯€氱敤鐢ㄦ硶銆傛偍鍙互鎸囧畾璁㈤槄澶勭悊鍑芥暟鏄湪鍒嗗彂action涔嬪墠锛坆efore锛夎繕鏄箣鍚庯紙after锛夎皟鐢紙榛樿琛屼负鏄痓efore锛夛細store.subscribeAction({before:(action,state)=>{console.log(`beforeaction${action.type}`)},after:(action,state)=>{console.log(`afteraction${action.type}`)}})store.registerModule鍒涘缓store涔嬪悗锛屾偍鍙互浣跨敤store.registerModule鏂规硶娉ㄥ唽妯″潡锛?/registermodule`myModule`store.registerModule('myModule',{//...})//娉ㄥ唽宓屽妯″潡`nested/myModule`store銆俽egisterModule(['nested','myModule'],{//...})妯″潡鍔ㄦ€佹敞鍐屽姛鑳藉厑璁稿叾浠朧ue鎻掍欢娣诲姞鏂扮殑鍒皊tore鐨勬ā鍧楁柟寮忥紝鐢╒uex绠$悊鐘舵€併€俢reateNamespacedHelpers浣跨敤createNamespacedHelpers鍒涘缓鍩轰簬鐗瑰畾鍛藉悕绌洪棿鐨勮緟鍔╁嚱鏁般€傚畠杩斿洖涓€涓甫鏈夌粦瀹氬埌缁欏畾鍛藉悕绌洪棿鍊肩殑鏂扮粍浠剁粦瀹氬姪鎵嬬殑瀵硅薄锛氬湪`some/nested/module`...mapState({a:state=>state.a,b:state=>state.b})},methods:{//鍦╜some/nested/module`涓煡鎵俱€?.mapActions(['foo','bar'])}}浣跨敤vuex-stateshot鎻掍欢鏄潪渚靛叆寮忓拰鍙彃鎷旂殑锛屾彃浠朵娇鐢╮egisterModuleAPI鍔ㄦ€佸垱寤轰簡涓€涓悕涓簐uexstateshot鐨勫懡鍚嶇┖闂存潵瀛樺偍涓€浜涢渶瑕佺殑鐘舵€佸拰鏂规硶鏃堕棿鏃呰銆傚畨瑁呭彲浠ラ€氳繃浠ヤ笅鍛戒护瀹夎锛歯pmivuex-stateshot-Soryarnaddvuex-stateshot-S鍒涘缓鎻掍欢鍒涘缓鎻掍欢锛坈reatePlugin锛夋椂锛屽彲浠ユ寚瀹氬摢浜涙ā鍧楋紙__MODULE__NAME__锛夊拰鍝簺鍔ㄤ綔/module涓嬬殑mutations闇€瑕佽闃咃紝鍙互鍦╯tateshot鐨凥istoryOptionsAPI涓璒ptional浼犱釜鏍楀瓙馃尠import{createPlugin}from'vuex-stateshot'constsubscribes={//鐗规畩鏍规ā鍧梜eyrootModule:{//Theactionsyouwantsnapshotactions:[],//Themutationsyouwantsnapshotmutations:[]},//鑷畾涔夋ā鍧楀悕绉癬_MODULE__NAME__:{//Theactionsyouwantsnapshotactions:[],//Themutationsyouwantsnapshotmutations:[]}}constoptions={maxLength:20}conststore=newVuex.Store({state:{},...,plugins:[createPlugin(subscribes,options)]})鍦ㄧ粍浠跺唴閮ㄤ娇鐢ㄣ€傚彲浠ラ€氳繃createNamespacedHelpersAPISpacevuexstateshot鎸囧畾鎻掍欢鐨勫悕绉版潵鏄犲皠缁勪欢缁戝畾杈呭姪鍑芥暟{...mapGetters(['undoCount','redoCount','hasUndo','hasRedo'])},methods:{...mapActions(['undo','redo','reset'])}}Undo/Redo鏂规硶閫氳繃缁勪欢缁戝畾Auxiliary鍑芥暟mapActions锛屾垜浠彲浠ュ緱鍒皍ndo/redo鏂规硶锛岃繖涓柟娉曟槸鐢ㄦ潵绠$悊鐘舵€佺殑鏂规硶鍚嶇О鎻忚堪鍥炶皟undo濡傛灉鏈夊彲鎾ら攢鐨勫巻鍙茶褰曪紝鍙互寰楀埌涓婁竴鏉¤褰曠殑鐘舵€?)=>prevStateredo鎵цundo鍚庯紝鍙互閫氳繃Redogetsthelastundoedhistory()=>nextStatereset鏉ユ竻闄istory-鍘嗗彶鐘舵€侀€氳繃缁勪欢缁戝畾杈呭姪鍑芥暟mapGetters锛屾垜浠彲浠ヨ幏鍙杊asUndo銆乭asRedo銆乽ndoCount銆乺edoCount绛夌姸鎬佽繘琛岄€昏緫澶勭悊銆傚綋瑙﹀彂鐘舵€佸悓姝ユ椂锛寀ndoCount=1/hasUndo=true;杩欐槸浣跨敤鎻掍欢鐨勫紑濮嬶紱褰撲綘璋冪敤涓€娆ndo鏃讹紝浼氭湁涓€涓噸鍋氳褰曠姸鎬佹弿杩扮被鍨嬪垵濮嬪€紆ndoCount鍙互閲嶅仛鍘嗗彶璁板綍璁℃暟銆侼umber0redoCount閲嶅仛鍘嗗彶璁板綍鎶€鏈疦umber0hasUndoundoBooleanfalsehasRedo鍙互redoBooleanfalse浠绘剰闂紵褰撻渶姹傚緢澶嶆潅鐨勬椂鍊欙紝涔熻鎴戞兂瑕佹挙閿€鐨勪笉鏄竴涓猘ction/mutations锛岃€屾槸鍑犱釜action/mutations銆傞拡瀵硅繖涓渶姹傦紝vuexstateshot鎻愪緵浜嗚嚜瀹氫箟瀹氭椂鍚屾鍘嗗彶璁板綍鐨勬柟娉曪紝璁╁涓鏉傛搷浣溾€滀竴閿繕鍘熲€濄€傛柟娉曞悕绉版弿杩癱allbacksyncState鑷畾涔夊悓姝ュ巻鍙插揩鐓х殑鏂规硶-unsubscribeAction鍋滄璁㈤槄Actions-subscribeAction閲嶆柊璁㈤槄Actions锛岄€氬父涓巙nsubscribeAction涓€璧蜂娇鐢?unsubscribe鍋滄璁㈤槄Mutations-subscribe閲嶆柊璁㈤槄Mutations锛岄€氬父涓巙nsubscribe-a鍦烘櫙涓€璧蜂娇鐢ㄥ亣璁炬垜浠闃呭埌changeTheme銆乧hangeColor鍜宑hangeLang鏄笁涓狝ction銆傚綋瑙﹀彂姣忎釜Action鏃讹紝灏嗚褰曞巻鍙插揩鐓с€備絾瀹為檯鍦烘櫙鐨勯渶姹傛槸锛岃繖浜涚姸鎬佸叏閮ㄦ敼鍙樺悗锛岄渶瑕佸悓姝ュ巻鍙插揩鐓э紝浠ヤ究鍦╱ndoing鏃舵仮澶嶅涓姸鎬併€俰mport{mapActions}from'vuex'exportdefault{name:'xxx',...methods:{...mapActions(['changeTheme','changeColor','changeLang']),handleChange(){//鍋滄璁㈤槄鎿嶄綔this.$stateshot.unsubscribeAction()//澶氭瑙﹀彂璁㈤槄鎿嶄綔this.changeTheme('dark')this.changeColor('#fa4')this.changeTheme('zh')//閲嶆柊璁㈤槄鎿嶄綔this.$stateshot.subscribeAction()//鍚屾鍘嗗彶蹇収this.$stateshot.syncState()}}}Tips:vuex-stateshot涔熸彁渚涗簡鍋滄璁㈤槄Actions/Mutations鐨勬柟娉昈nlineDemo缁撹鍦ㄥ彲瑙嗗寲宸ュ叿椤圭洰涓紝鎴戜滑宸茬粡浣跨敤vuex-stateshot绠$悊鍘嗗彶鐘舵€併€傛€ц兘涓嶉敊锛屽畬缇庢弧瓒充簡鈥滅┛瓒娾€濈殑闇€姹傘€備负鐢ㄦ埛鍦ㄦ搷浣滃拰浜や簰涓彁渚涘畨鍏ㄤ繚闅溿€傛劅璋doodlewind鎻愪緵浜嗕竴涓紭绉€鐨勫伐鍏穝tateshot鍜孷uex3.1.0+鎻愪緵鐨剆ubscribeActionAPI锛屼娇寰楁搷浣滄湁搴忓彲闈犮€倂uex-stateshot鎻掍欢鐗规€р湪锛氶潪渚靛叆寮忋€佸彲鎻掓嫈鐨勬彃浠惰皟鐢ㄩ€昏緫涓ヨ皑涓氬姟鐘舵€佺ǔ瀹氱殑undo&redo鏂规硶闅忔椂鍚屾蹇収鐨勬柟娉?00%娴嬭瘯鍦烘櫙瑕嗙洊璧勬簮stateshotVuexAPI鍙傝€冩枃鏈細http://xlbd.me/鍒涘缓鏃堕棿-鈥?/p>