index.ts

    1. // todo 1、 引入资源
    2. import { createStore } from "vuex";
    3. // todo 2、创建一个新的store实例
    4. const store = createStore({
    5. //modules: 用于数据分块
    6. modules: {
    7. // key:value key数据块名称 value vuex构成部分:state,actions,mutations
    8. countStore: {
    9. // 只分类,没起名
    10. namespaced: true, // namespaced 命名空间 使countStore成为它们名字
    11. state: {
    12. // state是数据 一定是个对象【单一数据源】 好管理
    13. n: 1,
    14. },
    15. actions: {
    16. // actions 也是一个对象 里面放置的是方法,这个方法的作用是创建动作然后发送给mutations
    17. // actions中的方法有两个参数 第一个参数是store,第二个参数是组件发送过来的信息
    18. increment(store, data) {
    19. const action = {
    20. // type: 动作类型[一般用常量表示]
    21. // payload: 组件传递过来的参数
    22. type: "INCREMENT",
    23. payload: data.val,
    24. };
    25. // 动作创建完成后 通过commit 发送action动作给mutations
    26. store.commit(action);
    27. },
    28. decrement(store, data) {
    29. const action = {
    30. type: "DECREMENT",
    31. payload: data.val,
    32. };
    33. store.commit(action);
    34. },
    35. },
    36. mutations: {
    37. // mutations也是对象,里面放置的是方法 。这个方法的方法名就是actions发送过来的action的type
    38. INCREMENT(state, action) {
    39. // state 就是我们的数据源
    40. // action 就是actions发送过来的action
    41. state.n += action.payload;
    42. },
    43. DECREMENT(state, action) {
    44. state.n -= action.payload;
    45. },
    46. },
    47. },
    48. },
    49. });
    50. // todo 3、导出store
    51. export default store;
    52. // 去main.ts

    mian.ts

    1. import { createApp } from 'vue'
    2. import App from './App.vue'
    3. // 激活store
    4. import store from './store'
    5. // todo 4、通过use方法来激活store这个单例
    6. // createApp(App).mount('#app')
    7. createApp(App).use(store).mount('#app')
    8. // 去App.vue

    App.vue

    1. <template>
    2. <div>
    3. <p>{{n}}</p>
    4. <select name="" id="" v-model="val"> <!-- 为下面value的值 -->
    5. <option value="10">10</option>
    6. <option value="30">30</option>
    7. <option value="50">50</option>
    8. </select>
    9. <button @click="add">+</button>
    10. <button @click="decrease">-</button>
    11. </div>
    12. </template>
    13. <script lang="ts">
    14. import { defineComponent,computed, reactive, toRefs } from 'vue'
    15. // 在vuex中引处useStore
    16. import {useStore} from 'vuex'
    17. export default defineComponent({
    18. setup() {
    19. const state = reactive({
    20. val: ''
    21. })
    22. console.log(state.val)
    23. // 在setup中通过useStore得到一个store实例
    24. const store=useStore()
    25. console.log(store.state.countStore.n)
    26. console.log(store.state)
    27. // ?如何获得store中的数据
    28. // 通过计算属性方法到store中的数据
    29. const n = computed(() => store.state.countStore.n)
    30. // ?如何激活actions
    31. const add = () => {
    32. store.dispatch({
    33. type: 'countStore/increment', // type: 数据库名称/actions中的方法名
    34. val: Number(state.val) // 是字符串转成number 或者 xxx-0
    35. }) // 可以激活actions
    36. }
    37. const decrease=()=>{
    38. store.dispatch({ // 发送给数据块的信息
    39. type:'countStore/decrement',
    40. val:Number(state.val)
    41. })
    42. }
    43. return {
    44. n,
    45. add,
    46. decrease,
    47. ...toRefs(state)
    48. }
    49. },
    50. })
    51. </script>