Vue:Ajax

AJAX 允许我们在不刷新页面的情况下与服务器交互,实现:动态加载数据,提交表单信息,实时更新内容,与后端 API 通信。通常使用专门的 HTTP 客户端库来处理 AJAX 请求。

bash 复制代码
npm install axios
javascript 复制代码
import axios from 'axios';

export default {
  data() {
    return {
      users: []
    };
  },
  async mounted() {
    try {
      const response = await axios.get('https://api.example.com/users');
      this.users = response.data;
    } catch (error) {
      console.error('获取用户数据失败:', error);
    }
  }
};

创建 Axios 实例

javascript 复制代码
// src/utils/request.js
import axios from 'axios';

const api = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 请求拦截器
api.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

// 响应拦截器
api.interceptors.response.use(
  response => response.data,
  error => {
    if (error.response.status === 401) {
      // 处理未授权
    }
    return Promise.reject(error);
  }
);

export default api;

AJAX 请求的最佳实践

1在合适的生命周期钩子中发起请求

created/mounted :组件初始化时获取数据
watch:监听路由或参数变化时重新获取数据

javascript 复制代码
watch: {
  '$route.params.id': {
    handler(newId) {
      this.fetchData(newId);
    },
    immediate: true // 立即执行一次
  }
}

2处理加载状态

javascript 复制代码
data() {
  return {
    isLoading: false,
    data: null,
    error: null
  };
},
methods: {
  async fetchData() {
    this.isLoading = true;
    this.error = null;
    
    try {
      this.data = await api.get('/data');
    } catch (err) {
      this.error = err.message;
    } finally {
      this.isLoading = false;
    }
  }
}

避免内存泄漏

在组件销毁前取消未完成的请求:

javascript 复制代码
import axios from 'axios';

export default {
  data() {
    return {
      cancelToken: axios.CancelToken.source()
    };
  },
  methods: {
    fetchData() {
      axios.get('/data', {
        cancelToken: this.cancelToken.token
      });
    }
  },
  beforeUnmount() {
    this.cancelToken.cancel('组件卸载,取消请求');
  }
};
相关推荐
简单Janeee44 分钟前
[Vue 3 从零到上线]-第九篇:更美更强——引入 UI 库与网络请求 (Axios)
网络·vue.js·ui
小蒜学长1 小时前
基于SpringBoot + Vue的智能健身房管理系统的设计与实现(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端
千里码aicood4 小时前
Django+Vue 基于XGBoost与随机森林的沿海地区台风天气大数据预警系统实现
vue.js·随机森林·django
jay神4 小时前
【计算机毕业设计】基于Flask+Vue的电影数据可视化与智能推荐系统
前端·vue.js·python·信息可视化·flask·毕业设计·课程设计
2601_9621229718 小时前
nginx 部署前端vue项目
前端·vue.js·nginx
码视野18 小时前
基于 Spring Boot + Vue3 的【城市道路地下空洞塌陷微动传感监测与路面脱空沉降预警中台】设计与实现(含PRD/三端高保真源码/大屏)
vue.js·spring boot·后端
雪芽蓝域zzs18 小时前
第三节:目录结构重构(仿若依,优化层级,layout 与 components 同级)
前端·vue.js·重构
雪芽蓝域zzs21 小时前
第八节:Element Plus 基础、封装通用组件 + 路由守卫
前端·vue.js
码视野21 小时前
基于 Spring Boot + Vue3 的【智慧公厕微负压排风除臭与客流人感空间占用导引中台】设计与实现(含PRD/三端高保真源码/大屏)
前端·vue.js·人工智能·spring boot·后端