详细讲解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 相关文章推荐
javascript replace方法与正则表达式
Feb 19 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
Jan 27 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
Sep 16 Javascript
jquery做的一个简单的屏幕锁定提示框
Mar 26 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
Feb 26 Javascript
jQuery事件对象总结
Oct 17 Javascript
Bootstrap3 多选和单选框(checkbox)
Dec 29 Javascript
jQuery中用on绑定事件时需注意的事项
Mar 19 Javascript
微信小程序开发animation心跳动画效果
Aug 16 Javascript
vue通信方式EventBus的实现代码详解
Jun 10 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
Jun 27 Javascript
node 解析图片二维码的内容代码实例
Sep 11 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP获取毫秒级时间戳的方法
2015/04/15 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python 自定义装饰器实例详解
2019/07/20 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
python 经典数字滤波实例
2019/12/16 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
美国最值得信赖的宠物药房:Allivet
2019/03/23 全球购物
小学生自我评价范例
2013/09/24 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
详解Node.js如何处理ES6模块
2021/05/15 Javascript
Python MNIST手写体识别详解与试练
2021/11/07 Python
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL