如何定义Readable Store并延迟调用其set函数至满足指定条件?
延迟调用Readable Store的set函数实现按需API数据填充
完全可以实现这个需求。Svelte的Readable Store在创建时传入的start函数中,你可以保留set方法的引用,然后在满足特定条件时手动触发它来更新Store数据,完美适配你想自行控制API调用时机的场景。
实现示例
首先创建一个自定义的Readable Store,把用于触发API请求和更新数据的方法挂载到Store实例上:
import { readable } from 'svelte/store'; export const apiDataStore = readable(null, (set) => { // 挂载自定义方法到Store,用于手动触发API请求和数据更新 apiDataStore.loadData = async () => { try { // 替换为你的API地址 const response = await fetch('https://api.example.com/data'); const data = await response.json(); set(data); // 调用set填充Store数据 } catch (err) { console.error('API请求失败:', err); set(null); // 出错时设置默认值 } }; // 可选:返回清理函数,比如取消未完成的请求 return () => {}; });
在组件中使用
在需要的时机(比如按钮点击、组件挂载完成等)调用Store的自定义方法:
<script> import { apiDataStore } from './stores.js'; </script> <button on:click={() => apiDataStore.loadData()}>加载数据</button> {#if $apiDataStore} <div> <h3>加载完成的数据:</h3> <pre>{JSON.stringify($apiDataStore, null, 2)}</pre> </div> {:else} <p>点击上方按钮加载API数据</p> {/if}
进阶优化:避免重复请求
如果担心多次触发导致重复API调用,可以在方法里添加加载状态锁:
import { readable } from 'svelte/store'; export const apiDataStore = readable(null, (set) => { let isLoading = false; apiDataStore.loadData = async () => { if (isLoading) return; isLoading = true; try { const response = await fetch('https://api.example.com/data'); const data = await response.json(); set(data); } catch (err) { console.error('API请求失败:', err); set(null); } finally { isLoading = false; } }; return () => {}; });
内容的提问来源于stack exchange,提问作者Nick Jennings
相关产品推荐
相关产品推荐

