vue 请求后端数据
星悦糖 人气:0在vue中,我们如何通过请求接口来访问后端的数据呢?在这里简单总结了一个小示例:
主要问题:如果不封装的话,在每次请求的时候都要书写一遍下面的代码,造成代码冗余。
1、在src目录下创建一个utils文件夹,然后在里面创建一个js文件。这里我创建了一个request.js文件。
/*引入axios*/ 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、在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 /* eslint-disable no-new */ 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 :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}; /*this.isFirst = isFirst this.isLoading = isLoading this.errMsg = errMsg this.users = users*/ }) }, } </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安装与应用【附带图片讲解】可以参考下面的地址:
加载全部内容