vue2.0学习之axios的封装与vuex介绍


Posted in Javascript onMay 28, 2018

一、前言

博主也是vue道路上的行者,道行不深,希望自己的东西能对大家有所帮助。这篇博客针对 了解过vue基础,但是没有做过vue项目的童鞋。如果想看基础指令,可以看我之前的一篇博客,请点击  跳转,  不过我还是建议看文档比较好。os: Vue文档是非常详细的

二、准备

做vue单页应用都需要会什么?

    1.  vue的脚手架,直接帮你建好项目。再看看自己想要啥,补充啥!  os:  Git 上有很多成品项目,可以找一个好点的拉下来

注:路由按需加载、热加载 等这些都是基础功能,在这不多说。os: 慕课网有Vue的课程,网上有资源,挺不错的

    2. 引入并会使用 vuex。对共享变量进行统一管理,解决多层组件传数据的问题。这个咱后面详说。

    3. 封装 axios,对请求进行统一的管理,并减少代码量。

三、关于vuex

出现背景:  了解过vue1.0的人应该都知道,vue的父子组件通信是很烦的,一层还好。如果有个3、4层,那父子组件通信,就头疼了。以前,这是需要开发者捋清逻辑,在合适的地方修改并传递的。但是vue2.0为了解决这个问题,提出了vuex,状态统一管理。

作用:vuex 将所有需要共享的变量放在一起,像一个仓库一般,你想对仓库中的变量  读取、修改 ,直接调 指定方法就可以,超级方便。

    结构: vuex的结构大致为:

 state:  存放所有变量

 mutations  存放同步读取、修改state的的方法

    action       存放异步读取、修改state的的方法

  .......还有很多其他的  os: 这篇博客只是帮大家了解如何用Vue做单页应用。

注:1.  不是所有变量都要放到 state 中,vuex 创立的初衷是方便我们对变量的管理,然而对组件的一些私有变量,不需要和别的组件共享。所以,state里面只放全局变量、多组件共享变量。

2.  解释一下 action ,所谓异步,就是在 action 文件中写方法,调 axios,然后再 调 mutations 同步修改state。很多人不理解,其实,这就是一个概念性的问题。action并没有从根本上解决异步修改state的竞争问题,但是我们需要理解、并将 异步这个操作 摘出来放在一起。

os: js脚本 本来就是同步的东西,一根筋,同一时间无法处理2件事,不存在多线程处理事务。不过,科技发展的这么牛逼,大家懂得。这个异步、竞争的思想还是要提出来的,指不定哪天就被大家研究出了解决方案。

四、关于vuex的具体使用

先看一下项目的部分目录结构

vue2.0学习之axios的封装与vuex介绍                

1. state.js

const state = {
 topList: {},
 msgg: '1231321312',
 alertFlag: {state: false, type: ''},
 errorStatus: '',
 alertData: {title: '警告', content: '这是敏感信息,一旦删除,不可再恢复,确认删除吗', operateOk: '确定', operateCan: '取消', time: ''},
 httpError: {
 hasError: false,
 status: '',
 statusText: ''
 },
 tip: {
 tipFlag: false,
 tipMsg: ''
 }
}

export default state

state  文件里面存放一个state对象,具体的元素就是我们的变量了,需要什么数据,和组件的data函数中一样写法。这里只是起到存储作用

2.  mutations.js

import * as types from './mutation-types'

const mutations = {
 // 显示弹窗
 [types.SET_ALERT_FLAG](state, data) {
 state.alertFlag = data
 },
 // 设置弹窗内容
 [types.SET_ALERT_DETAIL](state, data) {
 Object.assign(state.alertData, data)
 },
 [types.ON_HTTP_ERROR](state, payload) {
 state.httpError = payload
 },
 // 设置提示弹层
 [types.SET_TIP_INFOR](state, data) {
 state.tip = data
 }
}

export default mutations

mutations 同步修改 state的值,仅仅是提供一个方法,接收参数,修改state值的文件。就是一个存储修改state方法的仓库。

一般我们在开发的时候请求比较多,我们会新建一个  mutation-types.js  文件,将所有函数用常量保存。其实也没什么特殊意义,仅仅是将方法统一保存,查找、维护比较方便而已。

3. action

import * as types from './mutation-types'
import { getTest } from '../server/index.js'

export const getData = function ({commit, state}, {list, index}) {
 commit(types.SET_TIP_INFOR, {tipFlag: false, tipMsg: ''})
}

export const actionTest = function ({commit, state}, data) {
 getTest({
 url: 'getPhoneCode.php',
 data: JSON.stringify({
 'phone': '18862533985'
 })
 })
 .then(response => {
 console.log(response.data)
 commit(types.SET_ALERT_DETAIL, {title: '提示', content: '您确定要还款吗?'})
 commit(types.SET_ALERT_FLAG, {state: true, type: ''})
 })
}

action  异步修改  state  的值。说白了,action也是一个存放修改state方法的仓库,但是 这些方法都是要调axios请求的(所以叫异步),请求完事了,再调 mutations 去同步修改state的值。所谓的异步都是我们自己写的。当然你不这么写也行,只是设计者的初衷是想让让开发者清楚异步修改的概念,虽然暂时没有解决根本问题。

这里涉及到axios请求,这个下边解释,暂时先清楚 action的概念。

4. vuex和组件通信

上述介绍了 vuex的几个部分的作用,那现在就是如何在组件中去使用 vuex

首先,在main.js中,你需要将store对象引入到整个应用中

new Vue({
 el: '#app',
 router,
 store,
 render: h => h(App)
})

然后在组件中使用

// 直接使用
 <alert v-if="this.$store.state.alertFlag.state"></alert>
// 同步的 commit
 this.$store.commit('SET_ALERT_DETAIL', {title: '提示', content: '您确定要还款吗?'}

// 异步的 dispatch
 this.$store.dispatch('actionTest').then(() => {})

简单介绍一下:

this.$store.state.  我们通过$store对象 ,直接使用state中的属性

this.$store.commit('', {})   通过 commit 方法调  mutations-types 中的方法(其实就是mutations的方法),这步是同步的,而且数据会自动监听变化就行渲染

this.$store.dispatch('actionTest').then(() => {})  通过 dispatch 的方法调 action 的方法,异步修改 state

注:vue中的这个  this 注意他的指向,建议不确定时,先将this赋给变量保存起来,有时经常会和window对象混淆。

以上就是vuex最基础的用法,也是最常用的方法。其他的像 getters 、如何组件中引入vuex等等,这里就不细说了,大家可以根据自身需求自行看文档补充。

 五、 封装axios

在一个完整的项目中,我们的和服务端的交互会很频繁,一个项目会有很多请求,冗余代码很多。所以将请求封装,统一管理还是很有必要的。我们现在做一个简单的封装。

1. 先看一下结构

vue2.0学习之axios的封装与vuex介绍

2. 看一下具体代码

axios.js 文件

import axios from 'axios'

// 创建axios实例 application/x-www-data-urlencoded application/json
const service = axios.create({
 baseURL: 'http://www.niepengfei.cn/PHPFile/ybtDemo/',
 timeout: 15000,
 headers: {'Content-Type': 'application/json'}
})

service.interceptors.response.use(
 function(response) {
 // 请求正常则返回,这里返回了所有的请求头和请求体信息
 return Promise.resolve(response)
 },
 function(error) {
 // 请求错误则向store commit这个状态变化
 const httpError = {
 alertFlag: true,
 errorStatus: error.response.status,
 msgg: error.response.statusText
 }
 this.$store.commit('SET_ALERT_FLAG', {state: false, type: 'ok'})
 console.log(httpError)
 return Promise.reject(error)
 }
)

export default service

index.js 文件

import request from './axios.js'
export function getTest(axiosData) {
 var data = {
 url: '',
 method: 'post',
 data: ''
 }
// 合成请求对象
 Object.assign(data, axiosData)
 return request(data)
}

这里我们仅仅做了post 请求的封装。先对axios做上默认请求的数据,封装成函数,有传参就合并修改参数数据,请求结束之后,根据response、error,分成成功和失败两个函数,并将整个promise对象返回。对于请求的拦截这里没做。而且对网络请求的错误码也是大家根据项目具体提示的。我这里也不做详细的说明了

3. 组件中使用

import { getTest } from '../../server/index.js'
getTest({
 url: 'login.php',
 data: JSON.stringify({
 'phone': thiss.phone,
 'phoneCode': thiss.phoneCode
 })
 })
 .then(response => {
 console.log(response.data)
 if (response.data.code === '0000') {
 ...
 }
 })

将封装的axios引入组件,然后直接调用即可

六、总结

以上就是 vuex+axios封装的实例,时间原因,这里进提供思路和简单的实现方法,至于具体项目具体分析,axios要怎么封装,vuex还需做什么监听,那就是大家为自己项目定制的东西了。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
js showModalDialog弹出窗口实例详解
Jan 07 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
详解JavaScript基于面向对象之创建对象(1)
Dec 10 Javascript
jquery插件EasyUI中form表单提交实例分享
Jan 11 Javascript
第一章之初识Bootstrap
Apr 25 Javascript
基于jQuery实现动态搜索显示功能
May 05 Javascript
解决微信二次分享不显示摘要和图片的问题
Aug 18 Javascript
详解使用路由延迟加载 Angular 模块
Oct 12 Javascript
vue加载自定义的js文件方法
Mar 13 Javascript
详解webpack2异步加载套路
Sep 14 Javascript
jquery实现动态创建form并提交的方法示例
May 27 jQuery
Javascript中Math.max和Math.max.apply的区别和用法详解
Aug 24 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
May 28 #Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
May 28 #jQuery
JavaScript继承定义与用法实践分析
May 28 #Javascript
关于jquery中attr()和prop()方法的区别
May 28 #jQuery
JS数组去重常用方法实例小结【4种方法】
May 28 #Javascript
jQuery中将json数据显示到页面表格的方法
May 27 #jQuery
javascript少儿编程关于返回值的函数内容
May 27 #Javascript
You might like
php运行时动态创建函数的方法
2015/03/16 PHP
PHP控制前台弹出对话框的实现方法
2016/08/21 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
用Python输出一个杨辉三角的例子
2014/06/13 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
Eclipse中Python开发环境搭建简单教程
2016/03/23 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
python正则表达式之对号入座篇
2018/07/24 Python
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
python 经典数字滤波实例
2019/12/16 Python
Python如何将模块打包并发布
2020/08/30 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
俄罗斯女装店:12storeez
2019/10/25 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
毕业生大学生活自我总结
2014/01/31 职场文书
酒鬼酒广告词
2014/03/21 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书