VUE08--{VUEX}

VUEX是什么

管理(修改或设置)组件用到的数据的工具。免除了之前组件传值的麻烦。组件传值


VUEX组成

官方图片

store
容器对象,储存state,mutations,actions,getters
state
保存数据的对象
mutations
保存函数的对象,只有mutations中的函数,才能更改state中数据的值,触发方式 this.$store.commit(param)(不支持异步操作)
actions
保存函数的对象,actions中的函数能够触发mutations中的函数,从而修改state中数据的值(支持异步操作)
getters
保存函数的对象,通过getters中的函数,可以计算依赖于state数据的新数据


VUEX使用步骤

1. 安装
终端运行npm i vuex -S,注意:生产环境中也需要使用
2.文件结构

文件结构

3.流程分析
(1)

  • 新建store文件夹,在文件夹中创建store.js文件
  • 在store.js中引入vuex,挂载vuex
  • 将对应的数据或者函数分别写入对应的state、mutations、actions、getters
  • 创建vuex实例并导出
    (2)
  • 在main.js中引入store.js
  • 在vue实例中注入store
    (3)
  • 在components文件夹中新建decrement.vue和increment.vue
  • 注意:组件提交mutations等的两种方法 | 如何传参 | mapXXXXX前一定要加... | mutations(commit) 、actions(dispatch)
    (4)
  • 在App.vue中导入子组件
  • 在App.vue导出对象中创建子组件
  • 在坑中填上子组件
    4.文件内容
    (1)store.js
// 引入vue、vuex
import Vue from 'vue'
import Vuex from 'vuex'

// 挂载vuex
Vue.use(Vuex)

// 给vuex中的四个核心内容填值和方法
const state = {
    count : 0
}
const mutations = {
    // 加法
    increment: (state, n) => {
        state.count = state.count + n;
        return state.count
    },
    // 减法
    decrement: (state, n) => {
        state.count = state.count - n;
        return state.count
    },
    // 归零
    zero: state => state.count = 0,
    // 取负
    negate: state => state.count = -state.count
}
const actions = {
    zeroAct ({commit}) {
        commit('zero')
    },
    negateAct ({commit}) {
        commit('negate')
    }
}
const getters = {
    evenOrOdd: state => state.count % 2 === 0 ? '偶数' : '奇数'
}

// 创建vuex实例,并导出
export default new Vuex.Store({
    state,
    mutations,
    actions,
    getters
})

(2)increment.vue

<template>
<div>
<br>
当前值为:
<el-tag type='success'>{{$store.state.count}}</el-tag>
<el-button @click="increment">+1</el-button>
<el-button @click="zero">归0</el-button>
</div>
</template>

<script>
// 案例演示两种提交mutations和actions的方法,incerement.vue里演示方法1,decrement.vue里演示方法2
export default {
    methods: {
        // 1. mutations -- commit
        increment() {
            this.$store.commit('increment', 1)
            console.log(this)
        },
        // 2. actions -- dispatch
        zero () {
            this.$store.dispatch("zeroAct")
        }
    }
}
</script>

<style scoped>

</style>

(3)decrement.vue

<template>
<div>
<br>
当前值为:
<el-tag type='success'>{{$store.state.count}}</el-tag>
<el-button @click="decrement(1)">-1</el-button>
<el-button @click="negateAct">取负</el-button>
<br><br>
{{evenOrOdd}}
</div>
</template>

<script>
// 案例演示两种提交mutations和actions的方法,incerement.vue里演示方法1,decrement.vue里演示方法2
import {mapMutations, mapActions, mapGetters} from 'vuex'
export default {
    methods: {
        // 1.前面要加... 2.mapMutations可以引入多个方法 3.([])注意结构
        ...mapMutations([
            'increment',
            'decrement'
        ]),
        ...mapActions([
            'negateAct'
        ]),
    },
    computed: {
        ...mapGetters([
            'evenOrOdd'
        ])
    }
}
</script>

<style scoped>

</style>

(4)main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'

// 引入element-ui
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

// 挂载element-ui
Vue.use(ElementUI)

// 引入index.scss
import '@/styles/index.scss'

Vue.config.productionTip = false

// 引入store,并在vue实例中注入store
import store from '@/store/store'

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

(5)App.vue

<template>
  <div id="app">
      vuex展示
    <increment></increment>
    <decrement></decrement>
    <router-view/>
  </div>
</template>

<script>
// 导入子组件
import increment from '@/components/increment'
import decrement from '@/components/decrement'

export default {
  name: 'App',
  components: {
      increment,
      decrement
  }
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

案例基础:vue-cli和element-ui


VUEX案例问题补充

  • 页面刷新,store对象中state变量丢失怎么办?

使用localStorage。先存值,再赋值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容