使用 XHR 自动更新 svelte JSON

Automatically updating svelte JSON with XHR

提问人:Doe 提问时间:1/26/2023 更新时间:1/27/2023 访问量:133

问:

我是 Svelte(或其他 JavaScript 反应式框架)的新手。 多年来,我只使用jQuery。 让我们假设,ich 具有以下数组和一个格式化程序函数......

let quotes = [{
  "key": "moonpie",
  "price": 2.22222222,
  "dif": 1.009
} ....]

let securities = [{
  "key": "moonpie",
  "stock": 200
} .....]

function updateQuotesWithinInterval {
  ... do some stuff, get the data ...
  quotes = json;
}

function formatNumber(value, options) {
  // 2.2222222 comes in, 2.22 EUR goes out
  // 1.000007 comes in, +1.00% goes out ....
  return formatted value;
}

{#each securities as security}
  Name: {security.key}<br />
  Price: {formatNumber(quotes[security.name].price, someoptionhere)}<br /> --> 2.22 EUR formatted
  Credit: {formatNumber(securities.stock * quotes[securities.name].price, someoptionshere}<br /> --> 2000 * 2.222222222 = 4,444.44 EUR formatted
  Change: {formatNumber(quotes[security.name].change, someoptionhere)}<br /> --> +1.01% formatted
{/each}

那么,在foreach语句中通过XHR更新后,通过调用JavaScript函数来显示格式化的数据的常用方法是什么?

最初它有效,并且对于按钮单击事件,它也可以有效,但是当数组在没有来自间隔提取的交互的情况下更改时,它不起作用。

我当时在想,我需要一个带有格式化值的新数组并显示它们 - 这有效,但我想知道, 这是否是常用方法?

我需要未格式化的数据,以便我可以在客户端执行一些计算,因此我无法选择格式化的数据。

因此,当我分配新数组时,让我们称它们为具有格式化值的数组,然后一切都可以找到,但我还不确定,这是否是这个问题的常用方法,当通过 XHR 从轮询或 Web 套接字更新数据时

数组 json xmlhttprequest svelte polling

评论

0赞 Igor Grechishkin 1/26/2023
quotes[security.name]应解析为 undefined,因为是一个数组。我首先考虑通过派生存储或后端将这两件事合并到单个数组中,然后遍历生成的结构。quotes
0赞 Doe 1/26/2023
是的,你绝对正确,这是一个例子,不是这里的问题;)......我只是把它写下来作为一个例子

答:

2赞 Igor Grechishkin 1/26/2023 #1

因此,假设您有 2 个数组,这两个数组都可以独立更新,并且您需要显示合并的结果。

创建 3 个纤细存储,其中 2 个用于原始数组,1 个用于派生的合并数组。

每次更改其中一个原始商店时,都会重新计算派生的商店,假设它有订阅者。

商店 .js

import { derived, writable } from "svelte/store";

/** @type {SvelteStore<{key: string, price: number, dif: number}[]>} */
export const quotes = writable([]);

/** @type {SvelteStore<{key: string, stock: number}[]>} */
export const securities = writable([]);

/** @type {SvelteStore<{key: string, stock: number, price:number, dif:number }[]>} */
export const securities_with_quotes = derived([quotes, securities], ([$quotes, $securities]) => {
    return $securities.map((security) => {
        let quote = $quotes.find(q => q.key == security.key);
        return {
            ...security,
            ...quote
        }
    });
})

在组件内循环访问生成的数组。由于您正在循环访问派生存储,因此原始数组中的所有更改都将触发重新呈现。

SecuritiesList.svelte

<script>
import {securities, quotes, securities_with_quotes } from "./stores.js";
import Price from 'Price.svelte'

function updateQuotesWithinInterval {
  ... do some stuff, get the data ...
  $quotes = json;
} 

</script>

{#each $securities_with_quotes as security}
    Name: {security.key}
    Price: <Price value={security.price}/>
    Credit: <Price value={security.price * security.stock}/>
    Change: <Price value={security.dif}/>
{/each}

将价格及其所有显示逻辑隔离在一个单独的组件中也是一个好主意。

价格.svelte

<script>
export let value = 0;

function formatNumber(value, options) {
  // 2.2222222 comes in, 2.22 EUR goes out
  // 1.000007 comes in, +1.00% goes out ...
  return formatted_value;
}

$:displayValue = formatNumber(value)
</script>

{displayValue}