svelte - 在浏览器中更改选项卡时访问存储在 Svelte 存储中的数据
问题描述
我对 Svelte 比较陌生,并且使用我在网上找到的一些代码来创建一个简单的购物车。
我的问题: 在浏览器中更改选项卡时,我无法使用存储在 Svelte 商店中的数据。
详细说明:
运行我的演示时,我能够成功地将商店中的商品添加到名为 的数组cart
中,我可以将其存储在名为 的 Svelte 商店中cartcontents
。我可以cart
通过单击 UI 中的加号或减号来调整存储的项目 - 更改会反映回我的cartcontents
商店。
但是,如果我将选项卡从购物车切换到另一个选项卡,然后再切换回来,我会得到一个空的购物车并NaN
显示总计(计算值)。
这是我的组件(称为Shop.svelte
)的脚本块中的内容:
<script>
export let location;
import { Router, Link, Route } from "svelte-routing";
import { writable, get } from "svelte/store";
import { counter, cartcontents } from "../stores.js";
import productlisting from "../productlisting.js";
let cart = [];
cart = $cartcontents;
console.log("CART", cart) <!----- THIS SHOWS CORRECT DETAILS
let totalcount = 0;
let products = productlisting;
const addToCart = (product) => {
for(let item of cart) {
if(item.id === product.id) {
product.quantity += 1
cart = cart;
return;
}
}
cart = [...cart, product];
counter.update(n => n + 1);
cartcontents.update(n => [cart]);
}
const minusItem = (product) => {
for(let item of cart) {
if(item.id === product.id) {
product.quantity -= 1
counter.update(n => n - 1);
cartcontents.update(n => [...n, cart]);
cart = cart;
return;
}
}
cart = [...cart, product]
}
const plusItem = (product) => {
for(let item of cart) {
if(item.id === product.id) {
product.quantity += 1
counter.update(n => n + 1);
cartcontents.update(n => [...n, cart]);
cart = cart;
return;
}
}
cart = [...cart, product]
}
$: total = cart.reduce((sum, item) => sum + item.price * item.quantity, 0);
</script>
这是我的组件中的 HTML 标记:
<div class="product-list">
{#each products as product}
<div>
<div class="image" style="background-image: url({product.image})"></div>
<a href="/product/{product.id}"><h4>{product.name}</h4></a>
<p class="money">
${product.price}
<button on:click={() => addToCart(product)}>Add to cart</button>
</p>
</div>
{/each}
</div>
{#if $counter > 0}
<div>
<div class="cart-list">
<h2>Cart</h2>
{#each cart as item } <!--- THIS IS WHERE I'M EXPECTING ITEMS TO APPEAR WHEN SWITCHING BACK - EVEN WITH ITEMS IN, IT THROWS AN ERROR -->
{#if item.quantity > 0}
<div class="cart-item">
<img width="50" src={item.image} alt={item.name}/>
<div>{item.quantity}
<button on:click={() => minusItem(item)}>-</button>
<button on:click={() => plusItem(item)}>+</button>
</div>
<p class="money">${item.price * item.quantity}</p>
</div>
{/if}
{/each}
</div>
<div class="total">
<h4>Total: $ {total}</h4>
<button>Checkout and Pay</button>
</div>
</div>
{:else}
<div id="cart">
<h2>Cart</h2>
<span>There are no products in your cart</span>
</div>
{/if}
我已经在 SO 上的此链接中看到了答案,并尝试将代码更改为使用cart = get($cartcontents);
or cartcontents.subscribe();
,但 get store.subscribe is not a function
or$cartcontents.subscribe
不是函数。
我的目标是cart
初始化为一个空数组,或者使用来自 的产品cartcontents
,这取决于它cartcontents
是空的还是有一个产品数组。
我不确定我做错了什么 - 任何人都可以帮忙吗?
解决方案
推荐阅读
- java - 在 Tomcat 上启动 Jenkins 时遇到一个问题(http://localhost:8080/jenkins/)
- python - Django:需要在登录后使用来自数据库重定向的信息进行动态登录重定向,使用内置登录
- python - 为三个项目生成固定值以在而不是 randrange 之间随机播放
- bash - 如何将默认 python 解释器设置为 Anaconda2 路径,而不是 WSL 中的 usr/bin/ 默认值
- python - 如何通过python填充文本区域并选择选项(选择标签)并点击提交(输入标签)?
- jquery - 如何阻止点击事件创建多个元素?
- javascript - 如何在反应中使用leader-line(一个外部javascript库)?
- php - PHP - 对象数组
- mysql - 对多连接表求和
- javascript - ES2015 + flow:自引用(循环?)枚举