svelte教程(8)stores

简介: 有时,您将需要多个不相关的组件或常规的JavaScript模块访问这些值。在Svelte,我们通过store来做到这一点。store只是一种对象,该对象具有一种subscribe方法,该方法允许在store的value发生变化时通知订阅过的组件。

有时,您将需要多个不相关的组件或常规的JavaScript模块访问这些值。

在Svelte,我们通过store来做到这一点。store只是一种对象,该对象具有一种subscribe方法,该方法允许在store的value发生变化时通知订阅过的组件。

可写 store

通过 writable 方法可以创建一个可写store,传入两个参数value, start。

  • value:初始值
  • start:获得第一个订阅者时调用,拥有一个参数为set的回调。可以返回一个stop方法,该方法在最后一个订阅者退订时执行。
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: 设置value值。
  • update: 更新value值,接受一个参数为value的方法,return一个新的value值。
function update(fn) {
   set(fn(value));
}
  • subscribe: 订阅该store,接受一个参数为value的方法,用于获得value值并进行处理。返回值为一个退订方法,执行该方法完成退订。
<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将在组件销毁时自动调用停止订阅方法。

<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

您可以使用创建一个store,并且这个store基于其他一个或者多个store,可以使用派生store。

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

derived接受三个参数:

  • stores:可以为一个store对象,或者为一个数组。
  • fn:接受一个方法包含两个参数values,set。如果stores为数组,values也为数组,如果stores为store对象,values为改store的value。如果没有set参数,派生store的value为fn的返回值,如果包含set参数可以使用set方法指定value值。
  • initial_value:初始值(异步时使用)

绑定 store

如果store是可写的(即它具有set方法),则可以绑定其值,就像可以绑定到本地组件一样。

也可以通过直接赋值将value写进store。

<input bind:value={$count}>

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

本教程的所有代码均上传到github有需要的同学可以参考 https://github.com/sullay/svelte-learn

目录
相关文章
|
8月前
Vue3+Vite+Pinia+Naive后台管理系统搭建之二:scss 的安装和使用
Vue3+Vite+Pinia+Naive后台管理系统搭建之二:scss 的安装和使用
137 0
|
8月前
|
JavaScript
Vue.directive的原理与日常使用
Vue.directive的原理与日常使用
87 0
|
JavaScript 开发者
Vue_Study入门五
Get新知识: vue devtools 的安装及简单使用vue devtools 调试工具,相对于浏览器自带的开发者工具对于调试和查看vue 的项目和demo 提供更强大的调试功能,在对数据绑定的检验,标签结构等方面的查看检验调试更方便。 vue 父子组件传值父子组件之间传值,在子组件中使用props 属性接受传值,在使用时子组件时传入在props 中定义的参数名一致的数值。<!DOCT...
49 0
Vue_Study入门五
|
JSON JavaScript 前端开发
Vue_Study入门七
Get新知识: axios 的使用axios 是一个基于promise 的网络请求库,可以用于浏览器和node.js。从node.js中创建http请求支持Promise API拦截请求和响应转换请求数据和响应数据取消请求自动转换JSON数据客户端支持防御XSRF浏览器中创建XMLHttpRequests​ 简单使用<script type="text/javascript" src="....
45 1
Vue_Study入门七
|
JavaScript 索引
Vue_Study入门二
Get新知识: vue 按键修饰符vue 中不仅可以通过事件来和用户进行交互,也可以同通过键盘按键来交互,使用 v-on:keyup.enter=“xxx” 的格式来为指定的键盘事件指定处理逻辑,一般情况下是对某个具体键盘事件进行专门的处理逻辑,如果不指定具体按键则会是所按键都会出发事件。 vue 自定义按键修饰符通过如下的语句来自定义按键,Vue.config.keyCodes.qaq ...
65 0
Vue_Study入门二
|
JavaScript 前端开发 UED
单文件组件(Single-File Components):Vue.js开发的模块化之道
Vue.js是一款流行的JavaScript框架,以其简洁、灵活和易用而广受欢迎。其中一个Vue.js的强大功能就是单文件组件(Single-File Components),它使得Vue.js应用的开发更加模块化和可维护。在本博客中,我们将深入探讨单文件组件的概念、结构、用法,以及如何利用它们来构建清晰、可复用和高效的Vue.js应用。
241 0
|
JavaScript 前端开发
学习Vue3 第二十五章(TSX)
vue2 的时候就已经支持jsx写法,只不过不是很友好,随着vue3对typescript的支持度,tsx写法越来越被接受
178 0
学习Vue3 第二十五章(TSX)
|
前端开发
前端学习笔记202304学习笔记第十一天-vue3.0-基于provide和inject实现数据共享
前端学习笔记202304学习笔记第十一天-vue3.0-基于provide和inject实现数据共享
75 0
|
缓存
学习Pinia 第五章(Actions,getters)
主要作用类似于computed 数据修饰并且有缓存
188 0
|
前端开发 JavaScript API
前端知识库Reactjs基础系列四react-router
在开发spa项目中,前端路由是一个无法绕开的技术,在整个spa前端架构中我觉的掌握前端路由配置,状态管理以及异步请求的封装是最基本的能力。本文主要介绍react-router对于react项目的作用,以及基本配置。