Svelte中如何让store在组件外也能响应式更新?
我在Svelte项目里用writable创建了一个store,但在非.svelte文件(比如一个工具函数)里修改它的值,页面不会自动更新。明明在组件里用$store = newValue是能响应的,为什么在外面就不行了?
我试过直接调用store.set(),也试过引入store后解构出update方法,但UI就是不刷新。是不是必须在.svelte文件里才能触发响应式?
// store.js
import { writable } from 'svelte/store';
export const count = writable(0);
// utils.js
import { count } from './store.js';
export function increment() {
count.update(n => n + 1); // 这样调用,页面不更新!
}
你在 utils.js 里调用
count.update()确实会改 store 的值,但问题是没有任何组件在监听这个变化。$store这种语法只能在 .svelte 文件的 template 或 script 标签里用,js 文件里它就是普通字符,不会触发任何订阅。正确的做法是:业务逻辑可以在 utils.js 里写,但 store 的订阅必须在组件里。
比如你的组件可以这样写:
或者如果你想在组件初始化时就建立订阅(但暂时不用),可以这样:
简单说就是:store 的值肯定能改,但页面要更新必须得有组件在监听。你在 utils.js 里调 update 只是改了值,谁都没通知,DOM 怎么会变呢。
别想着在 js 文件里搞响应式,Svelte 设计上就不支持这套,乖乖在组件里订阅就行。