知识

vue如何获取后端数据

时间:2010-12-5 17:23:32  作者:热点   来源:娱乐  查看:  评论:0
内容摘要:vue项目里,后端数据不会自己跑进前端。你得主动去拿,而且拿的方式还不止一种。最常见的做法是axios发请求,但很多人装完axios就开写,结果跨域报错、接口返回结构混乱、组件卸载后还在setData

vue项目里,何获取后端后端数据不会自己跑进前端。数据你得主动去拿,何获取后端而且拿的数据方式还不止一种。最常见的何获取后端做法是axios发请求,但很多人装完axios就开写,数据结果跨域报错、何获取后端接口返回结构混乱、数据组件卸载后还在setData,何获取后端这些坑我全踩过。数据

先看最基础的何获取后端写法。假设后端接口是数据GET /api/user/profile,你用axios,何获取后端在mounted里调用。数据代码大概长这样:

import axios from 'axios' export default {  data() {  return {  userInfo: null } },何获取后端 async mounted() {  const {  data } = await axios.get('/api/user/profile') this.userInfo = data.data } } 

注意这里我用了data.data,因为后端通常包一层响应结构。你要是不看接口文档直接this.userInfo = data,大概率拿到的是个带status、message的壳子,页面直接空白。这事儿我干过,当时还以为是vue的响应式出了问题,查了半天。

但问题来了——如果你在组件销毁前请求才回来,this.userInfo = ...会报错,因为实例已经没了。轻则控制台红色警告,重则内存泄漏。解决办法是加个标志位:

data() {  return {  userInfo: null, _isDestroyed: false } }, beforeUnmount() {  this._isDestroyed = true }, async mounted() {  const {  data } = await axios.get('/api/user/profile') if (!this._isDestroyed) {  this.userInfo = data.data } } 

这种写法简单粗暴,但每个组件都这么搞很烦。所以后来我改用组合式API里的onBeforeUnmount,逻辑更集中。不过说实话,如果你的项目用了VueUse,直接上useAsyncState或者useFetch,人家帮你处理了取消请求和生命周期问题,比自己写省心太多。

还有一种情况,你需要在多个组件里共享同一份后端数据。比如用户登录信息,侧边栏要显示头像,顶部导航要显示昵称,个人页要显示完整资料。每个组件都发一次请求?太蠢了。这时候应该把数据放到Pinia或Vuex里。拿Pinia举例:

// store/user.js export const useUserStore = defineStore('user', {  state: () => ({  profile: null }), actions: {  async fetchProfile() {  const {  data } = await axios.get('/api/user/profile') this.profile = data.data } } }) 

组件里调用store.fetchProfile(),然后直接渲染store.profile。好处很明显——数据只拉一次,所有组件共享同一份引用。坏处是得小心,如果用户退出登录,你得手动清空store里的数据,不然下一个登录的人会看到上一个用户的资料。别笑,这bug我见过不止一次。

最后说个容易被忽略的点:后端返回的数据结构不是你想要的。比如接口返回{ id: 1, user_name: '张三' },但你的组件里想用name字段。别在模板里写user_name,也别在组件里写一堆映射逻辑。直接在获取数据后做一次转换:

const raw = (await axios.get('/api/user/profile')).data.data this.userInfo = {  id: raw.id, name: raw.user_name, avatar: raw.avatar_url } 

这样模板干净,组件逻辑也清晰。如果你用的是TypeScript,还能顺手定义个接口类型,编译期就能发现字段拼写错误。

说到底,vue获取后端数据就三件事:选对请求库、管好生命周期、处理好数据结构。别迷信某个最佳实践,适合自己项目规模的就是好的。你要是就一个简单页面,用axios在mounted里拉就完了;你要是搞大型中后台,老老实实上Pinia加请求拦截器。技术选型是权衡,不是炫技。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap