Vuex:
1.什么是vuex 是专门为vue.js开发的状态管理模式,他集中存储了所有组件的状态(包括:数据/事件...)
2.他的应用场景:中大型项目中使用
组件式开发 单页面应用
首页/购物车/中餐/我的---》张三(本地存储) /当前位置(公用的)
3.使用
搭建项目
> vue init webpack-simple Demo
> cd demo
> npm install #安装依赖
1.安装vuex
> cd demo
> cnpm install vuex -S
2.目录结构
webpak.config.json
index.html
src
main.js
app.vue
store(vuex的文件(.js))
state.js===>(state 数据,mutations 事件)
------------------------------------------------------------------
vuex 中的对象 state mutations
state.js内容
//vuex文件的内容
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const state = { //存储数据
count: 1
}
const mutations = { //改变数据状态的 存储事件的
add (state) {
state.count++;
},
reduce (state) {
state.count--;
}
}
export default new Vuex.Store({
state,
mutations //挂载到对象中
})
App.vue
文件中调用state数据
*********原始方式:*********
在script标签中 引入store
import store from './store/state.js'
export default {//中添加store
store,
}
在template 标签组件中添加state数据
{{$store.state.count}} #标签中调用
button按钮 点击事件
<button @click="$store.commit('add')">+</button>
<button @click="$store.commit('reduce')">-</button>
------------------------------------------------
*********第二种方式:********* 使用vue 的computed 计算属性
在script标签中 引入store
import store from './store/state.js'
export default {//中添加store
store,
computed:{ //使用vue 中computed属性 计算属性
return store.state.count;
}
}
在template 标签组件中添加state数据
{{count}}
------------------------------------------------
*********第三种方式:********* (推荐使用)使用vuex 的mapState属性
在script标签中 引入store
import store from './store/state.js'
import {mapState} from 'vuex'
export default {//中添加store
store,
computed:{["count"]} //可以写数组["count"] 也可以写对象 {count:state=>state.count} 用箭头函数
}
在template 标签组件中添加state数据
{{count}}
---------------------------------------------------------------------
mutations 事件
** 在state.js 中
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
count:1
}
const mutations = {
add(){
state.count++;
},
reduce(){
state.count--;
}
}
export default new Vuex.Store({
state,mutations //挂载常量
})
** 在App.vue文件中
*********原始方式:********* 利用vuex的store 对象调用对应属性及方法 需要commit 方法进行提交才能生效
template定义组件中使用数据和事件
{{count}}
<hr/>
<button @click="$store.commit('add')">+</button>
<button @click="$store.commit('reduce')">-</button>
在script中引入
import store from './store/state'
import {mapState} from 'vuex'
export default {
store,
mutations,
computed:mapState(["count"])
}
*********第二种方式:********* 利用vuex 中的mapMutations 对象进行调用方法内部实现方法的提交生效
template定义组件中使用数据和事件
{{count}}
<hr/>
<button @click="add">+</button>
<button @click="reduce">-</button>
在script中引入
import store from './store/state'
import {mapState,mapMutations} from 'vuex'
export default {
store,
mutations,
computed:mapState(["count"]),
methods:mapMutations(["add","reduce"])
}
---------------------------------------------------------------------
vuex 中的对象 getters
getters===>相当于vue 中的computed 计算属性 ,有过滤的效果
** 在state.js 中
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
count : 1
}
const mutations = {
add(state){
state.count++;
},
reduce(state){
state.count--;
}
}
const getters = {
count(state){
return state.count += 10;
}
}
export default new Vuex.Store({
state,
mutations,
getters
})
** 在App.vue文件中
template定义组件中使用数据和事件
{{count}}
<hr/>
<button @click="add">+</button>
<button @click="reduce">-</button>
在script中引入
import store from './store/state.js'
import {mapState,mapMutations} from 'vuex'
export default {
store,
computed:{
//第一种方式原始getters写法 属性 进行过滤
count: function (store) {
return this.$store.getters.count
},
//第二种getters写法 用es6语法 第一步引入mapGetters 模块
...mapState(["count"]),//es6 写法
...mapGetters(["count"])
},
methods: mapMutations(["add", "reduce"])
}
------------------------------------------------------------------
vuex 中的对象 actions
Actions类似于mutations ,不同在于
action提交的是mutations,而不是提交状态
action可以包含任意异步操作。
** 在state.js 中
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const state = {
count:1
}
const mutations= {
add(state){ state.count++},
reduce(state){state.count--}
}
const actions = {
add({commit}){ commit("add")},
reduce({commit}){ commit.("reduce")},
odd({commit}){if(state.count%2 == 0){ commit("add")}},
ay({commit}){setTimeout(()=>{commit("reduce")},1000);}
}
export default new Vuex.Store({
state,mutations,actions
})
** 在App.vue文件中
template定义组件中使用数据和事件
{{count}}
<hr/>
<button @click="add">+</button>
<button @click="reduce">-</button>
<button @click="odd">偶数</button>
<button @click="ay">异步</button>
在script中引入
import store from './store/state.js'
import {mapState,mapActions} from 'vuex'
export default {
store,
computed:{
...mapState(["count"])//es6 写法
},
methods: mapActions(["add", "reduce","odd","ay"])
}
----------------------------------------------------------
vuex 中的对象 modules 模块
** 在state.js 中
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const state = {
count:1
}
const mutations= {
add(state){ state.count++},
reduce(state){state.count--}
}
const actions = {
add({commit}){ commit("add")},
reduce({commit}){ commit.("reduce")},
odd({commit}){if(state.count%2 == 0){ commit("add")}},
ay({commit}){setTimeout(()=>{commit("reduce")},1000);}
}
const module = {
state,mutations,actions
}
export default new Vuex.Store({
modules:{
a:module
}
})
** 在App.vue文件中
template定义组件中使用数据和事件
{{count}}
在script中引入
import store from './store/state.js'
import {mapState,mapActions} from 'vuex'
export default {
store,
computed:{
count(){
return this.$store.state.a.count
}
},
methods: mapActions(["add", "reduce","odd","ay"])
}
----------------------------------------
vuex_的项目结构
把state.js 拆分开用
index
src
app.vue
main.js
store
index.js===>入口
mutations.js===>事件/数据
action.js===>提交事件
types.js ===>事件名称,定义为常量
getters ===>computed 计算属性/过滤 返回数据
创建store文件夹
1.在store目录下创建index.js===》入口
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import actions from "./actions"
import mutations from "./mutations"
export default new Vuex.Store({
modules:{
mutations
},
actions
})
2.在store目录下创建mutations.js===》存放数据和事件
import getters from "./getters"
const state = { count : 10}
const mutations = { }
export default{
state,getters
}
3.在store目录下创建getters.js ===》相当于计算属性 返回属性的
exprot default {
count(state){return state.count}
}
4.在src根目录下找到
** 在main.js 中引入 store 数据和事件
import store from './store/' //默认就是index.js
new Vue{
store,//挂载到Vue对象中
}
** 在App.vue 组件中添加被展示的数据
template标签中添加
{{count}}
script里面引入 vuex 按需引入对象
import{mapGetters} from "vuex"
exprot default{computed: mapGetters(["count"]),}
运行项目可以看到 count属性值==》数据添加完成
5.添加事件
在store目录下创建types.js====》事件名称,定义为常量
export const ADD = "ADD";
export const REDUCE ="REDUCE"
在store目录下找到mutations.js编辑事件
引入types
import { ADD, REDUCE } from './types' //按需引入
const mutations = { [ADD](state){state.count++},[REDUCE](state){state.count--} }
export default{
mutations //挂载
}
在store目录下创建actions.js===>提交事件
import * as types from "./types"
export default{
add({commit}){commit(types.ADD)},
reduce({commit}){commit(types.REDUCE)}
}
在store目录下找到index.js 引入action
import actions from "./actions"
export default new Vuex.Store({
actions
})
在App.vue文件中添加点击事件触发
template标签下
<button @click="add">+</button>
<button @click="reduce">-</button>
scripte内
使用vue 的mapActions
import {mapGetters,mapActions} from "vuex"
export default {
computed:mapGetters(["count"])
methods:mapActions(["add","reduce"])
}
实现事件功能
Vuex 组件中的属性对象及项目搭建
猜你喜欢
转载自blog.csdn.net/weixin_39209728/article/details/84324121
今日推荐
周排行