這篇文章講述了vuejs實現插件狀態管理,大家對vuejs實現插件狀態管理不了解的話或者對vuejs實現插件狀態管理感興趣的話那麼我們就一起來看看本篇文章吧, 好了廢話少說進入正題吧
對於新手來說,一開始接觸vuex時候只聽說它很強大,很好用,各種nb操作,一旦嘗試去了解它的時候便顯得力不從心。本人也是如此,一開始接觸的時候透過看文檔, 看視頻,最後還是把它擱一邊去。一段時間之後回來再琢磨的時候,有了新的體認與體諒。
首先,如果你想真正掌握vuex,那麼就的弄清楚這幾個問題:
1.什麼是vuex?
#2.在什麼情況下要用到vuex(也就是vuex能夠解決什麼樣的問題),什麼情況下適合用vuex?
##那麼先來看看這兩個問題:
什麼是vuex?官網說:Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。 依照個人通俗理解來說就是:vuex就是用來管理各個元件之間的一些狀態,可以理解為這些狀態就是公共(共享)部分。此時任何元件都能從中取得狀態或觸發一些行為事件。
什麼情況下用到vuex?官網說:如果您不打算開發大型單頁應用,使用 Vuex 可能是繁瑣冗餘的。確實是如此——如果您的應用足夠簡單,您最好不要使用 Vuex。一個簡單的 global event bus 就足夠您所需了。但是,如果您需要建置是一個中大型單頁應用,您很可能會考慮如何更好地在元件外部管理狀態,Vuex 將會成為自然而然的選擇。
好,那麼現在我就當你是開發一個比較大型的項目,在那些地方會用到vuex呢? 隨著應用程式的複雜度增加,元件之間傳遞資料或元件的狀態會越來越多,舉個例子:當A元件進入B元件(A頁進入B頁)的時候,常常需要帶一些參數過去,那麼此時你可能會選擇放在url後面當做參數傳遞過去,如果你不想輕易暴露參數,你有可能先存到session中或者localstorage中,然後進入到第二個頁面的時候再取出來。不錯,這確實是一種解決方法,而且用的不少。但這不是一個好的方法,這時候,你就需要vuex來幫助你了。另外,當你基本上了解vuex的一些皮毛之後,你會發現vuex管理是基於模組化的思想,那麼這就對專案後期管理維護很友善了。
so,現在你就得來深入認識vuex的核心概念了。以下是個人理解的概念,首先在此之前建議最好先把官方文件Vuex2.0概念過一遍。
Vuex 中 Store 的模板化定義如下:
1 、
state定義了所應用的資料結構,也就是vuex中放置初始化資料(狀態)的地方。相當於元件中的data用來放資料。
state:{
todoLists:[],
},
#2、getters 就是從state中派生出狀態,例如取得state中todoLists的總數。其實就是相當於vue中的計算屬性computed,只不過getters是放在vuex裡的。
#//Getters函数 接受 state 作为其第一个参数
getters:{
todoCount(state){
return state.todoLists.length;
}
},
//和Getters函数一样 接受 state 作为其第一个参数
mutations:{
//新増 TodoList item
ONADDTODO(state,item){
state.aTodos.push(item);
},
//删除 TodoList item
ONDELTODO(state,index){
state.aTodos.splice(index,1);
},
//设置 错误提示信息
ONERROR(state,str){
state.massage=str;
}
},
##3、
mutations 是唯一允許更新應用程式狀態的地方。類似vue中的$on事件:每個 mutation 都有一個字串的事件類型 (type)和 一個回呼函數 (handler)。注意:mutations都必須是同步函數
//Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,
因此你可以调用 context.commit 提交一个 mutation,
或者通过 context.state 和 context.getters 来获取 state 和 getters
actions:{
//提交 ONADDTODO
onAddTodo(context,item){
if(item.value!=""){
context.commit("ONADDTODO",item);
context.commit("ONERROR","");
}else{
context.commit("ONERROR","添加失败")
}
},
//提交 ONDELTODO
//可利用 ES2015 的 [参数解构] 来简化代码
onDelTodo({commit},index){
//commit=context.commit
commit("ONDELTODO",index);
}
}
vue init webpack-simple vue-vuex-todolist npm install npm install vuex --save npm run dev //启动项目
Vuex輔助函數
1、Vuex.mapState(map : Array98c455a79ddfebb79781bff588e7b37e | Object): Object
建立元件的計算屬性傳回Vuex store 中的狀態。
2、Vuex.mapGetters(map: Array98c455a79ddfebb79781bff588e7b37e | Object): Object
建立元件的計算屬性傳回 getter 的回傳值。
3、Vuex.mapActions(map: Array98c455a79ddfebb79781bff588e7b37e | Object): Object
建立元件方法分發 action。
4、Vuex.mapMutations(map: Array98c455a79ddfebb79781bff588e7b37e | Object): Object
建立元件方法提交 mutation。
在了解Vuex 的基礎概念之後,我們會建立一個todolist來熟悉整個使用流程。
使用vue-cli工具建立專案
目錄,並安裝vuex
##
import Vue from "vue"; import Vuex from "vuex"; Vue.use(Vuex); const store = new Vuex.Store({ state:{ massage:"", aTodos:[{value:"默认默认",id:0}], }, getters:{ nCounts(state){ return state.aTodos.length; } }, mutations:{ //新増 TodoList item ONADDTODO(state,item){ state.aTodos.push(item); }, //删除 TodoList item ONDELTODO(state,index){ state.aTodos.splice(index,1); }, //设置 错误提示信息 ONERROR(state,str){ state.massage=str; } }, actions:{ //提交 ONADDTODO onAddTodo(context,item){ if(item.value!=""){ context.commit("ONADDTODO",item); context.commit("ONERROR",""); }else{ context.commit("ONERROR","添加失败") } }, //提交 ONDELTODO onDelTodo({commit},index){ commit("ONDELTODO",index); } }, modules:{} }); export default store;src 目錄下建立名為store 的目錄來存放狀態管理相關程式碼,先建立index.js
import Vue from 'vue'; import App from './App.vue'; import store from './store'; new Vue({ el: '#app', store, render: h => h(App) })main.js 檔案中將該Store 實例加入到建構的Vue 實例中
<template> <p class="form-group "> <input type="text" class="form-control" placeholder="" v-model="value" /> <button type="buttom" class="btn btn-default" @click="addItem">Add Item</button> </p> </template> <script> export default{ data(){ return { value:"", id:0 } }, methods:{ addItem(){ let item={value:this.value,id:++this.id}; this.value=""; this.$store.dispatch("onAddTodo",item); } } } </script> <style lang="scss"> %box{display:-webkit-box;-webkit-box-pack:center;-webkit-box-align:center;} .form-group{@extend %box; .form-control{-webkit-box-flex:1;} } </style>src 目錄下建立名為components的目錄來存放vue元件,並建立input.vue,list.vue檔案
<template>
<p class="todolist">
<ul class="list-group">
<li class="list-group-item" v-for="(item,index) in aTodos" >
<span>{{item.value}}</span>
<button class="btn btn-default" @click="delItem(index)">删除</button>
</li>
</ul>
</p>
</template>
<script>
import {mapState} from "vuex";
export default{
data(){
return {}
},
methods:{
delItem(index){
this.$store.dispatch('onDelTodo',index);
}
},
computed:{
...mapState([
'aTodos'
])
}
}
</script>
<style lang="scss">
%box{display:-webkit-box;-webkit-box-pack:center;-webkit-box-align:center;}
.list-group-item{display: -webkit-box;-webkit-box-align:center;
span{
display: block;
-webkit-box-flex:1;
}
}
</style>
<template> <p id="app"> <h1>Vue.js Vue TodoList</h1> <hr> <todoInput /> <todoList /> <p>todoList 数量:{{todoCount}}</p> <pre class="brush:php;toolbar:false">{{$store.state}}<script> import todoInput from './components/input.vue'; import todoList from './components/list.vue'; import {mapGetters} from "vuex"; export default { name: 'app', data () { return { msg: 'Welcome to Your Vue.js App' } }, computed:{ ...mapGetters({ todoCount:"nCounts" }) }, components:{ todoInput, todoList } } </script> ############
修改App.vue文件
<template> <p id="app"> <h1>Vue.js Vue TodoList</h1> <hr> <todoInput /> <todoList /> <p>todoList 数量:{{todoCount}}</p> <pre class="brush:php;toolbar:false">{{$store.state}}<script> import todoInput from './components/input.vue'; import todoList from './components/list.vue'; import {mapGetters} from "vuex"; export default { name: 'app', data () { return { msg: 'Welcome to Your Vue.js App' } }, computed:{ ...mapGetters({ todoCount:"nCounts" }) }, components:{ todoInput, todoList } } </script>
index.html添加bootstrap.css
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>vue-vuex-demo</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <p id="app"></p> <script src="/dist/build.js"></script> </body> </html>
以上就是本篇文章的所有内容,大家要是还不太了解的话,可以自己多实现两边就很容易掌握了哦!
相关推荐:
以上是vuejs實作外掛程式狀態管理詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!