一、前言

博主也是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的具体使用

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

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. 先看一下结构

  

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还需做什么监听,那就是大家为自己项目定制的东西了。

好了,以上就是整篇博客的所有内容,希望对大家有所帮助。如果,文中有错误的地方还请大家及时指出。

 如果喜欢我博客的朋友可以添加个关注,以后多交流技术问题!近期还会在更新一些react的博客。

vue2.0 axios封装、vuex介绍的更多相关文章

  1. vue2.0+webpack+vuerouter+vuex+axios构建项目基础

    前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...

  2. vue2.0 axios前后端数据处理

    目前主流的 Vue 项目,都选择 axios 来完成 ajax 请求,而大型项目都会使用 Vuex 来管理数据. 前言: 使用 cnpm 安装 axios cnpm install axios -S ...

  3. Vue2基于Axios Ajax Vuex的Loading组件

    1. 定义根state:ajaxIsLoading2. 在Axios拦截器中commit不同的状态实现状态切换3. 组件中通过getter获取ajaxIsLoading状态 Axios 拦截器配置 i ...

  4. vue2.0 axios交互

    vue使用axios交互时候会出现的问题大致有三个: 1:本地调试跨域问题? 2:post请求,传参不成功,导致请求失败? 3:axios引用,在使用的组件里面引用 解决方案: 问题一:跨域? 解决本 ...

  5. vue2.0 Axios 的简单用法

    安装 使用 npm: $ npm install axios 使用 bower: $ bower install axios 使用 cdn: <script src="https:// ...

  6. Vue2.0 axios 读取本地json文件

    参考:https://www.cnblogs.com/wdxue/p/8868982.html 1.下载插件 npm install axios --save 2.在main.js下引用axios i ...

  7. VUE2.0学习总结

    摘要: 年后公司项目开始上vue2.0,自己对学习进行了总结,希望对大家有帮助! VUE2.0学习 vue介绍 vue是什么? https://vuefe.cn/guide vue也是一个数据驱动框架 ...

  8. 前后端分离之vue2.0+webpack2 实战项目 -- webpack介绍

    webpack的一点介绍 Webpack 把任何一个文件都看成一个模块,模块间可以互相依赖(require or import),webpack 的功能是把相互依赖的文件打包在一起.webpack 本 ...

  9. vue2.0 如何自定义组件(vue组件的封装)

    一.前言 之前的博客聊过 vue2.0和react的技术选型:聊过vue的axios封装和vuex使用.今天简单聊聊 vue 组件的封装. vue 的ui框架现在是很多的,但是鉴于移动设备的复杂性,兼 ...

随机推荐

  1. 自制无线共享工具C++源代码

    // wire.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <string.h> using namespace ...

  2. html5 file upload and form data by ajax

    html5 file upload and form data by ajax 最近接了一个小活,在短时间内实现一个活动报名页面,其中遇到了文件上传. 我预期的效果是一次ajax post请求,然后在 ...

  3. nginx安装配置+集群tomcat:Centos和windows环境

    版本:nginx-1.8.0.tar.gz 官网:http://nginx.org/en/download.html         版本:apache-tomcat-6.0.44.tar.gz  官 ...

  4. Mybatis批量更新数据库与批量插入数据库(以oracle为例)

    一.批量更新 1.普通写法(一条记录update一次,性能比较差,容易造成阻塞.不建议使用) <update id="updateBatch" parameterType=& ...

  5. 3D Lut 电影级调色算法 附完整C代码

    在前面的文章,我提到过VSCO Cam 的胶片滤镜算法实现是3d lut. 那么3d lut  到底是个什么东西呢? 或者说它是用来做什么的? 长话短说,3d lut(全称 : 3D Lookup t ...

  6. leetCode刷题(找到最长的回文字符串)

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  7. SpringMVC SessionAttributes 简述

    使用SpringMVC时,我们会发现网络上有关SessionAttributes注解的内容非常少,更多的人甚至推荐你继续用HttpServletRequest中的session管理方法来控制Sessi ...

  8. 5月第2周业务风控关注 | 央行:严禁未经授权认可的APP接入征信系统

    本文由  网易云发布. 易盾业务风控周报每周呈报值得关注的安全技术和事件,包括但不限于内容安全.移动安全.业务安全和网络安全,帮助企业提高警惕,规避这些似小实大.影响业务健康发展的安全风险. 1.央行 ...

  9. JDK10都发布了,nio你了解多少?

    前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多). 但是,发现在整理 ...

  10. HTML结构及基础语法

    一.HTML结构 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...