有没有办法在组件外更新 recoilJS 上的状态?

Smi*_*One 3 javascript recoiljs

所以我正在尝试为我正在构建的 js 游戏使用 recoilJS,它非常简洁,但需要从组件更新原子感觉只是一种限制。

为了创建游戏循环,我将所有逻辑放在空组件上,以便我能够读取和写入状态。即使我将在组件之外构建登录,我也需要一直移动不同的统计信息。有没有办法在反应组件之外更新原子(不是通过钩子)?

Vee*_*eam 6

我使用RXJS来帮助在组件外部设置 RecoilJS 值。

一开始,我创建了 4 个部分作为

  1. 主要成分
  2. RecoilJS 组件
  3. 原子文件
  4. 在组件文件之外设置 RecoilJS 值

1).主

import React from 'react';
import {
  RecoilRoot
} from 'recoil';

function App() {
  return (
    <RecoilRoot>
      <MainScreens />
      <RecoilJSComponent/>
    </RecoilRoot>
  );
}
Run Code Online (Sandbox Code Playgroud)

2).RecoilJS组件

import React from 'react';
import {
    useRecoilCallback
} from 'recoil';
import { Subject } from 'rxjs';

export const setRecoil = new Subject();

const getRecoil = new Subject();
const returnRecoil = new Subject();

export const promiseGetRecoil = (recoilObj) => {
    return new Promise(async (resolve, reject) => {
        getRecoil.next(recoilObj)
        returnRecoil.subscribe({
            next: (value) => {
                if (recoilObj === value.recoilObj) {
                    resolve(value.value)
                }
            }
        });
    })
 }

export default function RecoilJSComponent() {

    const setStore = useRecoilCallback(({ set }) => (n) => {
        set(n.recoilObj, () => (n.value));
    }, [])

    const getStore = useRecoilCallback(({ snapshot }) => async (recoilObj) => {
    
    const valueRecoilObj = await snapshot.getPromise(recoilObj);
    returnRecoil.next({ recoilObj: recoilObj, value: valueRecoilObj })

 }, [])

    setRecoil.subscribe({
        next: (value) => {
            setStore(value)
        }
    });

    getRecoil.subscribe({
        next: (recoilObj) => {
            getStore(recoilObj)
        }
    });

    return null;
}
Run Code Online (Sandbox Code Playgroud)

3).原子文件

export const textState = atom({
  key: 'textState'
  default: ''
});
Run Code Online (Sandbox Code Playgroud)

4).在组件文件外设置RecoilJS的值

import API from './Api';
import { setRecoil } from './RecoilJSComponent'
import { textState } from './textState'

export const setValueReCoil = () => {

    API()
        .then(result => {

           setRecoil({ recoilObj: textState, value: result })

        })
        .catch(ex => {
        
        })
};
Run Code Online (Sandbox Code Playgroud)

主要偶像在2和4

在数字 2 中,我创建使用 RXJS 通过组件设置值,并导出 RXJS 以在组件外部的 RecoilJS 上设置值

希望我的偶像能帮你解决问题

  • 我创建了一个包来解决这个问题。https://www.npmjs.com/package/recoil-outside 祝你好运。 (3认同)