当前位置:首页 > vue > 正文内容

vuex的使用

xi7年前 (2019-12-12)vue1601

vuex是什么

vuex是一个专门为vue开发的状态管理工具,它采用集中式存储管理应用的所有组件的状态,其核心是state。

vuex中有什么

state:存放状态数据的地方,其中数据是响应式的,数据改变对应组件的数据也会跟新改变,禁止直接改变state中的数据否则数据无法被调试工具监测。
getter:可理解为store的计算属性,能读取state中的数据。
mutations:装着处理数据逻辑方法的集合体,是该改变state中数据的唯一方法,修改数据是同步的。
actions:提交mutations修改数据,与mutations功能类似,但修改数据是异步的。
modules:当store过于臃肿时,可使用modules将store分割成模块,每个模块中都有自己的state、getter、mutations、actions

vuex使用示例


场景:将store中的数据在ComOne组件中渲染出来,在ComTwo组件中分别同步异步修改。
1、一般使用”vue create xxx”命令创建的项目的默认选项是自带vuex的,无需手动添加。
2、vuex的各种状态和方法是写在src下的store里的index.js中的。
3、在state中存入需要共用的数据。
4、在store中分别写出vuex的getters、mutations、action(modules在数据臃肿时也可将之模块化写出):

5、在ComOne中导入vuex中的辅助函数mapState与mapGetters:

6、在ComOne中用辅助函数映射出vuex的state与getters作为计算属性:

7、在页面直接使用映射出的数据:

8、在ComTwo中导入修改vuex数据的辅助函数mapMutations与mapActions:

9、在ComTwo中使用辅助函数生成修改vuex对应数据的方法:

10、直接在页面中通过回车事件触发修改vuex的方法:

11、在第一行输入框中输入数据按下回车后name与age会立刻更新修改(同步),在第二行输入框中输入数据按下回车后name与age会等待一秒后更新修改(异步)。

具体实现代码

store的index.js:

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

Vue.use(Vuex)

export default new Vuex.Store({
  //state存放状态,
  state: {
    name: "tom",//需要共用的数据
    age: "22"
  },
  //getter为state的计算属性
  getters: {
    getName: (state) => state.name,//获取name
    getAge: (state) => state.age,
  },
  //mutations可更改状态的逻辑,同步操作
  mutations: {
    setName: (state, data) => state.name = data,
    setAge: (state, data) => state.age = data,
  },
  //提交mutation,异步操作
  actions: {
    acSetName(context, name) {
      setTimeout(() => {
        //延时1秒提交至mutations中的方法
        context.commit("setName", name);
      }, 1000);
    },

    acSetAge(context, age) {
      setTimeout(() => {
        context.commit("setAge", age);
      }, 1000);
    }
  },
  // 将store模块化
  modules: {
  }
})

ComOne.vue:

<template>
  <div class="wrapper">
    <!--读取mapGetters中的getName与getAge-->
    <div>
      name:<span>{{ getName }}</span>
    </div>
    <div>
      age:<span>{{ getAge }}</span>
    </div>
  </div>
</template>

<script>
import { mapState, mapGetters } from "vuex"; //导入vuex的辅助函数
export default {
  components: {},
  //计算属性computed无法传递参数
  computed: {
    // 映射 state 中的数据为计算属性
    ...mapState(["name", "age"]),
    // 映射 getters 中的数据为计算属性
    ...mapGetters(["getName", "getAge"]),
  },
};
</script>
<style scoped>
.wrapper {
  color: #fff;
}
</style>

ComTwo.vue:

<template>
  <div class="wrapper">
    <div>
      <span>同步修改:</span>
      <!--直接回车调用mapMutations中的setName方法与setAge方法-->
      <input
        v-model="nameInp"
        @keydown.enter="setName(nameInp)"
        placeholder="同步修改name"
      />
      <input
        v-model="ageInp"
        @keydown.enter="setAge(ageInp)"
        placeholder="同步修改age"
      />
    </div>

    <div>
      <span>异步修改:</span>
      <!--直接回车调用mapAtions中的acSetName方法与acSetAge方法-->
      <input
        v-model="acNameInp"
        @keydown.enter="acSetName(acNameInp)"
        placeholder="异步修改name"
      />
      <input
        v-model="AcAgeInp"
        @keydown.enter="acSetAge(AcAgeInp)"
        placeholder="异步修改age"
      />
    </div>
  </div>
</template>

<script>
import { mapMutations, mapActions } from "vuex"; //导入vuex的辅助函数
export default {
  components: {},
  data() {
    return {
      nameInp: "", //绑定输入框的值
      ageInp: "",
      acNameInp: "",
      AcAgeInp: "",
    };
  },
  methods: {
    //用于生成与 mutations 对话的方法,即:包含 $store.commit(xx) 的函数
    ...mapMutations(["setName", "setAge"]),
    //用于生成与 actions 对话的方法,即:包含 $store.dispatch(xx) 的函数
    ...mapActions(["acSetName", "acSetAge"]),
  },
};
</script>
<style scoped>
.wrapper {
}
</style>

扫描二维码推送至手机访问。

版权声明:本文由曦的博客发布,如需转载请注明出处。

本文链接:http://xiblogs.top:1111/?id=19

“vuex的使用” 的相关文章

vue项目的创建

vue项目的创建

安装node1、检查node,未安装在这里(https://nodejs.org/dist/v16.14.0/node-v16.14.0-x64.msi )下载最新版安装。2、检查npm,node自带npm但不是最新版本,需要命令更新:npm install -g npm 安装vue脚手架1、在国...

vue中按需引入Element-ui

vue中按需引入Element-ui

安装1、安装element-ui:npm i element-ui -S。2、安装babel-plugin-component:npm install babel-plugin-component -D。 修改1、在项目根目录下新建.babelrc文件:2、在.babelrc中写入: {...

vue自定义组件的点击事件失效

vue自定义组件的点击事件失效

在vue开发过程中为了减少重复代码,很多时候都需要将重复的部分写成一个组件,方便调用。但是使用组件时很可能又会给该组件添加点击事件。如果直接这样写,事件则会失效:正确写法应该是这样:...

canvas实现图片标记

canvas实现图片标记

前言由于业务需求,需要有一个图片标记功能,其实就是对图片画框画线做标记,类似微信的图片编辑但是需要存下标记图及其标记的具体数据,。功能其实很简单,但刚开始的时候也是费了一些功夫的。我将原项目中该功能抽离出来单独写了一个demo,作为记录,同时你们在开发过程中有类似需求的话也可以参考一下该思路,其中有...

vue导出word文档

vue导出word文档

具体需求在我的项目中有一个功能需要导出word文档,在页面点击按钮后处理数据生成word文件,然后自动下载文档。 实现步骤 多番查询后发现前端导出word,使用docxtemplater(https://docxtemplater.com/ )较为方便。具体使用步骤如下: 安装docxte...

vue3实现一个抽奖小项目

vue3实现一个抽奖小项目

前言 在公司年会期间我做了个抽奖小项目,我把它分享出来,有用得着的可以看下。浏览链接:https://xiblogs.top/original/other/luckDraw/index.html项目链接:https://gitee.com/xi1213/luck-draw (欢迎star!)项目截...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。