Vuex详解(一)

127 阅读2分钟

1.Vuex是一个状态管理的容器

自己写Vuex管理

		const OBJ = {
			name:"foo"
		}
		
		Vue.prototype.OBJ = OBJ
			
		const app  = new Vue({
			el:'#app'
		})

问:这样写和Vuex有什么区别呢?

答:Vuex中的状态管理是加入了响应式的,而我们这种手写是没加入响应的

2.Vuex的单页面状态管理

三种属性:state,view,actions

三者关系:state是单页面的状态,可以通过view进行页面展示( {{data中的数据}} ),在view展示的状态可以通过actions来控制(@click="handleClick"),actions可以控制状态,并且可以改变(state(handleClick(){ 数据++ }),形成一个循环关系

image.png

3.Vuex基本使用

//  ./store/index.js 
import Vuex from "vuex"
import Vue from "vue"

Vue.use(Vuex)

const store = new Vuex.Store({
	state:{
		state:0
	},
	mutations:{
		
	},
	getters:{
		
	},
	actions:{
		
	},
	modules:{
		
	}
})


export default store
//  ./main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'


new Vue({
  render: h => h(App),
  router,
  store
}).$mount('#app')

//  ./components/vuex.vue

<h2>{{$store.state.state}}</h2>	

4.Vuex修改的基本操作

image.png

5.Vuex对state状态修改

从上面的图可以知道,Vue官方是不推荐在某一个组件里面直接对state状态进行修改的,Vue推荐的是至少通过mutations进行state状态的修改,如果存在一些异步的操作,这些异步操作都是放在actions里面的。actions一般是处理异步代码的。

	mutations:{
                // 默认带state的参数
                // state是上面 ./store/index.js 的state,里面有个state属性
		increament(state){
			state.state++
		}
		decreament(state){
			state.state--
		}
	},
//html
<h2 @click="addHandleClick"></h2>
<h2 @click="subHandleClick"></h2>

methods:{
    addHandleClick(){
        //对mutations的方法进行提交来改变state状态
        this.$store.commit("increament")
    },
    subHandleClick(){
        this.$store.commit("decreament")
    }
}

6.Vuex中的getters使用(类Vue中的计算属性)

        //一个参数
	getters:{
		getState(state){
			return state.state * 2
		}
	},
        //两个参数
        getters:{
                //第一个参数的state:{},第二个参数就是getters:{}
		getStateLenth(state,getters){
			return getters.getState.length
		}
	},
        //如果要使用参数,那就得传一个函数
        getters:{
		getStateAdd(state){
			return function (age) {
                            retunrn state.state.filter(item => item > age)
                        }
		}
	},
        //使用,返回 item>9 的项
        <h2>{{this.$store.getters.getStateAdd(9)}}</h2>
//html 
<h2>{{this.$store.getters.getState}}</h2>

7.Vuex的mutations传参

mutations:{
		addCouter(state,num){
                     state.state += num
                },
                addStudy(state,stu){
                    state.study.push(stu)
                }
                
	},
        //+5
        <h2 @click="addCouter(5)"></h2>
        //+10
        <h2 @click="addCouter(10)"></h2>
        //传对象
        <h2 @click="addStudy"></h2>
        
methods:{
    addCouter(num){
        // num被成为payload-->负载
        this.$store.commit("increament",num)
    },
    addStudy(){
        const stu = { name:"xiaoming",age:18 }
        this.$store.commit("addStudy",stu)
    }
}

8.Vuex的mutations提交风格

methods:{
    addCouter(num){
        this.$store.commit({
            type:"increament"
            num:num
        })
    },
    addStudy(){
        const stu = { name:"xiaoming",age:18 }
        this.$store.commit({
            type:"increament"
            stu
        })
    }
}
mutations:{
		addCouter(state,payload){
                     console.log(payload)  //对象,{ type:"increament",payload:5 }
                }
                
	},