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('组件卸载,取消请求');
  }
};
相关推荐
英俊潇洒美少年11 分钟前
Vue Hook 与 React Hook 全面解析:区别、用法、实战及避坑指南
前端·vue.js·react.js
踩着两条虫27 分钟前
VTJ.PRO 发布 v2.3.6:开放共享模版、优化发布流程,低代码开发体验再升级
vue.js·低代码·ai编程
ldybk32 分钟前
教学vue
前端·javascript·vue.js
还是大剑师兰特39 分钟前
Pinia介绍及Vue3配置示例
前端·javascript·vue.js
还是大剑师兰特1 小时前
Vue3 Mixin 与 Vue2 Mixin 核心区别
前端·javascript·vue.js
freeWayWalker1 小时前
Vue通用缩放容器
前端·javascript·vue.js
Hello--_--World1 小时前
VUE:逻辑复用
前端·javascript·vue.js
Henb9292 小时前
# Spark 内核级调优源码分析
大数据·ajax·spark
小陈工6 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
华科易迅12 小时前
Vue如何集成封装Axios
前端·javascript·vue.js