JavaScript >> Javascript 文檔 >  >> Vue.js

快速提示!!!

大家好👋

在發出請求時,我真的厭倦了在每個組件上編寫相同的代碼。我想讓事情變得簡單,我猜你也想要。查看我的示例,了解我對此類事情的提示😃。

目前,當我們想從 API 中獲取某些東西時,我們會在下面編寫代碼……至少我是這樣做的 😃

<template>
  <div class="section-orders">
    <ul v-if="!loading && orders.length" class="orders">
      <li v-for="order in orders" :key="order.id">{{ order.name }}</li>
    </ul>

    <span v-if="loading">Loading...</span>

    <span v-if="errorMessage">{{ errorMessage }}</span>
  </div>
</template>

<script>
/**
 * External dependencies.
 */
import axios from 'axios';
import { ref } from '@vue/composition-api';

export default {
  name: 'OrdersSection',

  setup() {
    const errorMessage = ref('');
    const loading = ref(false);
    const orders = ref([]);
    const fetchOrders = async () => {
      if (loading.value) {
        return;
      }

      errorMessage.value = '';

      try {
        loading.value = true;
        const response = await axios.get('/orders');
        orders.value = response.data;
      } catch (error) {
        errorMessage.value = 'An error has ocurred!';
      } finally {
        loading.value = false;
      }
    };
    fetchOrders();

    return {
      orders,
      loading,
      errorMessage,
    };
  },
};
</script>

如果我們只在一個組件上使用它,這是可以的。但是如果我們想在不同的組件中檢索訂單,我們可以復制上面的代碼或創建一個組合函數來提取它的邏輯。

它可能看起來像這樣。

<template>
  <div class="section-orders">
    <ul v-if="!loading && orders.length" class="orders">
      <li v-for="order in orders" :key="order.id">{{ order.name }}</li>
    </ul>

    <span v-if="loading">Loading...</span>

    <span v-if="errorMessage">{{ errorMessage }}</span>
  </div>
</template>

<script>
/**
 * Internal dependencies.
 */
import useOrders from '@/components/bank-form/use-orders';

export default {
  name: 'OrdersSection',

  setup() {
    const { loading, errorMessage, orders } = useOrders();

    return {
      orders,
      loading,
      errorMessage,
    };
  },
};
</script>

useOrders 組合功能:

/**
 * External dependencies.
 */
import axios from 'axios';
import { ref } from '@vue/composition-api';

export default function useOrders() {
    const errorMessage = ref('');
    const loading = ref(false);
    const orders = ref([]);
    const fetchOrders = async () => {
        if (loading.value) {
            return;
        }

        errorMessage.value = '';

        try {
            loading.value = true;
            const response = await axios.get('/orders');
            orders.value = response.data;
        } catch (error) {
            errorMessage.value = 'An error has ocurred!';
        } finally {
            loading.value = false;
        }
    };
    fetchOrders();

    return {
        orders,
        loading,
        errorMessage,
    };
}

偉大的!!!!!

但是過了一段時間你需要為另一個請求做同樣的邏輯,寫同樣的“加載、錯誤消息和數據”狀態變得乏味。

使用 @cytools/vue-query 非常簡單 .

這是一個例子


<template>
  <div class="section-orders">
    <ul v-if="!isLoading && orders.length" class="orders">
      <li v-for="order in orders" :key="order.id">{{ order.name }}</li>
    </ul>

    <span v-if="isLoading">Loading...</span>

    <span v-if="error">{{ error }}</span>
  </div>
</template>

<script>
/**
 * Internal dependencies.
 */
import axios from 'axios';
import { useQuery } from '@cytools/vue-query';

export default {
  name: 'OrdersSection',

  setup() {
    const { isLoading, error, data: orders } = useQuery(
        'orders',
        async () => {
          return (await axios.get('/orders')).data;
        },
        {
          defaultData: [],
        },
    );

    return {
      orders,
      isLoading,
      error,
    };
  },
};
</script>

我們用更少的代碼完成了所有工作,並根據密鑰免費緩存數據。

這是該庫的鏈接以獲取更多詳細信息——https://github.com/cytools/vue-query

比上面的例子更有趣。


Tutorial JavaScript 教程
  1. 畫布的樂趣:創建條形圖插件,第 1 部分

  2. 強大的 NodeJS 部署架構

  3. JavaScript:如何獲取數組中元素的數量

  4. 使用 *ngFor 從組合框中刪除選定的選項

  5. React JS 中本地存儲的基礎知識!

  6. TypeORM 技巧(第 1 部分:不要使用 save())

  7. jQuery用另一個類替換一個類

  1. 偽造標記的模板字符串文字以在 VSCode 中啟用語法突出顯示

  2. npm 提示/技巧

  3. 現實世界中的自動類型轉換

  4. 繼續 React 並開始我最新的副項目!

  5. NodeJS 日誌記錄變得容易

  6. 如何在圖片和視頻上實現 WordPress 延遲加載

  7. 使用 GatsbyJS 的新個人網站

  1. Tailwind CSS 用戶?讀這個!

  2. 每個 JavaScript 開發人員都應該知道的 5 個字符串方法

  3. React Native 中的 WebRTC 示例!

  4. 調試任何東西:在 TypeScript 中使用 Parcel 進行反應 📦