我最近开始了我的网络开发之旅,并决定学习一些JavaScript来处理API,以便学习如何从公共API执行提取(对于初学者来说).我的第一次try 是try 在我的投资组合中集成实时BTC API.尽管ChatGPT表示这是正确的并且应该显示信息,但除了标题之外没有显示任何内容. API - CoinDeskAPI.

这是我的CoinDeskAPI.jsx组件:

import { useEffect, useState } from "react";

export const CoinDeskAPI = () => {
  const [btcData, setBtcData] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch('https://api.coindesk.com/v1/bpi/currentprice.json');
        if (!response.ok) {
          throw new Error('Failed to fetch Bitcoin data');
        }
        const data = await response.json();
        setBtcData(data);
      } catch (error) {
        console.error('Error fetching Bitcoin data:', error);
      }
    };

    fetchData();
  }, []);

  return (
    <article className="flex flex-col gap-2 flex-grow">
      <header className="flex w-full flex-row justify-between gap-2">
        <h3 className="text-xl text-neutral-950">
          API Testing (<a className="hover:text-blue-500 after:content-['_↗']" href="https://api.coindesk.com/v1/bpi/currentprice.json" target="_blank" rel="noreferrer"> CoinDeskAPI</a>)
        </h3>
      </header>
      <p className="w-auto max-w-[60ch] leading-6 text-base">Displaying live BTC values, first API test!</p>
      
      <article>
        {btcData && (
          <ul>
            <li>BTC Rate (USD): {btcData.bpi.USD.rate}</li>
            <li>BTC Rate (EUR): {btcData.bpi.EUR.rate}</li>
            <li>BTC Rate (GBP): {btcData.bpi.GBP.rate}</li>
          </ul>
        )}
      </article>

    </article>
  );
};

这就是我将其传递到我的index.astro文件的方式:

---
...other imports

import { CoinDeskAPI } from "../components/CoinDeskAPI.jsx";
---


<Layout title="Portfolio">
    <main class="flex flex-col gap-20">
          
                <!-- More code...  -->
            
        <!-- Bitcoin API section -->
        <CoinDeskAPI />
                
        
          
        </main>
</Layout>

推荐答案

要使React组件交互式,Astro要求您按照以下方式加载它:

<CoinDeskAPI client:load />

请注意,如果您在React组件中加载数据(使用useEffect),则只有在基本页面加载到用户浏览器中后,它才会发出请求,并从浏览器发出请求.为了加快速度,请向服务器发出请求,并将其作为props 传递给组件:

---
import { CoinDeskAPI } from "../components/CoinDeskAPI.jsx";

const data = await fetch('https://api.coindesk.com/v1/bpi/currentprice.json').then(res => res.json());
---

<CoinDeskAPI client:load btcData={data} />

请注意,在提供的示例中,您似乎没有进行任何客户端交互.如果是这样,您根本不需要React,只需在服务器上运行的Astro组件即可.

Javascript相关问答推荐

jest使用useLocate测试自定义挂钩

追踪执行顺序

Vue-Router渲染组件但不更改网址

nPM审计始终发现0个漏洞

如何通过继承contentitable属性的元素捕捉keydown事件?

如何让\w token 在此RegEx中表现得不贪婪?

如何获取转换字节的所有8位?

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

node TS:JWT令牌签名以验证客户端和后台问题之间的身份验证

Bootstrap动态选项卡在切换选项卡后保持活动状态,导致元素堆叠

单击子元素时关闭父元素(JS)

Angular material 拖放堆叠的牌副,悬停时自动展开&

数字时钟在JavaScript中不动态更新

如何在ASP.NET中使用Google Charts API JavaScript将条形图标签显示为绝对值而不是负值

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

400 bad request error posting through node-fetch

使用Nuxt Apollo在Piniastore 中获取产品细节

为什么客户端没有收到来自服务器的响应消息?

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

如果NetSuite中为空,则限制筛选