vuex入门教程,图文+实例解析

目录
  • 我理解的概念
  • 核心概念秒懂
  • 不说废话直接在实例里面一一解释
  • 安装
  • 创建
  • 再来看看store的实例化
  • 挂载store
  • 直接在实例里面看怎么快速使用store吧
  • 简单解释一下
  • 直接看效果吧

我理解的概念

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就没了

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

(0)

相关推荐

  • Vuex 入门教程

    Vuex 是什么? 官方给出的解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 相信很多新选手看完这段话有种绝望的感觉.开始我也是这样的,后来我想到了一个比方! 比如某年级有5个小班,每个小班有25个同学,但是只有一个老师授课,假如5个小班就对应着5个组件,每个班的25个同学就相当于每个组件中的25条数据,这个老师就相当于 vuex ,老师讲的课就相当于每一条数据.要保证每个同学受到

  • vuex入门最详细整理

    如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 . 我在使用基于 vue.js 2.0 的UI框架 ElementUI 开发网站的时候 , 就遇到了这种问题 : 一个页面有很多表单 , 我试图将表单写成一个单文件组件 , 但是表单 ( 子组件 ) 里的数据和页面 ( 父组件 ) 按钮交互的时候 , 它们之间的通讯很麻烦 : <!--父组件中引入子组件--> <template> <div> <a href="javas

  • Vue.js实战之Vuex的入门教程

    前言 在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式,详细点击这篇文章查看. 但是如果是大型项目,很多时候都需要在子组件之间传递数据,使用之前的方式就不太方便.Vue 的状态管理工具 Vuex 完美的解决了这个问题. 一.安装并引入 Vuex 项目结构: 首先使用 npm 安装 Vuex cnpm install vuex -S 然后在 main.js 中引入 import Vue from 'vue' import App

  • vuex入门教程,图文+实例解析

    目录 我理解的概念 核心概念秒懂 不说废话直接在实例里面一一解释 安装 创建 再来看看store的实例化 挂载store 直接在实例里面看怎么快速使用store吧 简单解释一下 直接看效果吧 我理解的概念 vuex是为vue提供了全局的状态仓库(store),就像一个状态机,避免了父子.兄弟组件之前复杂的传参.他维持了全局共用的数据的一致性. 核心概念秒懂 1,state 共用的数据 2,getters 处理state后得到想要的数据 3,mutations 唯一可以修改state的函数 4,a

  • Python中的random.uniform()函数教程与实例解析

    random.uniform( ) 函数教程与实例解析 1. uniform( ) 函数说明 random.uniform(x, y)方法将随机生成一个实数,它在 [x,y] 范围内. 2. uniform( ) 的语法与参数 2.1 语法 # _*_ coding: utf-8 _*_ import random random.uniform(x, y) 或 # _*_ coding: utf-8 _*_ from random import uniform uniform(x, y) 提示:

  • 微信公众平台开发入门教程(图文详解)

    在这篇入门教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯及XML语言基础.如果你还没有,那么请先学习相关知识. 我们将使用微信公众账号方倍工作室(账号:pondbaystudio,二维码在最底部)作为讲解的例子. 这篇入门教程将引导你完成如下任务: 创建百度云平台应用启用微信公众平台开发模式获取订阅.文字.图片.语音.视频消息回复文本.图文及音乐消息程序开发 创建百度云应用 申请账号 登录http://developer.baidu.com/bae ,使用邮箱或者手机

  • 如何使用 Vuex的入门教程

    目录 前言 一.基本概念 初识vuex 二.项目场景 三.如何使用 1.安装 2.State初始值 3.Getters修饰值 4.Mutations修改值 5.Actions异步修改值 四.总结 五.建议 前言 本人曾对 Vuex 作过详细介绍,但是今天去回顾的时候发现文章思路有些繁琐,不容易找到重点.于是,在下班前几分钟,我对其重新梳理了一遍. tips:本文的案例均为Vue2版本. 一.基本概念 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组

  • JsRender实用入门教程

    本文是一篇JsRender的实用入门教程,实例讲述了tag else使用.循环嵌套访问父级数据等知识点.分享给大家供大家参考.具体如下: 前言 JsRender是一款基于jQuery的JavaScript模版引擎,它具有如下特点: ·  简单直观 ·  功能强大 ·  可扩展的 ·  快如闪电 这些特性看起来很厉害,但几乎每个模版引擎,都会这么宣传... 由于工作需要,小菜才接触到此款模版引擎.使用了一段时间,发现它确实比较强大,但小菜觉得有些地方强大的过头了,反倒让人觉得很难理解. 另一方面,

  • PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)

    本文实例总结了PHP字符串处理技巧.分享给大家供大家参考,具体如下: Demo1.php <?php //源代码是文本形式,页面显示是 web 形式 $str = ' PHP '; //清理一下两边的空格 ltrim 只清理左,rtrim只清理右边 echo ltrim($str); echo '<br/>'; echo rtrim($str); echo '<br/>'; //两边都清理 echo trim($str); //echo chop($str); ?> D

  • php下Memcached入门实例解析

    本文较为详细的讲述了php下Memcached的入门知识与实例.分享给大家供大家参考.具体如下: memcache 在什么情况下被使用,什么情况下不要使用? 你在何时应该使用 memcache,又要在何时避免使用它?现在你已经知道了,memcahced 是被设计为减轻数据库教程端压力的,但是你最好能制定一个良好的策略,来想办法让 memcached 来尽可能的缓存那些最影响性能的查询,你可以试着为应用中的所有查询做一些执行时间日志,可以帮助你来分析哪些内容是要重点被缓存的. 现在假设你正在运营一

  • PHP入门教程之上传文件实例详解

    本文实例讲述了PHP上传文件的方法.分享给大家供大家参考,具体如下: Demo1.php <form enctype="multipart/form-data" action="Demo2.php" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="2000000" /> 上传文件: &

  • PHP入门教程之面向对象基本概念实例分析

    本文实例讲述了PHP面向对象基本概念.分享给大家供大家参考,具体如下: Demo1.php <?php //怎样去创建一个类 格式:修饰符 class 类名{} //我们去创建一个电脑的类,这类可以创建出对象(生产出电脑) class Computer { //类名第一个字母大写 } //创建一台电脑出来,也就是对象的声明 //格式:变量 = new 类名(); //new Compuer() 表示实例化的过程(意思是创建一个对象) //$compuer1 = new Compuer() 这个过

随机推荐