22

我想知道我是否能够从一个普通的 .js 文件访问我的Svelte存储值。

我正在尝试编写基于存储值返回动态值的函数,以将它们导入任何组件中。但是在一个普通的 .js 文件中,我不能只使用 $ 符号访问存储值。

使用存储值并可用于多个组件的基本函数的快速示例:

//in .svelte

function add() {
    $counter = $counter + 1;
 }

编辑:改写一下

编辑: 找到了一个解决方案,但我真的不知道它是否真的优化了..

//in .js file

import { get } from "svelte/store";
import { counter } from "./stores";

export function add() {
    var counterRef = get(counter);
    counter.set(counterRef + 1);
}
4

4 回答 4

37

是的,一点没错。

一方面,store API 非常简单,没有什么能阻止您自己订阅 store 以了解其价值:

import myStore from './stores'

myStore.subscribe(value => {
  // do something with the new value
  // you could store it for future reference...
})

而且,如果你只想知道当前值,Svelte 有一个帮助器,get函数:

import { get } from 'svelte/store';

import myStore from './stores'

const value = get(myStore);
于 2019-12-01T15:11:35.290 回答
9

除了 rixo 的回答,更好的实现方式add是使用 store 的update方法:

import { counter } from "./stores";

export function add() {
    counter.update(n => n + 1);
}

您还可以创建一个实现该逻辑的自定义商店。

于 2019-12-01T17:30:28.980 回答
1

这不完全是您要求的(导入),但此方法具有相同的目的:您将商店作为参数传递,因此无需在 .js 中导入您的商店

import {get} from 'svelte/store'
export function add(yourStore) {
   let _yourStore = get(yourStore)
   yourStore.set(_yourStore + 1)
}

然后你只需要在你的 Svelte 组件中导入你的商店。
它允许不关心 .js 中的商店导入,而只关心你的组件。

于 2020-06-09T21:13:43.093 回答
0

许多 Svelte 商店示例不使用对象,所以这就是我的工作方式。这使用异步获取将用户的语言环境更新为0. 想象pstats = {uid: 1, locale: 5}...

import { pstats} from './stores.js'

export async function leave_locale() {
   return fetch(`./builds/leave`, {method: 'get'})
          .then(res => res.json())
          .then(res => {
                pstats.update((theStore) => {
                    return Object.assign(theStore, {locale: 0});
                })
            })
}
于 2020-08-17T16:44:40.197 回答