1. 程式人生 > >vuex的使用、抽離非同步元件(一)

vuex的使用、抽離非同步元件(一)

安裝好腳手架服務跑起來後,在src下新建vuex資料夾,vuex資料夾下新建js檔案並配置:

我命名為index.js:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({//建立倉庫例項
	state:{//倉庫中存放資料的地方
		count: 1
	}
})
export default store;
在入口檔案main.js中引入並在vue例項中傳入:
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './vuex' //這是利用了檔案預設查詢機制,找到./vuex/index.js檔案

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,//告訴vue使用了倉庫,該 store 例項會注入到根元件下的所有子元件中,且子元件能通過 this.$store 訪問到。
  components: { App },
  template: '<App/>'
})

建立一個單檔案元件(pages/User.vue檔案):

<template>
	<div class="user">
		<button @click="handleCount">改變count</button>
		{{count}}
	</div>
</template>

<script>
	export default{
		data(){
			return {

			}
		},
		computed: {
			count(){//如果去倉庫拿資料,通過倉庫例項物件 $store 
				return this.$store.state.count;
			}
		}
	}
</script>

<style>
	.user{
		background: red;
	}
</style>


說一下利用webpack的require.ensure實現非同步元件+程式碼抽離(router/index.js):
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'

Vue.use(Router)
//非同步元件的抽離,建立一個非同步元件
//webpack的require.ensure webpack會將require.ensure中引入的程式碼從主boundle中抽離
// import Login from '@/pages/Login'
const Login =  r => require.ensure([], () => r(require('@/pages/Login.vue')), 'login')
const User=  r => require.ensure([], () => r(require('@/pages/User.vue')), 'login')

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },{
    	path: '/login',
    	name: 'Login',
    	component: Login
    },{
    	path: '/user',
    	name: 'User',
    	component: User
    }
  ]
})
目錄結構:

獲取資料:

輔助函式(語法糖)

當一個元件需要獲取多個狀態時候,將這些狀態都宣告為計算屬性會有些重複和冗餘。為了解決這個問題,我們可以使用 mapState 輔助函式幫助我們生成計算屬性,讓你少按幾次鍵:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({//建立倉庫例項
	state:{//倉庫中存放資料的地方
		count: 2,
		products: [{
			title: "東風標緻", id: 8, buy: false
		},{
			title: "廣州本田", id: 9, buy: true
		},{
			title: "一汽大眾", id: 6, buy: true
		},{
			title: "東風悅達", id: 7, buy: true
		},{
			title: "長安鈴木", id: 5, buy: false
		}]
	},
	getters: {//配置從state中衍生出來的資料
		tobuy(state){//預設第一個引數就是store的state
			return state.products.filter(v => v.buy);
		},
		nottobuy(state){
			return state.products.filter(v => !v.buy)
		}
	}
})
export default store;


獲取tobuy、nottobuy資料:

<template>
	<div class="user">
		<button @click="handleCount">改變count</button>
		{{count}}
		<hr/>
		<ul>
			<li style="background:green">我要買的:</li>
			<li v-for="(v, i) in tobuy">{{v.title}}</li>
		</ul>
		<ul>
			<li style="background:orange">我不買的:</li>
			<li v-for="(v, i) in nottobuy">{{v.title}}</li>
		</ul>
	</div>
</template>

<script>
import {mapState, mapGetters} from 'vuex';//引入語法糖物件
	export default{
		data(){
			return {

			}
		},
		computed: {
			// count(){
			// 	return this.$store.state.count;
			// }
			// 當計算屬性的key和store的state的屬性名相同時可以用mapState,都需要es7...物件擴充套件運算子:
			...mapState(['count'])//陣列語法
			// 當計算屬性的key和srote的state的屬性名不相同時:用物件語法,此時計算屬性名稱為counter
			// ...mapState({
			// 	counter: state => state.count
			// })
			,
			tobuy(){//同樣state的衍生狀態也可以使用語法糖,引入mapGetters,語法跟mapState一樣
				return this.$store.getters.tobuy;
			},
			nottobuy(){
				return this.$store.getters.nottobuy;
			}
		},
		methods: {
			handleCount(){
				 console.log(this.count)
			}
		}
	}
</script>

<style>
	.user{
		background: red;
	}
</style>

渲染的結果:


改變資料:

更改 Vuex 的 store 中的狀態的唯一方法是提交 mutation。Vuex 中的 mutation 非常類似於事件:每個 mutation 都有一個字串的 事件型別 (type) 和 一個 回撥函式 (handler)。這個回撥函式就是我們實際進行狀態更改的地方,並且它會接受 state 作為第一個引數。

你不能直接呼叫一個 mutation handler。這個選項更像是事件註冊:“當觸發一個型別為 increment 的 mutation 時,呼叫此函式。”要喚醒一個 mutation handler,你需要以相應的 type 呼叫 store.commit 方法:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({//建立倉庫例項
	state:{//倉庫中存放資料的地方
		count: 2,
		products: [{
			title: "東風標緻", id: 8, buy: false
		},{
			title: "廣州本田", id: 9, buy: true
		},{
			title: "一汽大眾", id: 6, buy: true
		},{
			title: "東風悅達", id: 7, buy: true
		},{
			title: "長安鈴木", id: 5, buy: false
		}]
	},
	getters: {//配置從state中衍生出來的資料
		tobuy(state){//預設第一個引數就是store的state
			return state.products.filter(v => v.buy);
		},
		nottobuy(state){
			return state.products.filter(v => !v.buy)
		}
	},
	mutations: {
		changeCount(state, payload){//第二個引數就是元件中傳遞過來的載荷
			state.count += payload;
		}
	}
})
export default store;

<template>
	<div class="user">
		<button @click="handleCount">改變count</button>
		{{count}}
		<hr/>
		<ul>
			<li style="background:green">我要買的:</li>
			<li v-for="(v, i) in tobuy">{{v.title}}</li>
		</ul>
		<ul>
			<li style="background:orange">我不買的:</li>
			<li v-for="(v, i) in nottobuy">{{v.title}}</li>
		</ul>
	</div>
</template>

<script>
import {mapState, mapGetters} from 'vuex';//引入語法糖物件
	export default{
		data(){
			return {

			}
		},
		computed: {
			// count(){
			// 	return this.$store.state.count;
			// }
			// 當計算屬性的key和store的state的屬性名相同時可以用mapState,都需要es7...物件擴充套件運算子:
			...mapState(['count'])//陣列語法
			// 當計算屬性的key和srote的state的屬性名不相同時:用物件語法,此時計算屬性名稱為counter
			// ...mapState({
			// 	counter: state => state.count
			// })
			,
			tobuy(){//同樣state的衍生狀態也可以使用語法糖,引入mapGetters,語法跟mapState一樣
				return this.$store.getters.tobuy;
			},
			nottobuy(){
				return this.$store.getters.nottobuy;
			}
		},
		methods: {
			handleCount(){
				 this.$store.commit("changeCount", 5)//提交一個名為changeCount的mutation,第二個可選引數表示載荷,也可以是一個物件傳入,也可以將type和載荷寫成一個物件傳入{type: 'changeCount', payload: 5}
				 console.log(this.count)

			}
		}
	}
</script>

<style>
	.user{
		background: red;
	}
</style>

使用常量替代 Mutation 事件型別

使用常量替代 mutation 事件型別在各種 Flux 實現中是很常見的模式。這樣可以使 linter 之類的工具發揮作用,同時把這些常量放在單獨的檔案中可以讓你的程式碼合作者對整個 app 包含的 mutation 一目瞭然:

可以單獨新建一個js檔案命名為mutation-types.js專門用來配置要用到的事件型別名稱的常量(變數大寫是規範,不過這裡最好值也大寫,不然在後面用mapMutations的陣列語法糖時會報出常量未定義的錯):

export const CHANGECOUNT = 'CHANGECOUNT';

並更改mutation事件屬性名,es6物件的動態屬性寫法:

mutations: {
		[CHANGECOUNT](state, payload){//第二個引數就是元件中傳遞過來的載荷
			state.count += payload;
		}
	}


然後在store檔案中和其他用到的元件頁引入:

import {CHANGECOUNT} from './mutation-types';
同樣更改觸發mutation事件的事件屬性名:
methods: {
			handleCount(){
				 this.$store.commit(CHANGECOUNT, 5)//提交一個名為changeCount的mutation,第二個可選引數表示載荷,也可以是一個物件傳入,也可以將type和載荷寫成一個物件傳入{type: 'changeCount', payload: 5}
				 console.log(this.count)

			}
		}

同時mutation的所有事件函式中不能有非同步,因為vue要監視狀態的改變,資料和對應的狀態必須一致。

相關推薦

vuex的使用非同步元件

安裝好腳手架服務跑起來後,在src下新建vuex資料夾,vuex資料夾下新建js檔案並配置:我命名為index.js:import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store =

iOS元件外掛化模組化之路

前言:公司一年多的小專案,進行專案拆分,要求是每個業務模組都可以單獨打包。在開發過程中,如:酒店模組,只修改酒店單元,測試也只測試酒店部分。模組間相互不干擾,就有了,今天元件化之路。 一、元件化的目的。 說是元件化,其實更多的是模組化,對模組之間相互之間不干

基於 EntityFrameworkAutofac 的 UnitOfWork 框架

map 包括 應用 問題 pos web 新的 ges 解釋 之前公司項目參考 NopCommerce 開發了一套系統,但是不支持 UnitOfWork,最近想開發新的項目,所以就基於原有的基礎上又添加 UnitOfWork 支持,由於目前正在逐步完善中,所以可能存在各種問

vuex實踐之路——筆記本應用

time 中大 -- this 隔離 思想 一個表 環境搭建 一定的 首先使用vue-cli把環境搭建好。 介紹一下應用的界面。 App.vue根組件,就是整個應用的最外層 Toolbar.vue:最左邊紅色的區域,包括三個按鈕,添加、收藏、刪除。 NoteList.vu

iOS Socket 整理以及CocoaAsyncSocketSRWebSocket源碼解析

ict sad endif alias reat 定位 ava 第一個 type 寫在準備動手的時候: Socket通訊在iOS中也是很常見,自己最近也一直在學習Telegram這個開源項目,Telegram就是在Socket的基礎上做的即時通訊,這個

1spring-boot學習筆記簡單入門

ava project nal run plugin mailto 5.4 安全 class a 一、新建普通Maven工程 pom.xml <parent> <groupId>org.springframework.boot</gr

OpenStack架構----keystone元件

本篇博文主要搭建OpenStack架構中的keystone元件,之後會依次帶來OpenStack中的glance、nova、neutron、horizon、cinder和虛擬機器的管理操作。在實驗部署之前,先對OpenStack進行以下了解! 什麼是OpenStack? OpenStack既是一

Android自定義View--翻書控制元件

0.前言 最近重看了一遍封神演義,感覺QQ閱讀那個翻書的效果挺好的,準備做一個。上週五下午用了兩個小時只寫了一部分功能,以後有時間再完善 1.分析 先看效果圖 這個空間,說簡單也簡單,說難也難,簡單就在於這個效果主要就是依賴canvas的clippath才見到部分canvas,難就難在裁

WPF自定義控制元件の控制元件分類

原文: WPF自定義控制元件(一)の控制元件分類 一、什麼是控制元件(Controls)         控制元件是指對資料和方法的封裝。控制元件可以有自己的屬性和方法,其中屬性是控制元件資料的簡單訪問者,方法則是控制元件的一些簡單而可見的功能、控制元件建

Flask + Ajax + Mysql 實現網頁非同步載入

滾動條滑到底部時候,在當前頁面載入下一頁資料; 滾動條到達頂部時候,重新整理當前頁面。 一、flask 實現的伺服器端 @app.route('/',methods=['GET','POST']) def index(): '''新聞首頁''' page = reques

用WPF做報表控制元件

DataGrid是WPF自帶的報表控制元件,但其功能簡單,很多時候無法滿足我們的需求。第三方庫(如DevExpress)報表功能強大,但一方面資源消耗比較多,另一方面效能也較差,在一些比較差的電腦上執行很吃力。我之前就嘗試過在工控機上使用DevExpress,每次啟動都需要等幾秒甚至十幾秒半分鐘,體

freemarker寫select元件

freemarker寫select元件 1、巨集定義 <#macro select id datas> <select id="${id}" name="${id}"> <option>--

迴圈資料結構及函式

List(列表)結構 #列表名稱=[元素1,元素2,......] list1 = [1,2,3,4] list2 = ["banana","apple","orange"] list3 = [1,"banana",True] 各個元素資料型別可以相同,也可以不同。

python 中資料型別--列表元組的理解

                                                   資料型別--列表、元組 一、列表 list 數值 score=80 字串 name1="tom" name2="jerry" name3="kate" 當需要儲存多個元素的

js執行機制及非同步程式設計

相信大家在面試的過程中經常遇到檢視執行順序的問題,如setTimeout,promise,async await等等,各種組合,是不是感覺頭都要暈掉了,其實這些問題最終還是考察大家對js的執行機制是否掌握牢固,對promise,async的原理是否掌握,萬變不離其宗,這次就來徹底搞懂它。 1 js引擎

熟悉一些Xamarin前端控制元件

C#使用Xamarin開發可移植移動應用目錄 原始碼地址:https://github.com/l2999019/DemoApp 可以Star一下,隨意 - - 說點什麼.. .NET core2.0 釋出了,刺激,大致看了一下,很不錯,打算後期學習.(不出意外,應該也會寫個小系列)

ASP.NET MVC 路由--- ASP.NET WebForm路由模擬

      ASP.NET WebForm 應用,使用者請求的是物理檔案,其中包括靜態頁面和動態頁面,在Url中的顯示都是伺服器中一個物理檔案的相對路徑。但是ASP.NET MVC就不同了,使用者請求的是Controller中一個Action方法,這種請求是通過路由將Url對映到相對的Controller

Android 官方架構元件——Lifecycle

參考文章:  https://mp.weixin.qq.com/s/VJif0D5PlrmyA1_emV-k0g  https://mp.weixin.qq.com/s/jU-UHkRbiruBq6BcNOjr5w 下面大量原始碼,請耐心點看~ 什麼是Lifecycle? Li

webservicesocket和http 區別

webservice是基於http協議的soap協議的封裝和補充,如果你考慮公共穩定的介面,你可以努力的考慮一下。至於socket和http、webservices是否放在一起比較和考慮主要還是看你關心的角度,而這個角度可以是技術層面的 ,也可以是使用者需求層面1 資料傳輸

學習爬蟲框架WebMagic---入門案例

一、WebMagic簡介   參見網上其他介紹。 二、新增依賴 <!-- webmagic 核心包 --> <dependency> <groupId>us.codecraft</groupId> <artif