我理解的概念

vuex是为vue提供了全局的状态仓库(store),就像一个状态机,避免了父子、兄弟组件之前复杂的传参。他维持了全局共用的数据的一致性。

核心概念秒懂

1,state 共用的数据

2,getters 处理state后得到想要的数据

3,mutations 唯一可以修改state的函数

4,actions 只能显式的调用mutations,可以异步、请求数据

5,moudles 把1、2、3、4包装起来的当成一个模块,可以有多个也可以没有

不说废话直接在实例里面一一解释

项目结构:

在这里插入图片描述

安装

cnpm i vuex -S 

创建

创建如图的store

以下代码都是moduleA代码,

state.js

const state = {
  userInfo: {
    userName: '秋刀鱼笛滋味',
    age: 28,
    job: '前端工程师'
  },
  firend: [],
  girlfirend: [
    {
      name: 'LuoSi',
      age: 20,
      nationality: '韩国'
    },
    {
      name: 'AnNi',
      age: 22,
      nationality: '俄罗斯'
    }
  ]
}
export default state;

state没啥好解释的就一个对象,放你要用的状态码

getters.js

const getters = {
  userJob: (state) => {
    return `${state.userInfo.job}`
  },
  girlfirendInfo: (state, getters) => {
    const girlfirend = state.girlfirend
    let info = girlfirend.map((item, index) => {
      return `${index   1}号女友的名字是${item.name},年龄${item.age},来自${item.nationality}`
    }).join(',')
    return `一共有${girlfirend.length}个女友,${info},可怕的是他只是一名${getters.userJob}。`
  }
}
export default getters;

getters接受两个参数,第一个是state,第二个是getters里面其他的函数

mutation.js

import axios from 'axios';
const mutations = {
  ageAdd (state, payload) {
    payload = payload || 1
    state.userInfo.age  = payload
  },
  addGirlFirend (state, payload) {
    state.girlfirend.push({ name: payload.name, age: payload.age, nationality: payload.nationality })
  },
  getFirend (state, payload) {
    state.firend = payload
  },
  mutfired (state) { //vuex严禁在mutations里面进行异步操作,严格模式报错,难于调试
    axios.get('/myServer').then(res => {
      if (res.status === 200) {
        state.firend = res.data.data.list
      }
    })
  }
}
export default mutations;

mutations接受两个参数:state payload(调用时携带的参数),他是唯一可以修改state的地方,注意不可异步、不可调接口,严格模式会报错

如图:

在这里插入图片描述

actions.js

import axios from 'axios';
const actions = {
  addGirlFirend ({ commit, state, getters }, payload) {
    commit('addGirlFirend', payload);
  },
  getFirends (ctx) { //ctx是store下当前module对象
    axios.get('/myServer').then(res => {
      if (res.status === 200) {
        ctx.commit('getFirend', res.data.data.list)
        //直接在actions里面也可以修改state,但是不建议,创建store时用严格模式,会报错,不符合vuex单向数据流的规范(只能在mutions里面修改state)
        // ctx.state.firend = res.data.data.list
      }
    })
  }
}
export default actions;

actions接受一个当前module的上下文对象(常用有commit),用来commit 提交mutations,主要用来请求后端数据,可以异步

index.js

import state from './state';
import getters from './getters';
import mutations from './mutations.js';
import actions from './actions';
const moduleA = {
  state,
  getters,
  mutations,
  actions
}
export default moduleA;

把各个组件集合起来暴露出模块

再来看看store的实例化

store/index.js

import Vuex from 'vuex'
import Vue from 'vue'
import moduleA from './moduleA';
import moduleB from './moduleB';
Vue.use(Vuex)
let store = new Vuex.Store({
  //在严格模式下,无论何时发生了状态变更且不是由 mutation 函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到。
  //*严格模式会深度监测状态树来检测不合规的状态变更——请确保在发布环境下关闭严格模式,以避免性能损失。
  strict: process.env.NODE_ENV !== 'production',//自动在生产环境下关闭严格模式
  modules: {
    moduleA,
    moduleB
  }
})
export default store

注意:一定要用Vue.use一下vuex,最好使用严格模式!

当然store里面还可以用命名空间和插件,一般项目用不上

挂载store

在项目主文件

main.js 实例化vue时,挂载

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

直接在实例里面看怎么快速使用store吧

helloWorld.vue

<template>
  <div>
    <Card style="width:550px">
      <div slot="title">
        <Icon type="ios-film-outline"></Icon>
        个人信息
      </div>
      <div>
        <p>姓名: {{userInfo.userName}}</p>
        <p>年龄: {{userInfo.age}}</p>
        {{girlfirendInfo}}
      </div>
    </Card>
    <hr style="margin:20px 0" />
    <Button type="success" @click="ageAdd()">增加了一岁</Button>
    <hr style="margin:20px 0" />
    <Button type="success" @click="addAge">增加了两岁(commit)</Button>
    <hr style="margin:20px 0" />
    <Card style="width:550px">
      <div slot="title">
        <Icon type="ios-film-outline"></Icon>
        女友信息:
      </div>
      <div>
        名字:
        <Input v-model="girlInfo.name"></Input>
        年龄:</br>
        <Input-number :max="100" :min="1" v-model="girlInfo.age"></Input-number></br>
        国籍:
        <Input v-model="girlInfo.nationality"></Input>
      </div>
      <Button type="success" @click="addGirlFirend(girlInfo)">增加</Button>
      <Button type="success" @click="addGirlFirend1">增加(dispatch)</Button>
    </Card>
    <hr style="margin:20px 0" />
    <Card style="width:550px">
      <div slot="title">
        <Icon type="ios-film-outline"></Icon>
        朋友信息:
      </div>
      <div>
        <p v-for="item in firend" :key="item.userName">{{item.userName}}</p>
      </div>
      <Button type="info" @click="getFirends">获取朋友</Button>
    </Card>
  </div>
</template>
<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
export default {
  data () {
    return {
      girlInfo: {
        name: '',
        age: 18,
        nationality: ''
      }
    }
  },
  computed: {
    ...mapGetters(['girlfirendInfo']),
    ...mapState({
      userInfo: state => state.moduleA.userInfo, //使用vuex的modules后一定要指明模块
      firend: state => state.moduleA.firend
    })
  },
  methods: {
    ...mapActions(['addGirlFirend', 'getFirends']), //this.$store.dispatch('addGirlFirend',payload)
    ...mapMutations(['ageAdd']), //this.$store.commit('ageAdd',payload)
    // 上面两个辅助函数方法的实质跟下面是一样的,推荐 使用辅助函数
    addAge () {
      this.$store.commit('ageAdd', 2)
    },
    addGirlFirend1 () {
      this.$store.dispatch('addGirlFirend', this.girlInfo)
    }
  }
}

先看一下初始UI吧

在这里插入图片描述

简单解释一下

主要的4个模块,有对应的四个辅助函数,用处是把状态 和 操作映射到当前页面

  • mapState mapGetters,是状态数据,放在计算属性;
  • mapMutationsmapActions 是操作函数, 显然放在方法里面;

注意带的注释;

直接看效果吧

调用mutations

在这里插入图片描述

调用actions

在这里插入图片描述

actions调接口

在这里插入图片描述

在这里插入图片描述

vuex的问题,解决方法点击vuex刷新state就没了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。 

vuex入门教程,图文+实例解析的更多相关文章

  1. 解决vue路由组件vue-router实例被复用问题

    这篇文章介绍了解决vue路由组件vue-router实例被复用的问题,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. JSP开发入门(五)--JSP其他相关资源

    JSP其他相关资源:ServletsandJavaServerPages(JSP)1.0:ATutorialhttp://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/JavaServerPagesTM:ADeveloper'sPerspectivehttp://developer.java.sun.com/developer/technicalArtic

  3. 一文详解Pinia和Vuex与两个Vue状态管理模式

    这篇文章主要介绍了一文详解Pinia和Vuex与两个Vue状态管理模式,Pinia和Vuex一样都是是vue的全局状态管理器。其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia

  4.  typeScript入门基础介绍

    这篇文章主要介绍了 typeScript入门基础,TypeScript 是由微软开发的开源、跨平台的编程语言,是 javaScript 的超集,最终被编译为 javaScript代码。常常被简称为TS支持JS、ES语法,下文将继续其他基础介绍,需要的朋友可以参考一下

  5. Reactive Programming入门概念详解

    这篇文章主要为大家介绍了Reactive Programming入门概念详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  6. uniapp中vuex的应用使用步骤

    Vuex是一个专为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,下面这篇文章主要给大家介绍了关于uniapp中vuex的应用使用,需要的朋友可以参考下

  7. JSP入门教程(1)

    现在Sun公司并不会因你使用JSP向你收费,况且用于Solaris、Linux以及Windows系统的组件都很容易获得。Web服务器自动将通过JSP生成的Java代码片段转换成Java片段。JSP也可自动控制许多功能,如过去用Perl脚本编写功能程序或像ASP这样的服务器专用API。JSP基本语法讲完安装问题后,现在进入来讨论JSP语法。共有五种JSP指令和脚本元素。在更新的JSP1.1规范出台后,就有了与XML兼容的版本。“Taglib”指令不在讨论之列,但是在用JSP1.1创建自定义标记可以使用它。

  8. JSP开发入门(一)--安装好你的机器来使用JSP

    JSP开发入门(一)----安装好你的机器来使用JSP你将会需要Java2软件开发工具,它原来的名称是Java发展工具以及JavaServer网站发展工具,Tomcat,或是其它支持JSP的网络服务器。Sun免费提供JSDK与JSWDK来供Windows,Solaris,以及Linux平台使用。下载与安装你需要的组件目前发布的1.2.2-001,JSDK可下载的版本是以可安装的压缩形式。下载的文件大约是20MB,可提供完整的Java发展环境,让你能建立利用标准API为核心的Java解决之道。然而,你的网络

  9. Android 美食大转盘详解流程

    今天为大家带来一篇Android实例项目,美食大转盘,当你还在为明天吃什么而烦恼时,它将帮你做出最佳的选择,美食大转盘详细流程来咯

  10. 3.从实例开始

    3PHP实践PHP的许多特点与其他软件或者工具有关。好吧,我们现在开始专注于一个典型个人网站的建设。让我们从一个标题页面、一个联系信息页面和一个简历页面开始。我自己,19993.2HTML到PHP从上面你可以看出,每个页面有相同的头部和底部。

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部