【问题标题】:vue3 fetch data hookvue3 获取数据钩子
【发布时间】:2021-06-06 16:11:42
【问题描述】:

我有一个自定义挂钩来获取如下所示的数据:

import { reactive } from 'vue';
import axios from 'axios';

interface State {
  isLoading: boolean;
  isError: boolean;
  errorMessage: string,
  data: object|null
}

export default function useAxios(url: string, data: object) {
  const state = reactive({
    isLoading: true,
    isError: false,
    errorMessage: '',
    data: null
  }) as State;

  const fetchData = async () => {
    try {
      const response = await axios({
        method: 'GET',
        url: url, // '/test_data/campaign.json'
        data: data
      });
      state.data = response.data;
    } catch (e) {
      state.isError = true;
      state.errorMessage = e.message;
    } finally {
      state.isLoading = false;
    }
  };

  return {
    toRefs(state), //TS complains over "Parameter 'state' implicitly has an 'any' type." But it's already typed in the above???
    fetchData
  };
}

我试图在我的自定义组件中使用它,但我一直得到未定义的数据,即使如果我在我的自定义钩子中执行 console.log() 可以看到数据,我调用端点并记录回应...

我想这样使用它

setup() {
    const state = reactive({
      data: null
    });
    const {data, isLoading, fetchData} = useAxios(
      '/test_data/campaign.json',
      {}
    );
    const getCampaignData = async () => {
      await fetchData();
      console.log('data', data);
      state.data = data;
    };

    onMounted(() => {
      getCampaignData();
    });

    return {
      data: state.data
    };
  }

我在这里做错了什么?在钩子中,response.data 有来自 JSON 文件的数据,但是在我的组件中从钩子中调用数据时,它是 null ?

【问题讨论】:

  • 我认为你需要在你的组件中 await fetchData() 看到它是一个异步函数。

标签: vue.js vuejs3 vue-composition-api


【解决方案1】:

在可组合函数中尽量不要传播状态,因为它失去了反应性,您可以使用toRefs 返回反应性参考:

import {reactive,toRefs} from 'vue';
import axios from 'axios';

export default function useAxios(url: string, data: object) {
....
  return {
    ...toRefs(state),
    fetchData
  }
}

然后在您的组件中调用 getCampaignData 函数之外的可组合函数,例如:

import {reactive,toRefs,onMounted} from 'vue';
setup() {
    const state = reactive({
      data: null
    });
 const { data, isLoading, fetchData } = useAxios(
        '/test_data/campaign.json',
        {}
      );
    const getCampaignData = async () => {
     
      await fetchData();
      
      state.data = data.value;
    };

    onMounted( ()=>{
        getCampaignData();
    })

    return {
      ...toRefs(state)
    };
  }

【讨论】:

  • thx 我已经更新了我的示例,但无法让它工作,因为 toRefs() 函数会抱怨任何状态,即使 is 已经输入?如果我像这样直接输入 toRefs(): toRefs(state: State) - 我得到一个解析错误
  • 不客气,请尝试return{... toRefs(state),fetchData}
  • 啊,是的,这行得通......但是,为了获取组件中的数据,现在我需要做:data.value.something 来获取数据......不是吗可以避免在对象上有 .value ,而只是按原样获取数据?例如,我的数据存在于数据属性中……现在看来我必须: data.value.data 而不仅仅是 data.data ?
  • 不,因为 toRefs 将 state 转换为 ref 应该使用 value 属性访问
猜你喜欢
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 2020-10-25
相关资源
最近更新 更多