详细讲解vue2+vuex+axios


Posted in Javascript onMay 27, 2017

在vue2项目中,组件间相互传值或者后台获取的数据需要供多个组件使用的情况很多的情况下(后台获取数据存入vuex,组件之间共享数据),那么就需要用vuex来管理这些。

整个的流程是在组件的created中提交dispatch,然后通过action调用一个封装好的axios,然后再触发mutation来提交状态改变state中的数据,然后在组件的计算属性中获取state的数据并渲染在页面上

首先新需要在项目中安装vuex:

运行命令:npm install vuex --save-dev

在项目的入口js文件main.js中:import store from './store/index'

并将store挂载到vue上:

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

然后看下整个store的目录结构,modules文件夹用来将不同功能也面的状态分成模块,index.js文件夹是store的入口文件,types文件夹是定义常量mutation的。文件夹整个vuex的目录结构如下:

详细讲解vue2+vuex+axios

这里我新建了文件夹fetch用来编写所有的axios处理(这里是把axios封装了)并且在fetch文件夹下新建api.js文件:

import axios from 'axios'
 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
 axios.defaults.baseURL = '后台接口公共前缀';
 export function fetch(url, params) {
  return new Promise((resolve, reject) => {
   axios.post(url, params)
    .then(response => {
    resolve(response.data);
 })
 .catch((error) => {
  reject(error);
  })
 })
 }
 export default {
 // 获取我的页面的后台数据
  mineBaseMsgApi() {
  // alert('进入api.js')
   return fetch('/api/getBoardList');
  },
  commonApi(url, params) {
  return fetch(url, params)
  }
 }

在store的入口文件index.js中:

// 组装模块并导出 store 的文件
 import Vue from 'vue'
 import Vuex from 'vuex'
 import mine from './modules/mine';
 import club from './modules/club';
 Vue.use(Vuex);
 // 导出需要的模块
 export default new Vuex.Store({
  modules: {
   club,
   mine
  }
 });

一般在项目中,我们跟在交互的时候,无非是存数据和取数据。首先我们来看存数据:

1:在你需要请求后台数据并想使用vuex的组件中的created分发第一个dispatch:

created() {
  // 保存ID到vuex,在购买页面使用
  this.$store.dispatch('storeMovieID',this.$route.params.ID)——(“action名”,data);
  api.commonApi('url','params')
   .then(res => {
    this.backMsg = res.data;
    console.log(this.backMsg);
    console.log('调用封装后的axios成功');
   })
 },

2:然后在store/modules下的对应模块js文件中,这里我使用的club.js文件中编写state、action和mutation(一般为了方便,我们会习惯的把action里面的名字以驼峰式命名,而mutation里面的命名,我们会采用全大写+下划线的命名方式)actions 用来触发mutations,action可以进行异步操作 ,在action里可以用commit提交mutations

const actions = {
  // 保存ID storeMovieID为上面的"action名"
  storeMovieID({ commit }, res) {
   //此处是触发mutation的 STORE_MOVIE_ID为"mutation名"
   commit(types.STORE_MOVIE_ID, res);
  },
 }

3:我们需要在type.js里面定义常量:

// ID 变量名(大写)=‘常量名(大写)'
export const STORE_MOVIE_ID = 'STORE_MOVIE_ID';

4:通过mutation修改state中的数据:

//mutation名常量定义 并且需要在type.js文件下定义常量
const mutations = {
 // 修改ID 中括号代表常量 [types.常量名]
 [types.STORE_MOVIE_ID]( state, res) {
  state.movieID = res;  //state.数据名 = data
 },
}

5:定义state数据:(数据名:初始值)

const state = {  //采用 数据名:初始值的格式
 contextPathSrc: '后台接口公共部分',
 movieID: '',
}

最后所有的club.js完整内容如下:(当然getters是在取数据的时候用的,下面会讲)

import api from './../../fetch/api';
import * as types from './../types.js';
// state 是vuex 保存数据的,就相当于vue里的data
const state = {
 contextPathSrc: '后台接口公共部分',
 movieID: '',
}
const actions = {
 // 保存ID storeMovieID为上面的"action名"
 storeMovieID({ commit }, res) {
  //此处是触发mutation的 STORE_MOVIE_ID为"mutation名"
  commit(types.STORE_MOVIE_ID, res);
 },
}
const getters = {
 // 图片公共 src 的获取 getter函数:state=> state.数据名
 getContextPathSrc: state => state.contextPathSrc,
 // 获取ID
 movieID: state => {
  if(state.movieID == ''){
   return localStorage.getItem('STORE_MOVIE_ID');
  }else{
   return state.movieID;
  }
 },
}
//mutation名常量定义 并且需要在type.js文件下定义常量 mutations 用来向state提交数据的,只能进行同步操作
const mutations = {
 // 修改ID 中括号代表常量 我们可使用ES2015风格的计算属性命名功能来使用一个常量[types.STORE_MOVIE_ID]作为函数名
 [types.STORE_MOVIE_ID]( state, res) {
  state.movieID = res;
 },
}
export default {
 state,
 actions,
 getters,
 mutations
}

下边我们要说的是取数据并且渲染到页面中,或者在页面函数中使用的方法:

1:组建中你需要导入如下:

import { mapGetters } from 'vuex';

在组件的计算属性中,如下:

computed: {
 ...mapGetters([//...函数名 使用对象展开运算符将此对象混入到外部对象中
  'getContextPathSrc'
  ])
 },

这里的getContextPathSrc函数,在页面中可直接使用,如果在函数中使用,需要this.getContextPathSrc

2:最后在store中写getters函数:

const getters = {
  // 图片公共 src 的获取 getter函数:state=> state.数据名
  getContextPathSrc: state => state.contextPathSrc,
 }

最后在页面渲染就可以了。。这样就完成了交互。可能有人会留意到上面的getters里的movieID函数有个if判断,最后

return localStorage.getItem('STORE_MOVIE_ID')

有人会好奇为啥用localStorage……这个我们也不想用,只是如果你的页面如果用户强制刷新一下的话,会有个很奇怪的事发生,就是数据全部取不到,后来是没办法才加的。

最后,希望这些讲解,对于初学者来说有帮助……别被vuex的官网整的云里雾里(ps:我初学时也云里雾里整不明白偷笑)。好了,下班啦,更多的内容,会慢慢跟大家分享。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS动画效果代码3
Apr 03 Javascript
Select标签下拉列表二级联动级联实例代码
Feb 07 Javascript
禁用JavaScript控制台调试的方法
Mar 07 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
Aug 18 Javascript
AngularJS入门教程之表单校验用法示例
Nov 02 Javascript
js轮播图的插件化封装详解
Jul 17 Javascript
vue组件watch属性实例讲解
Nov 07 Javascript
React Navigation 使用中遇到的问题小结
May 08 Javascript
微信小程序url传参写变量的方法
Aug 09 Javascript
vee-validate vue 2.0自定义表单验证的实例
Aug 28 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
Mar 19 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
Mar 28 Javascript
AngularJS获取json数据的方法详解
May 27 #Javascript
vue中用H5实现文件上传的方法实例代码
May 27 #Javascript
详解vue2.0脚手架的webpack 配置文件分析
May 27 #Javascript
详解如何使用webpack打包Vue工程
May 27 #Javascript
Jquery中attr与prop的区别详解
May 27 #jQuery
angular使用post、get向后台传参的问题实例
May 27 #Javascript
AngularJS中使用ngModal模态框实例
May 27 #Javascript
You might like
Home Coffee Roasting
2021/03/03 咖啡文化
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
layui分页效果实现代码
2017/05/19 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
jQuery选择器之层次选择器用法实例分析
2019/02/19 jQuery
vue实现动态按钮功能
2019/05/13 Javascript
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
深入理解Python3 内置函数大全
2017/11/23 Python
python实现textrank关键词提取
2018/06/22 Python
wxPython实现整点报时
2019/11/18 Python
Python算法中的时间复杂度问题
2019/11/19 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
中秋节礼品促销方案
2014/02/02 职场文书
2014年创卫实施方案
2014/02/18 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
政风行风建设整改方案
2014/10/27 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android