svelte教程(8)stores

有時,您將需要多個不相關(guān)的組件或常規(guī)的JavaScript模塊訪問這些值锨天。

在Svelte囱淋,我們通過store來做到這一點。store只是一種對象,該對象具有一種subscribe方法纠亚,該方法允許在store的value發(fā)生變化時通知訂閱過的組件塘慕。

可寫 store

通過 writable 方法可以創(chuàng)建一個可寫store,傳入兩個參數(shù)value, start蒂胞。

  • value:初始值
  • start:獲得第一個訂閱者時調(diào)用图呢,擁有一個參數(shù)為set的回調(diào)∑妫可以返回一個stop方法蛤织,該方法在最后一個訂閱者退訂時執(zhí)行。
import { writable } from 'svelte/store';

export const count = writable(0,(set)=>{
  console.log('subscribe count')
  set(100)
  return ()=>{
    console.log('clear count')
  }
});

可讀store擁有三個方法:update 鸿染、set指蚜、subscribe。

  • set: 設(shè)置value值牡昆。
  • update: 更新value值姚炕,接受一個參數(shù)為value的方法,return一個新的value值丢烘。
function update(fn) {
   set(fn(value));
}
  • subscribe: 訂閱該store,接受一個參數(shù)為value的方法些椒,用于獲得value值并進行處理播瞳。返回值為一個退訂方法,執(zhí)行該方法完成退訂免糕。
<script>
  import { onDestroy } from "svelte";
  import { count } from "../stores";
  let count_value;
  const unsubscribe = count.subscribe(value => {
    count_value = value;
  });
  onDestroy(unsubscribe());
</script>

<h1>The count is {count_value}</h1>
<button
  on:click={() => {
    count.update(c => c - 1);
  }}>
  -
</button>
<button
  on:click={() => {
    count.update(c => c + 1);
  }}>
  +
</button>
<button
  on:click={() => {
    count.set(0);
  }}>
  reset
</button>

自動訂閱

使用$進行自動訂閱赢乓,自動訂閱的store將在組件銷毀時自動調(diào)用停止訂閱方法。

<script>
  import { onDestroy } from "svelte";
  import { count } from "../stores";
</script>

<h1>The count is {$count}</h1>
<button
  on:click={() => {
    count.update(c => c - 1);
  }}>
  -
</button>
<button
  on:click={() => {
    count.update(c => c + 1);
  }}>
  +
</button>
<button
  on:click={() => {
    count.set(0);
  }}>
  reset
</button>

只讀store

只讀store就是沒有暴露update石窑、set方法的可寫store牌芋。

import {
  readable
} from 'svelte/store';

export const time = readable(new Date(), function start(set) {
  const interval = setInterval(() => {
    set(new Date());
  }, 1000);

  return function stop() {
    clearInterval(interval);
  };
});
<script>
    import { time } from '../stores';

    const formatter = new Intl.DateTimeFormat('en', {
        hour12: true,
        hour: 'numeric',
        minute: '2-digit',
        second: '2-digit'
    });
</script>

<h1>The time is {formatter.format($time)}</h1>

派生store

您可以使用創(chuàng)建一個store,并且這個store基于其他一個或者多個store松逊,可以使用派生store躺屁。

export const elapsed = derived(
  time,
  $time => Math.round(($time - start) / 1000)
);

derived接受三個參數(shù):

  • stores:可以為一個store對象,或者為一個數(shù)組经宏。
  • fn:接受一個方法包含兩個參數(shù)values犀暑,set。如果stores為數(shù)組烁兰,values也為數(shù)組耐亏,如果stores為store對象,values為改store的value沪斟。如果沒有set參數(shù)广辰,派生store的value為fn的返回值,如果包含set參數(shù)可以使用set方法指定value值。
  • initial_value:初始值(異步時使用)

綁定 store

如果store是可寫的(即它具有set方法)择吊,則可以綁定其值李根,就像可以綁定到本地組件一樣。

也可以通過直接賦值將value寫進store干发。

<input bind:value={$count}>

<button on:click="{() => $count += 1}">
    + 1
</button>

本教程的所有代碼均上傳到github有需要的同學(xué)可以參考 https://github.com/sullay/svelte-learn朱巨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枉长,隨后出現(xiàn)的幾起案子冀续,更是在濱河造成了極大的恐慌,老刑警劉巖必峰,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洪唐,死亡現(xiàn)場離奇詭異,居然都是意外死亡吼蚁,警方通過查閱死者的電腦和手機凭需,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肝匆,“玉大人粒蜈,你說我怎么就攤上這事∑旃” “怎么了枯怖?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長能曾。 經(jīng)常有香客問我度硝,道長,這世上最難降的妖魔是什么寿冕? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任蕊程,我火速辦了婚禮,結(jié)果婚禮上驼唱,老公的妹妹穿的比我還像新娘藻茂。我一直安慰自己,他們只是感情好曙蒸,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布捌治。 她就那樣靜靜地躺著,像睡著了一般纽窟。 火紅的嫁衣襯著肌膚如雪肖油。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天臂港,我揣著相機與錄音森枪,去河邊找鬼视搏。 笑死,一個胖子當(dāng)著我的面吹牛县袱,可吹牛的內(nèi)容都是我干的浑娜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼式散,長吁一口氣:“原來是場噩夢啊……” “哼筋遭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暴拄,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤漓滔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乖篷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體响驴,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年撕蔼,在試婚紗的時候發(fā)現(xiàn)自己被綠了豁鲤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲸沮,死狀恐怖琳骡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讼溺,我是刑警寧澤日熬,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肾胯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耘纱。R本人自食惡果不足惜敬肚,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望束析。 院中可真熱鬧艳馒,春花似錦、人聲如沸员寇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝶锋。三九已至陆爽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扳缕,已是汗流浹背慌闭。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工别威, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驴剔。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓省古,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丧失。 傳聞我的和親對象是個殘疾皇子豺妓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容