src\composables\useAxios.js
import axios from "axios";
function useAxios() {
//封裝一些常用配置,可以避免重複輸入
const instance = axios.create({
timeout: 1000,
// baseURL: "<http://localhost:3000>"
headers: {
"Content-Type": "application/json",
Authorization: "Bearer SOMEJWTTOKEN",
},
});
//也可以對這個實例添加攔截器,攔截請求或攔截響應,添加一些統一的自訂義的業務處裡
instance.interceptors.request.use(
(config) => {
console.log(config);
return config;
},
(error) => {
return Promise.reject(error);
}
);
instance.interceptors.response.use(
(response) => {
console.log(response);
return response;
},
(error) => {
console.log("发生了错误", error);
return Promise.reject(error);
}
);
return instance;
}
export default useAxios;
在需用到的組件中import並創建實例即可
<script setup>
import SearchNote from "./components/SearchNote.vue";
import NoteList from "./components/NoteList.vue";
import AddNote from "./components/AddNote.vue";
import { onMounted, ref, watch } from "vue";
import useAxios from "./composables/useAxios";
const notes = ref([]);
const loading = ref(false);
const searchTerm = ref("");
const error = ref(null);
const axios = useAxios();
onMounted(async () => {
loading.value = true;
const controller = new AbortController();
try {
setTimeout(() => {
controller.abort();
}, 500);
const res = await axios.get("/api/notes", {
signal: controller.signal,
});
notes.value = res.data;
} catch (e) {
if (e?.response?.data) {
error.value = e.response.data;
}
} finally {
loading.value = false;
}
});
watch(searchTerm, async (newSearchTerm) => {
loading.value = true;
const res = await axios.get("/api/notes", {
params: {
term: newSearchTerm,
},
});
notes.value = res.data;
loading.value = false;
});
async function handleNoteFormSubmit(note) {
const res = await axios.post("/api/notes", note, {
// headers: {
// "Content-Type": "application/json",
// Authorization: "Bearer SOMEJWTTOKEN",
// },
});
notes.value.push(res.data);
}
</script>