vue 请求后端数据的示例代码
在vue中,我们如何通过请求接口来访问后端的数据呢?在这里简单总结了一个小示例:
主要问题:如果不封装的话,在每次请求的时候都要书写一遍下面的代码,造成代码冗余。
1、在class="lazy" data-src目录下创建一个utils文件夹,然后在里面创建一个js文件。这里我创建了一个request.js文件。
import axios from 'axios'
const request = axios.create({
baseURL: 'http://localhost:8280/user', // 基础路径,将统一的部分全部封装
withCredentials: true // 表示请求可以携带cookie
})
//前端采用export.default,在写后端代码时用module.export
export default request
在app.vue中进行测试:
<script>
import request from './utils/request'
export default {
created() {
request({
method:'GET',
url:'/products',
params:{test:'111',hello:'world'},
})
},
}
</script>
2、在class="lazy" data-src文件夹下创建一个api文件夹,根据不同的功能进行分组,分别写不同的接口。这里我创建了一个product.js。
import request from '../utils/request';
export function getList(params={}) {
return request({
methods:'GET',
url:'/products',
params,
})
}
export function getProduct(id) {
return request({
methods:'GET',
url:'/products/${id}',
})
}
export function update(id,data) {
return request({
methods:'PUT',
url:'/products/${id}',
data,
})
}
3、在api文件夹下创建index.js
import products from './products';
export default{
products,
}
4、在main.js中引入api文件夹下的index。
import api from './api/index.js';
Vue.prototype.$api = api
5、此时通过接口获取后端数据的方式就变成了如下格式:
getProducts(){
this.$api.products.getList(this.query).then((response)=>{
this.products = response.data.data
this.total = response.data.total
})
}
6、列表展示案例:
main.js中添加代码
import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios';
//Vue.prototype.$http=axios;//修改内部的$http为axios $http.get("") .post()
Vue.config.productionTip = false
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>',
render:h => h(App),
beforeCreate() {
//安装全局事件总线,$bus就是当前应用的vm
Vue.prototype.$bus = this
},
})
App.vue中添加代码
<template>
<div>
<Search/>
<List/>
</div>
</template>
<script>
import List from "./components/List";
import Search from "./components/Search";
export default {
name: 'App',
components: {Search, List},
}
</script>
<style>
</style>
router下的index.js中的代码
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export default new Router({
routes: [
]
})
list.vue代码示例:
<template>
<div class="row">
<!--展示用户数据-->
<div class="card" v-show="info.users.length" v-for="user in info.users" :key="user.login">
<a :href="user.html_url" target="_blank">
<img :class="lazy" data-src="user.avatar_url" style="width: 100px"/>
</a>
<p class="card-text">{{user.login}}</p>
</div>
<!--展示欢迎词-->
<h1 v-show="info.isFirst">欢迎使用</h1>
<!--展示加载中-->
<h1 v-show="info.isLoading">加载中....</h1>
<!--展示错误信息-->
<h1 v-show="info.errMsg">{{info.errMsg}}</h1>
</div>
</template>
<script>
export default {
name: "List",
data(){
return{
info:{
isFirst:true,//是否是初次展示
isLoading:false,//是否处于加载中
errMsg:'',
users:[],
}
}
},
//使用全局事件总线在两个组件之间传递数据
//接收数据:list组件想接收数据,则要在list组件中给$bus绑定自定义事件,事件的回调留在list组件自身。
mounted() {
this.$bus.$on('updateListDate',(dataObj)=>{
console.log(dataObj)
this.info = {...this.info,...dataObj};
})
},
}
</script>
<style scoped>
</style>
search.vue代码示例:
<template>
<section class="jumbotron">
<h3 class="jumbotron-heading"> search gitHub Users</h3>
<div>
<input type="text" placeholder="enter the name you search" v-model="keyWord"/>
<button @click="searchUsers" >Search</button>
</div>
</section>
</template>
<script>
import axios from 'axios';
export default {
name: "Search",
data(){
return{
keyWord:''
}
},
methods:{
searchUsers(){
//请求前更新list里面的数据
this.$bus.$emit('updateListDate',{isFirst:false,isLoading:true,errMsg:'',users:[]})
axios.get(`https://api.github.com/search/users?q=${this.keyWord}`).then(
res =>{
console.log("请求成功")
//提供数据:search组件要给list组件传递数据,就要触发list组件中的自定义事件并携带要传递的数据
//请求成功后更新list里面的数据
this.$bus.$emit("updateListDate",{isLoading:false,errMsg:'',users:res.data.items})
},
error =>{
console.log("请求成功",error.message)
//请求失败后更新list里面的数据
this.$bus.$emit("updateListDate",{isLoading:false,errMsg:error.message,users:[]})
}
)
}
},
}
</script>
<style scoped>
</style>
注:Vue全局事件总线$bus安装与应用【附带图片讲解】可以参考下面的地址:
Vue全局事件总线$bus安装与应用【附带图片讲解】
到此这篇关于vue请求后端数据的文章就介绍到这了,更多相关vue请求后端数据内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341