# 提供者模式

数据提供程序模式是一种设计模式,它补充了 Vue 中的 renderless 组件模式,专注于为组件提供数据和状态管理功能,而不关心数据的渲染或显示方式。

在数据提供程序模式中,数据提供程序组件封装用于提取、管理和向其子组件公开数据的逻辑。然后,子组件可以使用此数据,并在自己的呈现或行为中使用它。

此模式促进了关注点的分离,因为数据提供程序组件负责与数据相关的任务,而子组件可以专注于表示和交互。

data-provider

让我们用一个例子来说明数据提供程序模式。考虑一个简单的应用程序,它显示一个有趣的笑话的设置,后跟它的妙语。

为了帮助我们随机显示不同的笑话,我们将使用免费的公共 API 终端节点 https://official-joke-api.appspot.com/random_joke,它以 JSON 格式返回随机笑话。

// # https://official-joke-api.appspot.com/random_joke

{
  "type": "general",
  "setup": "How good are you at Power Point?",
  "punchline": "I Excel at it.",
  "id": 129
}

我们首先创建一个名为 DataProvider 的数据提供程序组件,该组件将负责从 API 获取笑话。在组件的 <script> 部分中,我们将从 Vue 库导入 ref() 和 reactive() 函数,将端点 URL 值分配给一个常量,并设置数据和加载响应式属性来捕获 API 请求的数据和加载状态。

<template>
  <slot :checkbox="checkbox" :toggleCheckbox="toggleCheckbox"></slot>
</template>

<script setup>
  import { ref, reactive } from "vue";

  const API_ENDPOINT_URL = "https://official-joke-api.appspot.com/random_joke";

  const data = reactive({
    setup: null,
    punchline: null,
  });
  const loading = ref(false);

  const fetchJoke = async () => {
    loading.value = true;

    const response = await fetch(API_ENDPOINT_URL);
    const responseData = await response.json();

    data.setup = responseData.setup;
    data.punchline = responseData.punchline;
    loading.value = false;
  };

  fetchJoke();
</script>

完成无渲染数据提供程序组件后,我们现在可以在应用程序中使用它。在父 app 组件中,我们将导入 DataProvider 组件并将其放入模板中。

<template>
  <DataProvider v-slot="{ data, loading }">
    <div class="joke-section">
      <p v-if="loading">Joke is loading...</p>
      <p v-if="!loading">{{ data.setup }}</p>
      <p v-if="!loading">{{ data.punchline }}</p>
    </div>
  </DataProvider>
</template>

<script setup>
  import DataProvider from "./components/DataProvider.vue";
</script>

<DataProvider> 组件声明中,我们可以创建一个 UI,如果请求处于加载状态,则显示加载消息,或者在数据可用时显示笑话设置和妙语。