Vue3 Vuex的使用

引入Vuex

在./stores/vstore文件夹下的index.js中引入createStore,并配置全局的store

javascript 复制代码
import { createStore } from "vuex";

在main.js中引入./stores/vstore

javascript 复制代码
import vstore from './stores/vstore';

const app = createApp(App)

app.use(vstore)

export default app

数据对象的存储与读取

创建Vuex Strore在state中声明要存储的数据对象

javascript 复制代码
export default createStore({
  // 数据,相当于data
  state:{
    userinfo:{
      name:"Alisa",
      color:"yellow",
      age:"33"
    },
    golbalgood:{
      name:"pen",
      color:"black",
      num:100
    },
    populars:[
      {
        num:100, name:"one hundrerd"
      },
      {
        num:200, name:"two hundrerd"
      },
      {
        num:300, name:"three hundrerd"
      },
      {
        num:400, name:"four hundrerd"
      },
    ]
  }
})

读取state中对象的值

javascript 复制代码
<template>
  <div class="box">
    <div class="back">
      <div class="show">全局store中的userinfo的name:{{ $store.state.userinfo.name }}</div>
      <div class="show">全局store中的golbalgood的num:{{ $store.state.golbalgood.num }}</div>
    </div>
  </div>
</template>

<script>

import { useStore } from "vuex";

export default{
 
  setup(props, context){
    const store = useStore()
    const popularNames = store.getters.moreTwoPopular
    return {
      store,
      popularNames,
    }
  },
  data(){
    return {
      
    }
  }
}

</script>

<style lang="less" scoped>

.showtxt{
  padding: 5px;
  font-size: 20px;
}

.btn{
  background-color: cadetblue;
  padding: 2px 5px 2px 9px;
  margin: 20px;
}

.back{
  background-color: antiquewhite;
  .show{
  padding: 5px;
  font-size: 20px;
  }
}

</style>

在mutation中改变state中数据对象的值

javascript 复制代码
export default createStore({
  // 数据,相当于data
  state:{
    golbalgood:{
      name:"pen",
      color:"black",
      num:100
    }
  },
  // 里边可以定义很多方法,用于操作state中的数据
  mutations:{
    changeGlobalGoodColor(state,color){
      state.golbalgood.color = color
    },
    changeGlobalGoodName(state, name){
      state.golbalgood.name = name
    }
  },
})
javascript 复制代码
<template>
  <div class="box">
    <h3>2 改变vuex中的数据</h3>
    <div class="back">
      <div>
        <span class="showtxt">全局store中globalgood的color:{{ $store.state.golbalgood.color}}</span>
        <span class="btn" @click="changeGlobalGoodColor">通过commit触发mutations change</span>
      </div>
      <div>
        <span class="showtxt">全局store中globalgood的name:{{ $store.state.golbalgood.name }}</span>
        <span class="btn" @click="changeGlobalGoodName">通过dispatch触发actions change</span>
      </div>
    </div>
  </div>
  
</template>

<script>
import { useStore } from "vuex";

export default{
  setup(props, context){
    const store = useStore()
    const popularNames = store.getters.moreTwoPopular
    return {
      store,
      popularNames,
    }
  },
  data(){
    return {
      
    }
  },
  methods:{
    changeGlobalGoodColor(){
      this.$store.commit("changeGlobalGoodColor", "white~")
    },
    changeGlobalGoodName(){
      this.$store.dispatch("changeGlobalGoodName", "paper")
    }
  }
}

</script>

<style lang="less" scoped>

.showtxt{
  padding: 5px;
  font-size: 20px;
}

.btn{
  background-color: cadetblue;
  padding: 2px 5px 2px 9px;
  margin: 20px;
}

.back{
  background-color: antiquewhite;
  .show{
  padding: 5px;
  font-size: 20px;
  }
}

</style>

getter读取数据

通过getter获取state中对象属性的值

objectivec 复制代码
import { createStore } from "vuex";

export default createStore({
  // 数据,相当于data
  state:{
    populars:[
      {
        num:100, name:"one hundrerd"
      },
      {
        num:200, name:"two hundrerd"
      },
      {
        num:300, name:"three hundrerd"
      },
      {
        num:400, name:"four hundrerd"
      },
    ]
  },
  // 类似于组件的计算属性
  getters:{
    moreTwoPopular(state){
      return state.populars.filter(item=>item.num>200)
    }
  },

})
javascript 复制代码
<template>
  <div class="box">
    
    <div class="back">
      <div v-for="(item, index) in popularNames" :key="index">
        <!-- <span class="showtxt"> -->
          全局store中globalgood过滤条件后的name:{{ item.name }}
        <!-- </span> -->
      </div>
    </div>
  </div>
</template>

<script>
import { useStore } from "vuex";

export default{
  setup(props, context){
    const store = useStore()
    const popularNames = store.getters.moreTwoPopular
    return {
      store,
      popularNames,
    }
  }
}

</script>

<style lang="less" scoped>

.showtxt{
  padding: 5px;
  font-size: 20px;
}

.btn{
  background-color: cadetblue;
  padding: 2px 5px 2px 9px;
  margin: 20px;
}

.back{
  background-color: antiquewhite;
  .show{
  padding: 5px;
  font-size: 20px;
  }
}

</style>

vuex使用modules引入拆分得store

下面是一个拆分出的store,car.js

javascript 复制代码
export default {
  state:{
    name:"byd",
    color:"white",
    speed:"300"
  },
  mutations:{
    changeCarName(state, name){
      state.car.name = name
    },
    changeCarColor(state, color){
      state.car.color = color
    },
    changeCarSpeed(state,speed){
      state.car.speed = speed
    }
  },
  actions:{
    changeCarName(context, name){
      setTimeout(() => {
        context.commit('changeCarName', name)
      }, 300);
    },
    changeCarColor(context, color){
      setTimeout(() => {
        context.commit('changeCarColor', color)
      }, 3000);
    },
    changeCarSpeed(context,speed){
      setTimeout(() => {
        context.commit('changeCarSpeed', speed)
      }, 3000);
    }
  }
}

将car.js引入到全局store中的modules中

javascript 复制代码
import { createStore } from "vuex";
import car from "./modules/car.js";

export default createStore({
  // state过长时用于分割成多个state,每个里边可以包含state、mutations、actions,getter这些属性
  modules:{
    car,
  }
})

在自定义组件ComA中使用car.js中存储的car数据对象

javascript 复制代码
<template>
  <div class="box">
    <span>使用Vuex中的modules中的模块Car,</span>
    <span>获取Car的name: {{ name }},</span>
    <span>获取Car的color: {{ color }},</span>
    <span>获取Car的speed: {{ speed }}</span>
    <div class="btn" @click="clickbtn"> tap </div>
  </div>
</template>

<script>
import { useStore } from "vuex";
export default{
  setup(){
    const store = useStore()
    return{
      store
    }
  },
  data(){
    return {
      name:"1",
      color:"2",
      speed:"3",
    }
  },
  methods:{
    clickbtn(){
      console.log("ComA clickbtn", this.store.state.car.name)
      this.name = this.store.state.car.name
      this.color = this.store.state.car.color
      this.speed = this.store.state.car.speed
    }
  }
}
</script>

<style lang="less" scoped>
.box{
  display: flex;
  flex-direction: row;
  background-color: antiquewhite;
  align-items: center;
  margin-top: 20px;
  .btn{
    margin-left: 15px;
    padding: 2px 20px 2px 20px;
    background-color: aquamarine;
  }
}
</style>
相关推荐
小江的记录本2 分钟前
【HTTP】HTTP请求方法与状态码(全体系知识总结+附表格)
前端·网络·后端·网络协议·http·状态模式·web
卤蛋fg68 分钟前
vue表格vxe-table实现表头合并,分组表头自定义合并
vue.js
leafyyuki14 分钟前
前端 SSE 流式请求实战:打造流畅的 AI 流式应答体验
前端·人工智能·markdown
幸福指北22 分钟前
我用 Tauri + Vue 3 + Rust 开发了一款跨平台网络连接监控工具Portview,性能炸裂!
前端·网络·vue.js·tcp/ip·rust
炁场悟道23 分钟前
基于vue3的极简登录架构设计
前端
光影少年26 分钟前
Webpack的核心概念?常见优化手段?
前端·webpack·掘金·金石计划
han_27 分钟前
前端性能优化之白屏、卡顿指标和网络环境采集篇
前端·javascript·性能优化
Flyfreelylss36 分钟前
DOM 注入实践:在 React 中优雅地扩展第三方组件
前端·react.js
北城笑笑44 分钟前
Vue 100 ,Metaspace memory lack Error( 元空间内存不足 )
java·前端·javascript·vue
谏书稀1 小时前
vue项目(pnpm)迁移到无网环境开发
前端·javascript·vue.js