<!DOCTYPE html>
<html lang="en" xmlns="">
<head>
    <meta charset="UTF-8">
    <title>创建Vuex容器</title>
</head>
<body>
<div id="app">
    <button-counter></button-counter>
</div>

<!-- 引入最新版本的 vue 和 vuex -->
<script src="https://unpkg.com/vuex"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
	// 自定义组件
    Vue.component('ButtonCounter', {
        computed: {
            count() {
            	// 访问 Vuex 中的状态
                return this.$store.state.count
            }
        },
        methods: {
            handleClick() {
            	// 访问 Vuex 中的方法
                // 通过 commit 调用 mutations 下的方法
                this.$store.commit('increment')
            }
        },
        template: `<button @click="handleClick">You clicked me {{ count }} times.</button>`
    })

    // 创建Vuex容器
    const store = new Vuex.Store({
        // 严格模式,不使用 mutations 变更 state 数据,抛出异常
        strict: true,
        // 状态数据放在 state 选项中
        state: {
            count: 0
        },
        // mutations 定义修改 state 选项中属性状态的方法,state 作为接收的第一次参数
        // 不建议直接修改 state,直接修改不容易跟踪变化
        mutations: {
            increment(state) {
                state.count++
            }
        }
    })

    new Vue({
        el: '#app',
        // 注册 store 示例,ES6 对象的 property 简写 (用在对象某个 property 的 key 和被传入的变量同名时)
        // store: store,
        store // 与上面注释作用相同,ES6支持的简写形式
    });

</script>
</body>
</html>

在这里插入图片描述


store.js:Vuex单独文件管理(在 Vue CLI框架下)

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

// 创建Vuex容器
export default new Vuex.Store({
  strict: true,
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    },
    incrementBy(state, payload) {
      state.count += payload.amount
    }
  }
})

Vue 组件引用

<template>
  <div>
    <button @click="handleClick">handleClick</button><hr>
    <button @click="add">increment as add:You clicked me {{ count }} times.</button><hr>
    <button @click="incrementBy({amount: 10})">incrementBy:You clicked me {{ count }} times.</button>
  </div>
</template>

<script>
import {mapMutations} from 'vuex'
import store from '@/store'

export default {
  store,
  computed: {
    count() {
      return this.$store.state.count
    }
  },
  methods: {
    handleClick() {
      alert('Hello, 我是组件自己的方法 ~')
    },
    ...mapMutations([
      'incrementBy'
    ]),
    ...mapMutations({
      add: 'increment'
    })
  }
}
</script>

<style scoped></style>
Logo

前往低代码交流专区

更多推荐