vue-15-vuex-store的用法

时间:2023-03-09 06:12:51
vue-15-vuex-store的用法

vue-16-vuex

1, 介绍

对 vue 进行状态管理的, 集中存储所有组件的所有状态, 解决多个组件共享数据的问题.

即, 所有组件可以拿到同样的状态, 组件间共享数据

2, 在之前进行数据交互, 需要有子父关系

parent:

<template>
<div>
parent: {{ info }}
<Child :title="msg" @sendMsg="handlerMsg"/>
</div>
</template> <script>
import Child from "./Child";
export default {
name: "Parent",
components: {Child},
data() {
return {
msg: "hello son",
info: ""
}
},
methods: {
handlerMsg(info) {
this.info = info
}
}
}
</script> <style scoped> </style>

child:

<template>
<div>
Child:
receive from parent: {{ title }} <div>
<button @click="sendMsg">emit </button>
</div>
</div>
</template> <script>
export default {
name: "Child",
data() {
return { }
},
props: {
title: {
type: String,
default: ""
}
},
methods: {
sendMsg() {
this.$emit("sendMsg", "the message from son ")
}
}
}
</script> <style scoped>
</style>

3. vue的状态管理

view -> (dispath) Action -> (Commit)Mutations -> (Mutate) State -> View

注意: Actions不会必需品, 如果有异步操作才可能用到 Action, 否则不可以使用

4. 安装VueX

cnpm install --save vuex

5. 使用

// vuex
import Vuex from 'vuex'
Vue.use(Vuex)

6. store 是vuex 的核心

在src 下创建 store 文件夹, 并新建 index.js

写入store

// vuex
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) // 创建vuex的store
const store = new Vuex.Store({
state: {
count: 5
},
// 更改store的状态
mutations: {
increment (state) {
state.count++
},
decrement (state) {
state.count--
}
},
// 有异步的时候, 需要action
actions: {
increment(context) {
context.commit('increment')
},
decrement (context) {
setTimeout(function () {
context.commit("decrement")
}, 10)
}
},
// 通过getter 进行数据获取
getters: {
getState(state) {
return state.count > 0 ? state.count : 0;
}
}
}) export default store

在 main.js 中导入, 并注入到 App中

import store from './store'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
el: '#app',
// 注入 store
store,
router,
components: { App },
template: '<App/>',
})

7. 在vue 中进行引用

<template>
<div>
<div>
test...
{{ msg }}<br/>
</div> <div>
获取值 --
{{ getCount }} <br/>
<button @click="add">inc</button>
<button @click="des">decri</button>
</div> </div>
</template> <script>
export default {
name: "outter",
data() {
return {
msg: "hello"
} },
computed: {
// 避免编程负数, 需要通过方法进行获取
getCount() {
// return this.$store.state.count
return this.$store.getters.getState;
}
},
methods: {
add() {
this.$store.commit("increment")
},
des() {
// 使用 action中的异步方法
this.$store.dispatch("decrement")
},
}
}
</script> <style scoped> </style>