原副标题:通晓Vue.js系列产品 │ 在Vue工程项目中采用Axios
为的是在Vue工程项目中采用Axios,具体来说要加装Axios应用程序和较旧的Vue-Axios应用程序。Vue-Axios应用程序能把Axios与Vue更方便快捷地资源整合在一同,容许模块透过this.axios的方式来出访Axios。
对helloworld工程项目,在DOS配置文件转到helloworld子目录下,运转下列指示,就会加装Axios和Vue-Axios应用程序:
npminstall axios vue-axios在src/main.js中导入Axios和Vue-Axios应用程序,参看解释器1。
■解释器1 main.js
import{createApp }fromvue importApp from./App.vue importrouter from./router importaxios fromaxios importVueAxios fromvue-axiosconstapp = createApp(App) app.use(router)app.use(VueAxios,axios)app.mount( #app)
接下来在Vue模块的代码中就可以透过this.axios的方式出访Axios了。
1
异步请求
解释器2定义了GetCustomer模块,它根据用户输入的id到服务器端查询匹配的customer对象,把它显示到网页上。
■解释器2 GetCustomer.vue
< template> < div> < p> 输入id: < inputv-model= “customer.id”/> < button@ click= “getCustomer”> 查询 </ button> {{msg}}</ p> < p> {{isLoading}} </ p> < p> 名字:{{customer.name}} </ p> < p> 年龄:{{customer.age}} </ p> </ div> </ template> < > exportdefault{ data{return{ customer: { id: , name: , age: }, msg: , isLoading: } },methods: { getCustomer{this.customer.name=this.customer.age= this.msg= this.isLoading= 正在查询…this.axios({ baseURL: http://www.javathinker.net, url: /customer, method: get, params: { id: this.customer.id} }).then( ( response)=> { this.isLoading=if(response.data !== null){ this.customer=response.data } elsethis.msg= 未找到匹配的数据!}).catch( ( error) => { this.isLoading= console.log(error) })}}}</ >在GetCustomer模块的getCustomer方法中,透过axios函数发出Ajax请求:
this.axios({ //返回Promise对象baseURL: http://www.javathinker.net, url: /customer, method: get, params: {id: this.customer.id}})以上axios函数的参数是一个请求配置对象,在该请求配置对象中,baseURL属性表示根URL,url属性表示相对URL,method属性表示请求方式,params属性表示请求参数(也称为查询参数),以上代码也可以简写为:
this.axios . get( http://www.javathinker.net/customer?id=+ this.customer.id)在src/router/index.js中,为GetCustomer模块设置的路由的路径为/getcustomer。透过浏览器出访http://localhost:8080/#/getcustomer,在网页的id输入框中输入1,然后单击“查询”按钮,会看到网页上先显示提示信息“正在查询…”,接下来再显示相应的customer对象的信息,参看图1。
■图1 查询id为1的customer对象
如果在网页的id输入框中输入5,然后单击“查询”按钮,会看到网页上先显示提示信息“正在查询…”,接下来显示“未找到匹配的数据!”。
在GetCustomer模块的getCustomer方法中,先把isLoading变量设为“正在查询…”,接下来再调用axios函数,axios函数会异步请求出访服务器:
this.isLoading= 正在查询…this.axios({ …}).then( (response)=> {this.isLoading=…}). catch( (error) =>{ this.isLoading= …})在浏览器与服务器进行异步通信的过程中,浏览器的主线程会继续运转,刷新网页上的{{isLoading}}插值表达式,显示当前值“正在查询…”。等到浏览器与服务器的通信结束,浏览器端接收到了响应结果,就会执行then函数,把isLoading变量的值改为“”,并且如果response.data不为null,还会把response.data赋值给customer变量。Vue框架的响应式机制会同步刷新网页上的{{isLoading}}、{{customer.name}}和{{customer.age}}插值表达式。
Promise对象的then函数的返回值仍然是Promise对象,它会异步执行then函数的参数指定的函数。下列代码从表面上看,是把响应正文显示到网页上:
<template><div>{{content}} </div></template><>…mounted{let result={}
this.axios. get( http://www.javathinker.net/customer?id=1) .then(response=>{result=response. data})
this.content=result }…</
实际上,以上代码中的赋值语句的执行顺序为:
let result={}this.content=result result=response. data因此,网页上的{{result}}表达式的值始终为{}。
2
POST请求方式
解释器3定义了Calculate模块,它会把用户输入的变量x和变量y透过POST请求方式传给服务器,服务器返回x+y的运算结果,Calculate模块再把运算结果显示到网页上。
■解释器3 Calculate.vue
< template> < divid= “app”> < p> 输入变量x: < inputv-model.number= “x”/> </ p> < p> 输入变量y: < inputv-model.number= “y”/> </ p> < button@ click= “add”> 计算 </ button> < p> {{result}} </ p></ div> </ template> < > exportdefault{ data{return{ x: 0, y: 0, result: } },methods: { add{this.axios.post( //采用POST请求方式http://http://www.javathinker.net/add, x=+ this.x+ &y=+ this.y //请求正文).then( response=> { this.result= this.x+ ++ this.y+ =+response.data }).catch( error=> { console.log(error)})}}}</ >
GetCustomer模块的add方法透过axios.post函数指定请求方式为POST,该函数等价于下列axios函数:
this.axios({ baseURL: http://www.javathinker.net, url: /add, method: post, //指定POST请求方式data: x=+ this.x+ &y=+ this.y //请求正文})在src/router/index.js中,为Calculate模块设置的路由的路径为/calculate。透过浏览器出访http://localhost:8080/#/calculate,在网页的变量x和变量y的输入框中分别输入数字,然后单击“计算”按钮,add方法就会请求服务器计算x+y,再把运算结果显示到网页上,参看图2。
■图2 Calculate模块的网页
2
参考书籍
点击上图看详细图书介绍
《通晓Vue.js:Web前端开发技术详解(微课视频版)》
详细阐述用Vue框架的各种技术;深刻揭示前端开发的响应式编程核心思想;介绍与其他流行技术的资源整合;典型范例帮助读者迅速获得实战经验。
作者:孙卫琴,杜聚宾
价格:119元
扫码优惠购书
实例讲解
通晓Vue.js:
Web前端开发技术详解
精彩回顾
1. Vue模块的命名规则
2 . 注册全局模块和局部模块
3 . 路由导航中抓取数据
4. 路由管理器的基本用法
5. 命名路由
6. CSS中DOM元素的过渡模式
7. 插槽slot的基本用法
8. 模块的递归
下期预告
10. 自定义指令v-drag范例
11. Vuex中的异步操作
12. 分割setup函数
13. Vue模块的单向数据流
14. Vue的数据监听