由于异步原因导致在主线中不能直接使用接口返回的数据的解决方式。(vue+TS+Axios)

在我的第二次项目中,我仍然遇到了在第一次项目中遇到的问题——接口返回的数据不能直接在html或者vue中像自己使用let定义的变量一样使用。因此我也查询过一些方法:

使用promise我没有看懂;

当数据获取成功后将数据作为实参传递给需要使用的函数,这个方法只能适用于在方法中使用该参数;

我在第一次项目中使用的方法是将获取的数据保存到本地存储中,然后使用的时候再从本地读取出来,因为在第一次的时候使用到的比较少,因此这个方法的弊病没有体现出来。但是在第二次项目中使用较多,就出现了以下弊病:首先就是页面不能立即按照数据的改变而改变,需要刷新一次之后才能展示出来;然后就是限制较多,需要判断数据是否为空等,比较麻烦,而且容易遗忘。

因此本次在学姐的帮助下,我学习到了一种新的方法:使用pinia库保存。

首先需要定义接口:

import request from '@/utils/request'

export interface dataFindBig {
  keywords: string
  worksType: number
  worksShape: number
}
//根据作品名、大类型、小类型查询
export const findBig = (keywords: string, worksType: number, worksShape: Array<number>) =>
    request.get<any, dataFindBig>(`/works/keywords?keywords=${keywords}&worksType=${worksType}&worksShape=${worksShape}`)

第一行:的作用是引入二次封装后的axios,若没有二次封装,那地址就是http。

第三行:定义了参数的类型

第九行:中的参数也可以使用接口名dataFindBig,在这里我没使用。但是在第十行,尖括号中第二个参数是参数类型,更详细的用法可以自己再详细了解。注意了:我在这里用的是箭头函数,箭头之后没有使用大括号,表示第十行是return之后的内容,如果加了大括号就需要在request之前加上return。

然后就是创建pinia库:

//引入pinia
import { defineStore } from 'pinia'
//引入相关接口
import { findBig } from '@/api/fuShe-api'
let warehouseOne = defineStore('buzhidaoganshenme', {
    //仓库存储数据的地方
    state: () => {
        return {
        }
    },
    actions: {
        async findBig(keywords: string,worksType: number,worksShape: Array<number>){
            let result:any = await findBig(keywords,worksType,worksShape)
            if(result&&result.code===200){
                return result.data.worksList
            }
        },

    },
    getters:{},
})
//点击触发对应的上传事件
export default warehouseOne

第二行引入pinia的固定形式。

第四行引入第一步中创建的接口名。

其中warehouseOne与buzhidaoganshenme为自定义的变量名。第七行state的return内是要检测的返回值内容,因为我没有使用到,因此就不过多赘述。

之后在11行的actions内的写法就是固定形式,大家按照自己接口的名字来修改就可以。

注意:14行的if里面的内容,当返回数据的code码为200时表示请求成功,然后将需要的数据返回。我们这里使用200表示成功,具体code码是什么根据自己的代码确定。

最后就是在需要的地方引入:

//引入相应的东西
import { storeToRefs } from "pinia";
import warehouseOne from "@/store/modules/pinia-fuShe";
let useStore = warehouseOne();

let result = await useStore.findBig("",1,[Number(a)])

第二行固定格式,直接引入;第三行引入自己创建的pinia库中的变量;第四行创建该对象的实例对象。

第六行的result得到的就是pinia库第十五行的返回内容。

使用这种方法的优点:1、可以实时刷新渲染内容;2、可以检测值的改变(本次实例中未展示)。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue3是一个流行的JavaScript框架,它提供了一种使用户界面与数据模型分离的方式Vue3的一个主要更新是使用了TypeScript,这使得Vue3更加强大和可维护。Axios是一个流行的基于Promise的HTTP客户端,它可以用于在浏览器和Node.js发送异步请求。 在使用Vue3时,我们可以通过以下方式集成Axios: 1. 首先,我们需要在项目安装axios和@vue/axios这两个包。可以使用以下命令进行安装: ``` npm install axios @vue/axios ``` 2. 接下来,我们需要在main.js添加以下代码: ``` import { createApp } from 'vue' import App from './App.vue' import { createPinia } from 'pinia' import { createRouter, createWebHistory } from 'vue-router' import { createI18n } from 'vue-i18n' import axios from 'axios' import VueAxios from '@vue/axios' const app = createApp(App) const router = createRouter({ history: createWebHistory(), routes, }) const i18n = createI18n({ legacy: false, locale: 'en', }) app.use(createPinia()) app.use(router) app.use(i18n) app.use(VueAxios, axios) app.mount('#app') ``` 这段代码会将Axios集成到Vue3,并将其作为Vue插件使用。现在我们可以在Vue3组件使用Axios了。 3. 在Vue3组件使用Axios: ``` <template> <div> <button @click="getData">Get Data</button> <div v-if="loading">Loading...</div> <div v-if="error">{{ error }}</div> <div v-if="data">{{ data }}</div> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue' import axios from 'axios' export default defineComponent({ setup() { const loading = ref(false) const data = ref(null) const error = ref(null) const getData = async () => { loading.value = true try { const response = await axios.get('https://jsonplaceholder.typicode.com/todos/1') data.value = response.data } catch (err) { error.value = err.message } finally { loading.value = false } } return { loading, data, error, getData, } }, }) </script> ``` 在上面的示例,我们首先导入axios并定义了三个响应式变量:loading、data和error。然后我们定义了一个名为getData的函数,它使用axios发送异步请求,并将响应数据存储在data变量。如果请求出现错误,我们将错误信息存储在error变量。最后,我们可以在模板使用这些响应式变量来显示数据或错误消息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值