如何在 Vue 3 中正确使用组合 api 中的钩子

How to use correctly hook from composition api in Vue 3

我学习了如何在 Vue 3 中使用新组合 api,在一节课中我看到了如何使用组合 api 调用 api 但我做不到它适用于我的代码。我正在 const getPosts = usePromise(PostService.getAll()); 中调用 api - 对服务器的 api 调用成功,但我无法在组件中加载帖子。在 console.log(getPosts) - view/PostList.vue

<template>
  <div>
    <Loader v-if="getPosts.loading" />
    <div v-for="post in posts" :key="post.id"></div>
  </div>
</template>

<script lang="ts">
import { ref } from 'vue';
import { Post } from '../types';
import PostService from '../services/PostService';
import usePromise from '../composables/use-promise';
import Loader from '../components/ui/Loader.vue';

export default {
  components: { Loader },
  setup() {
    const posts = ref<Post[]>([]);
    const post = ref<Post>({
      title: '',
      body: '',
    });
    const getPosts = usePromise(PostService.getAll());
    console.log(getPosts);
    posts.value = getPosts.result.value;

    return { posts, post, getPosts };
  },
};
</script>

composables/use-promise.ts - console.log(response) - 控制台中从未出现过响应

import { ref } from 'vue';
export default function usePromise(fn: any) {
  // fn is the actual API call
  const result = ref(null);
  const loading = ref(false);
  const error = ref(null);
  const createPromise = async (...args: any) => {
    // Args is where we send in searchInput
    loading.value = true;
    error.value = null;
    result.value = null;
    try {
      const response = await fn(...args);
      console.log(response);
      result.value = response;
    } catch (err) {
      error.value = err;
    } finally {
      loading.value = false;
    }
  };

  return { result, loading, error, createPromise };
}

services/Api.ts

import axios from 'axios';

export default axios.create({
  baseURL: 'https://jsonplaceholder.typicode.com/',
  headers: {
    'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': '*',
  },
});

services/PostService.ts

import Api from './Api';
export default {
  async getAll() {
    const response = await Api.get('/posts');
    return response.data;;
  },
};

您需要如下使用您的 promise 钩子:

const posts = ref < Post[] > ([]);
const {
  createPromise,
  result
} = usePromise(PostService.getAll);

createPromise().then(() => {
  console.log(result.value.data);
  posts.value = result.value.data as Post[]
})