handleDelete: function (id) { if(!this.url.delete){ this.$message.error("请设置url.delete属性!") return } var that = this; deleteAction(that.url.delete, {id: id}).then((res) => { if (res.success) { //重新计算分页问题 that.reCalculatePage(1) that.$message.success(res.message); that.loadData(); } else { that.$message.warning(res.message); } }); },
时间: 2023-06-23 17:08:18 浏览: 174
这是一个 Vue.js 组件的方法,用于处理删除操作。具体解释如下:
- 首先判断是否设置了 `url.delete` 属性,如果没有则会提示错误并返回。
- 然后定义一个变量 `that` 保存当前组件实例的引用,以便在回调函数中使用。
- 调用 `deleteAction` 函数,该函数接受两个参数:删除的 URL 和要删除的数据的 ID。该函数返回一个 Promise 对象,当异步操作完成后,会执行回调函数。
- 在回调函数中,判断异步操作的结果:如果删除成功,则重新计算分页问题,显示成功提示信息,并重新加载数据;否则,显示警告提示信息。
- 注意,`reCalculatePage` 和 `loadData` 是该组件的其他方法,用于重新计算分页和重新加载数据。
相关问题
import axios from 'axios' import type { CancelTokenStatic, AxiosRequestConfig, AxiosInstance, AxiosError, InternalAxiosRequestConfig, AxiosResponse, CancelTokenSource } from 'axios' import { useGlobalStore } from '@/stores' import { hasOwn, hasOwnDefault } from '@/utils' import { ElMessage } from 'element-plus' /** * @description: 请求配置 * @param {extendHeaders} {[key: string]: string} 扩展请求头用于不满足默认的 Content-Type、token 请求头的情况 * @param {ignoreLoading} boolean 是否忽略 loading 默认 false * @param {token} boolean 是否携带 token 默认 true * @param {ignoreCR} boolean 是否取消请求 默认 false * @param {ignoreCRMsg} string 取消请求的提示信息 默认 Request canceled * @param {contentType} $ContentType 重新定义 Content-Type 默认 json * @param {baseURL} $baseURL baseURL 默认 horizon * @param {timeout} number 超时时间 默认 10000 * @return {_AxiosRequestConfig} **/ interface _AxiosRequestConfig extends AxiosRequestConfig { extendHeaders?: { [key: string]: string } ignoreLoading?: boolean token?: boolean ignoreCR?: boolean ignoreCRMsg?: string } enum ContentType { html = 'text/html', text = 'text/plain', file = 'multipart/form-data', json = 'application/json', form = 'application/x-www-form-urlencoded', stream = 'application/octet-stream', } interface PendingRequest { url?: string cancel: () => void } const Request: AxiosInstance = axios.create() const CancelToken: CancelTokenStatic = axios.CancelToken const source: CancelTokenSource = CancelToken.source() const pendingRequests: Map<string, PendingRequest> = new Map() const globalStore = useGlobalStore() Request.interceptors.request.use( (config: InternalAxiosRequestConfig) => { globalStore.setGlobalState('loading', !hasOwnDefault(config, 'ignoreLoading', true)) config.baseURL = hasOwnDefault(config, 'baseURL', '/api') config.headers = { ...config.headers, ...{ 'Content-Type': ContentType[hasOwnDefault(config, 'Content-Type', 'json')], }, ...hasOwnDefault(config, 'extendHeaders', {}), } hasOwnDefault(config, 'token', true) && (config.headers.token = globalStore.token) config.data = config.data || {} config.params = config.params || {} config.timeout = hasOwnDefault(config, 'timeout', 10000) config.cancelToken = config.cancelToken || new CancelToken(cancel => { const url = config.url || '' if (!pendingRequests.has(url)) { pendingRequests.set(url, { cancel }) } }) hasOwnDefault(config, 'ignoreCR', false) && config.cancelToken!.promise.catch(reason => { ElMessage.warning(hasOwnDefault(config, 'ignoreCRMsg', 'Request canceled')) throw reason }) console.log(pendingRequests) return config }, (error: AxiosError) => { return Promise.reject(error) } ) Request.interceptors.response.use( (response: AxiosResponse) => { globalStore.setGlobalState('loading', false) return response.data }, (error: AxiosError) => { globalStore.setGlobalState('loading', false) const url = error.config.url || '' const pendingRequest = pendingRequests.get(url) if (pendingRequest) { pendingRequest.cancel() pendingRequests.delete(url) } ElMessage.error(error.message) return Promise.reject(error) } ) export default (config?: _AxiosRequestConfig) => Request(config) 根据代码给出例子,取消请求
可以使用 CancelToken 和 pendingRequests 来取消请求。具体的实现方式如下:
1. 在请求拦截器中,为每个请求设置一个 cancelToken,并将请求信息存储到 pendingRequests 中。
2. 在响应拦截器中,如果请求成功,将该请求从 pendingRequests 中删除。如果请求失败,取消该请求,并从 pendingRequests 中删除。
3. 如果需要取消请求,可以调用 pendingRequests 中存储的 cancel 方法。
示例代码如下:
```
import axios from 'axios';
import { CancelToken } from 'axios';
import { ElMessage } from 'element-plus';
interface PendingRequest {
url?: string;
cancel: () => void;
}
const pendingRequests: Map<string, PendingRequest> = new Map();
const request = axios.create();
request.interceptors.request.use((config) => {
// 为每个请求设置 cancelToken
config.cancelToken = new CancelToken((cancel) => {
const url = config.url || '';
if (!pendingRequests.has(url)) {
pendingRequests.set(url, { cancel });
}
});
// 其他拦截器逻辑
return config;
});
request.interceptors.response.use(
(response) => {
const url = response.config.url || '';
// 请求成功,从 pendingRequests 中删除该请求信息
pendingRequests.delete(url);
return response.data;
},
(error) => {
const url = error.config.url || '';
const pendingRequest = pendingRequests.get(url);
if (pendingRequest) {
// 取消请求,并从 pendingRequests 中删除该请求信息
pendingRequest.cancel();
pendingRequests.delete(url);
}
ElMessage.error(error.message);
return Promise.reject(error);
}
);
export function cancelRequest(url: string) {
const pendingRequest = pendingRequests.get(url);
if (pendingRequest) {
// 调用 cancel 方法取消请求
pendingRequest.cancel();
pendingRequests.delete(url);
}
}
export default request;
```
import axios from "axios"; import { message } from "antd"; export default function ajax(url, data = {}, type = 'GET', headers) { return new Promise((resolve, reject) => { let promise; if (type === 'GET'){ promise = axios.get(url, { params: data, headers }) }else if(type === 'POST'){ promise = axios.post(url, data,{headers}) }else if (type === 'PUT') { promise = axios.put(url, data,{headers}) }else if (type === 'DELETE') { promise = axios.delete(url,{ params : data, headers }) } promise.then(response => { resolve(response.data) }).catch(error => { message.error('请求出错了:' + error.message).then(r => {}) }) }) }怎么改成同步axios
不建议将异步请求改为同步请求,因为同步请求会阻塞页面,影响用户体验。但如果你确实需要这样做,可以使用`async/await`将异步请求转换为同步请求,例如:
```
import axios from "axios";
import { message } from "antd";
export default async function ajax(url, data = {}, type = 'GET', headers) {
try {
let response;
if (type === 'GET') {
response = await axios.get(url, {
params: data,
headers
});
} else if (type === 'POST') {
response = await axios.post(url, data, { headers });
} else if (type === 'PUT') {
response = await axios.put(url, data, { headers });
} else if (type === 'DELETE') {
response = await axios.delete(url, {
params: data,
headers
});
}
return response.data;
} catch (error) {
message.error('请求出错了:' + error.message).then(r => {});
throw error;
}
}
```
在这个修改的版本中,我们使用了`async/await`语法来等待异步请求的结果,并将其返回。如果请求出错,我们仍然使用`message.error`方法显示错误消息,并将错误抛出以便上游处理。
阅读全文