使用 SolidJS 中的 fetch API 渲染远程数据

2024-04-22

我是一个使用 Solid JS(以及就此而言的 JS)的新手,并且在尝试填充(自定义)时遇到了看似奇怪的行为<Table>使用来自 API 的数据的组件fetch().

这是我的<Table>:

import { Component, For } from "solid-js";
import "jquery";
import "datatables.net-bs5";

const Table: Component<{ id: string; columns: string[]; data: any[] }> = ({
  id,
  columns,
  data,
}) => {
  return (
    <>
      <div class="table-responsive">
        <table id={id} class="table table-striped table-hovr">
          <thead>
            <For each={columns}>{(col: string) => <th>{col}</th>}</For>
          </thead>
          <tbody>
            <For each={data}>
              {(row: {}) => (
                <tr>
                  <For each={Object.values(row)}>
                    {(d: any) => <td>{d}</td>}
                  </For>
                </tr>
              )}
            </For>
          </tbody>
        </table>
      </div>

    </>
  );
};

export default Table;

这是我想放置数据的地方:

import { Component, createSignal} from 'solid-js';
import Table from '../components/Table';
import "jquery";
import "datatables.net-bs5";
import { getRequest } from '../utils/utils';
import Customer from '../entities/Customer';



const Customers: Component = () => {
    const [customers, setCustomers] = createSignal<Customer[]>([]);

    const columns = [
        'ID Cliente',
        'Numero Cliente',
        'Azienda?', 
        'Nome',
        'Cognome',
        'Sesso',
        'Data di nascita',
        'Via',
        'Città',
        'CAP',
        'Telefono',
        'E-mail'
       ] /* Display name of the columns */

       
   const req =  getRequest("/customers").then((data) => setCustomers(data)
   ).catch((e) => window.location.href="/");

   

    return <>
            <h2>Clienti</h2>
            <br />
            <Table id="main-table" columns={columns} data={customers()}></Table>
            </>
    
}

export default Customers;

function createStore<T>(arg0: never[]): [any, any] {
    throw new Error('Function not implemented.');
}

这是我用来获取数据的函数:

export async function getRequest(endpoint : string) {
  const response = await fetch(config.api_url + endpoint, {
        method: "GET",
        "headers": {
            "Authorization": config.jwt
        }
    });
    return response.json();
}

基本上问题是,只有在我更改了网页中的某些内容后,我才第一次看到网页上表格内的数据。<Table>并保存。当我重新加载页面(以及所有其他访问)时,我只看到<th>s和一个空的桌体。

我认为我误解了 SolidJS Signal,但我不确定。

您能给我一个提示,告诉我我做错了什么吗?

谢谢。 数控

我尝试使用 Solid JS Signal 但没有成功


您可以使用资源或直接使用 fetch API。资源允许您在渲染组件之前获取数据。

使用资源

Solid 有一个专用的 API,用于获取和渲染远程数据,该数据是使用createResource:

https://www.solidjs.com/docs/latest/api#createresource https://www.solidjs.com/docs/latest/api#createresource

资源允许您管理查询参数并在正在进行的请求的不同阶段呈现不同的元素。

const [data, { mutate, refetch }] = createResource(getQuery, fetchData);

Here, getQuery是携带查询参数的信号。它是可选的,更新它会导致自动重新获取。

fetchData是以资源形式返回承诺的获取器函数。

data是一个具有附加属性的 getter 函数:

  • data()返回成功值。
  • data.states返回正在进行的承诺的状态。
  • data.error如果承诺被拒绝,则返回失败的原因。 我将保持简短以避免重复文档。

这是一个工作演示:https://playground.solidjs.com/anonymous/6b063de1-584c-4691-aa38-cf8791070962 https://playground.solidjs.com/anonymous/6b063de1-584c-4691-aa38-cf8791070962

import { render } from "solid-js/web";
import { createSignal, Switch, Match, createResource } from "solid-js";

const getUsers = () => new Promise(resolve => {
  const users = [
    'Vivian Li',
    'Lina Delgado',
    'Aimee Navarro',
    'Enzo Larsen',
    'Diana Doyle',
    'Elspeth Meyers',
    'Michael Roberson',
    'Junior Sparks',
    'Daniela Orozco',
    'Esme Larson',
  ];
  setTimeout(() => resolve(users), 1000);
});

function App() {
  const [data] = createResource(getUsers);

  return (
    <div>
      <Switch fallback={<div>Not Found</div>}>
        <Match when={data.state === 'pending' || data.state === 'unresolved'}>
          Loading...
        </Match>
        <Match when={data.state === 'ready'}>
          {JSON.stringify(data())}
        </Match>
        <Match when={data.state === 'errored'}>
          {JSON.stringify(data.error)}
        </Match>
      </Switch>
    </div>
  );
}

render(App, document.getElementById("app")!);

直接使用 fetch API

您可以使用fetchAPI 直接在您的组件中,但您必须自己管理状态,以反映正在进行的请求的状态。

为了使代码自给自足,我将使用承诺,但您可以使用fetch功能和代码的工作原理相同。

在这里你可以找到一个演示:https://playground.solidjs.com/anonymous/a0b41605-f490-4787-bba0-130312cc2ba9 https://playground.solidjs.com/anonymous/a0b41605-f490-4787-bba0-130312cc2ba9

import { render } from "solid-js/web";
import { createSignal, Switch, Match } from "solid-js";

const getUsers = () => Promise.resolve([
  'Vivian Li',
  'Lina Delgado',
  'Aimee Navarro',
  'Enzo Larsen',
  'Diana Doyle',
  'Elspeth Meyers',
  'Michael Roberson',
  'Junior Sparks',
  'Daniela Orozco',
  'Esme Larson',
]);

function App() {

  interface State {
    status: 'pending' | 'resolved' | 'rejected';
    data?: any;
    error?: any;
  };

  const [state, setState] = createSignal<State>({ status: 'pending' });

  const handleClick = () => {
    getUsers()
      .then(data => setState({ status: 'resolved', data, error: undefined }))
      .catch(error => setState({ status: 'rejected', error }));
  }

  return (
    <div>
      <div>
      <button type="button" onClick={handleClick}>
        Fetch Users
      </button>
      </div>
      <Switch fallback={<div>Not Found</div>}>
        <Match when={state().status === 'pending'}>
          Loading...
        </Match>
        <Match when={state().status === 'resolved'}>
          {JSON.stringify(state().data)}
        </Match>
        <Match when={state().status === 'rejected'}>
          {JSON.stringify(state().error)}
        </Match>
      </Switch>
    </div>
  );
}

render(App, document.getElementById("app")!);

在演示中,数据是通过点击处理程序获取的,但您可以将获取逻辑移至组件主体中并自动执行获取。

function App() {
  interface State { status: 'pending' | 'resolved' | 'rejected', data?: any, error?: any };
  const [state, setState] = createSignal<State>({ status: 'pending' });
  
  getUsers()
      .then(data => setState({ status: 'resolved', data, error: undefined }))
      .catch(error => setState({ status: 'rejected', error }));

  return (
    <div>
      <div>
        <button type="button">
          Fetch Users
        </button>
      </div>
      <Switch fallback={<div>Not Found</div>}>
        <Match when={state().status === 'pending'}>
          Loading...
        </Match>
        <Match when={state().status === 'resolved'}>
          {JSON.stringify(state().data)}
        </Match>
        <Match when={state().status === 'rejected'}>
          {JSON.stringify(state().error)}
        </Match>
      </Switch>
    </div>
  );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SolidJS 中的 fetch API 渲染远程数据 的相关文章

随机推荐

  • 生成字符串所有组合的算法

    我在网上找到了一个链接 其中显示了生成字符串的所有组合的算法 http www mytechinterviews com combinations of a string http www mytechinterviews com comb
  • 为什么选择源进行 SQL 架构比较会导致 VS2012 崩溃?

    似乎没有任何原因 选择 SQL gt 架构比较 gt 新架构比较 然后尝试 选择源 会导致 Visual Studio 2012 崩溃 几个月来它一直按预期工作 除了尝试重新安装之外还有其他可能的修复方法吗 注意 尝试在 Visual St
  • 如何将数据从servlet传递到android应用程序

    I have a form in android upon submit im inserting it into database using servlet i have to show to user that form was in
  • 如何在JavaScript中计算3点之间的角度? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在 JavaScript 中获取 3 点之间的角度 如果我有积分A x1 y1 B x2 y2 and C x3 y3 我想得到由线A
  • Nightwatch.js 始终返回退出代码 1

    我尝试将 Nightwatch js 测试集成到 Jenkins 作业中 如果测试失败 我希望 Jenkins 构建失败 如果所有测试都通过 我希望构建通过 但我认识到夜巡总是返回exit code 1 测试通过或失败并不重要 但我期望ex
  • Python 转换日期格式

    给定一个像这样的字符串 2020 08 14 我如何将其转换为 14 August 2020 使用Python 3 您可以使用datetime用于重新格式化日期字符串的模块 使用strptime你可以从一个字符串读入一个datetime对象
  • 如何用 POST 替换 window.open(...)

    我目前有一些运行的代码window open urlWithGetParams 线 据我所知 这将迫使我使用GET要求 我想通过 POST 请求来完成此操作 有解决方法吗 我没有结婚window open 任何一个 我愿意接受任何允许我通过
  • 我可以换行 img 替代文本吗?

    我有一个由 css 样式设置为 100x75 的图像 当它不加载时 替代文本会加载到空间中 但会将容器扩展到超过 100 像素宽度 我怎样才能防止这种情况发生 要么把它剪掉 要么把它包起来 好吧 我在某种程度上明白了 我只是将图像包装在相同
  • QUERY Google Sheets 函数中同一字符串中的引号和撇号

    我想知道如何处理这样的查询 假设电子表格的单元格 A2 中包含以下文本 Case Bakers Flats 12 White Flour Tortillas 10 12ct 并需要将以下公式代入B2 QUERY importrange KE
  • 了解 JPA 序列生成器

    我正在使用 spring data JPA 的序列生成器将主键分配给实体 模型包含 Id GeneratedValue strategy GenerationType SEQUENCE generator seq post Sequence
  • 使用 GPUImageFilter 时发生崩溃

    我从 Github 上 Brad Larson 的教程开始 当我将这些代码添加到我的项目中时 void viewDidLoad super viewDidLoad GPUImageVideoCamera videoCamera GPUIma
  • reg 声明中的位顺序

    如果我需要使用 4 个 8 位数字 我会声明以下 reg reg 7 0 numbers 3 0 我对第一个和第二个声明 7 0 和 3 0 之间的区别感到很困惑 他们应该按什么顺序来 第一个是保留数字的大小 而第二个是保留数字的数量 还是
  • 为什么修改数组的副本会影响原始数组?

    大家好 如果这是一个菜鸟问题 我很抱歉 但我使用的是 python 我有一个问题 我复制一个数组 但当我修改副本时 它会影响原始数组 我想将边界矩阵的线性偏移添加到一组坐标 boundaries 5 818 0 0 0 0 0 0 5 81
  • TFS + 获取最新版本

    当我从 TFS 获取最新版本时 有没有办法列出已更新的文件 如果您使用的是 Visual Studio IDE 您可以在 输出 窗口中看到文件列表 要查看 输出 窗口 请选择菜单 视图 gt 输出 希望这可以帮助
  • Dialyzer 无法识别使用多态类型的函数中的错误

    背景 我正在尝试使用透析器进行多态打字 作为一个例子 我正在使用著名的Option类型 又名 Maybe Monad 现在在许多其他语言中都很流行 defmodule Test do type option t some t nothing
  • Kotlin 中参数的通用通配符

    我有一个用于监听 api 回调的抽象类 如下所示 ApiRs 是每个 API 响应对象都继承自它的父对象 abstract class ApiCallback
  • swift 中的 UIView viewwithtag 方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在努力学习一些快速的知识 我以编程方式添加标签 我想稍后更改它们的属性 viewwithtag 方法返回一个 UIView 如何从
  • 复制切片的通用方法

    我需要复制切片 以及底层数组的一部分 以便调用者不会改变数组的原始元素 我想我可以编写一个函数来对特定类型的数组执行此操作 func duplicateSliceOfSomeType sliceOfSomeType SomeType Som
  • 由于将请求从主线程传递到工作线程,netty 中出现延迟?

    我有一些关于 Netty 服务器端 TCP IP 应用程序的问题 我想知道在将请求从老板线程传递到工作线程时是否会因为 netty 由于缺少配置等 而出现延迟 我在用 new OrderedMemoryAwareThreadPoolExec
  • 使用 SolidJS 中的 fetch API 渲染远程数据

    我是一个使用 Solid JS 以及就此而言的 JS 的新手 并且在尝试填充 自定义 时遇到了看似奇怪的行为 table 使用来自 API 的数据的组件fetch 这是我的 table import Component For from s