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('组件卸载,取消请求');
  }
};
相关推荐
依赖_赖1 小时前
前端实现token无感刷新
前端·javascript·vue.js
hhcccchh2 小时前
学习vue第十三天 Vue3组件深入指南:组件的艺术与科学
javascript·vue.js·学习
zhengxianyi5152 小时前
ruoyi-vue-pro本地环境搭建(超级详细,带异常处理)
前端·vue.js·前后端分离·ruoyi-vue-pro
绝美焦栖2 小时前
低版本pdfjs升级
前端·javascript·vue.js
卤蛋fg63 小时前
vue 可视化表单设计器 vxe-form-design 创建自定义控件的详细用法(教程一)
vue.js
xkxnq3 小时前
第二阶段:Vue 组件化开发(第 26天)
前端·javascript·vue.js
小救星小杜、3 小时前
el-form 表格校验 开始和结束时间,时间选择范围
javascript·vue.js·elementui
菜鸟很沉3 小时前
Vue 3 组件双向绑定完全指南:update:modelValue 与 defineModel
前端·javascript·vue.js
Rrvive3 小时前
Vue3向全局广播数据变化
javascript·vue.js
梦6504 小时前
Vue3 计算属性 (computed) 与监听属性 (watch)
前端·javascript·vue.js