提问人:Doe 提问时间:1/26/2023 更新时间:1/27/2023 访问量:133
使用 XHR 自动更新 svelte JSON
Automatically updating svelte JSON with XHR
问:
我是 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 套接字更新数据时
答:
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}
评论
quotes[security.name]
应解析为 undefined,因为是一个数组。我首先考虑通过派生存储或后端将这两件事合并到单个数组中,然后遍历生成的结构。quotes