如何通过react.js使用svelte store

Mar*_*que 1 reactjs svelte-3

有没有办法将 svelte store 与 React.js 一起使用。我真的很喜欢它的简单性以及它的替换方式switch case。这是 svelte 文档中的示例代码。

import { writable } from 'svelte/store';

function createCount() {
    const { subscribe, set, update } = writable(0);

    return {
        subscribe,
        increment: () => {},
        decrement: () => {},
        reset: () => {}
    };
}

export const count = createCount();
Run Code Online (Sandbox Code Playgroud)

Cri*_*ole 12

使用 React hooks 可以轻松做到这一点:

import {useEffect, useState} from 'react';
import {get} from 'svelte/store';

const unset = Symbol();

export function useReadable(store) {
  const [value, set] = useState(unset);

  useEffect(() => store.subscribe(set), [store]);

  return value === unset ? get(store) : value;
}

export function useWritable(store) {
  const [value, set] = useState(unset);

  useEffect(() => store.subscribe(set), [store]);

  return [
    value === unset ? get(store) : value,
    store.set,
    store.update
  ];
}
Run Code Online (Sandbox Code Playgroud)

编辑

在这个答案之后,我实际上把它打包了。该代码已在生产中使用。这很容易理解。https://www.npmjs.com/package/react-use-svelte-store

  • 我认为你的 useEffect 应该返回一个取消订阅调用,以避免内存泄漏。(或者创建另一个不带依赖项的 useEffect 返回 unsbuscribe)。 (2认同)
  • 确实如此!:) `subscribe` 返回取消函数,而 `() => x` lambda 表达式返回 `x`,因此 useEffect 返回取消。 (2认同)