Recoil基础

113 阅读2分钟

一、简介

在之前的面试中,有人简历里写了这个东西,一脸懵逼,不知道是什么,简单梳理一下

Recoil是FaceBook公司提出的状态管理方案,相当于和React是一脉相承,使用方法也差不多

Recoil采用分散管理原子状态的设计模式

Recoil提出了一个新的管理状态单位Atom,它是可更新和订阅的,当一个Atom更新之后,每个订阅它的组件都会与之更新重新渲染,如果多个组件使用同一个Atom,那么这些组件将会共享他们的状态。

二、基础使用

1、安装

npm install recoil
或
yarn add recoil

2、初始化

使用RecoilRoot包裹根部组件

import React from 'react';
import {
  RecoilRoot,
  atom,
  selector,
  useRecoilState,
  useRecoilValue,
} from 'recoil';

function App() {
  return (
    <RecoilRoot>
      <AppPage />
    </RecoilRoot>
  );
}

3、Atom

const textState = atom({
  key: 'textState', // atom的唯一值,操作中需要使用
  default: '', // 默认值
});

4、组件中使用

function TextInput() {
  const [text, setText] = useRecoilState(textState);// 用法相当于useState,及其容易上手

  const onChange = (event) => {
    setText(event.target.value);
  };

  return (
    <div>
      <input type="text" value={text} onChange={onChange} />
      <br />
      Echo: {text}
    </div>
  );
}

5、Selector

selector 代表一个派生状态,派生状态是状态的转换。在mobx中可视为 computed

const charCountState = selector({
  key: 'charCountState', // 唯一值
  get: ({get}) => {
    const text = get(textState);

    return text.length;
  },
});

// 相应的取值方法 useRecoilValue

function CharacterCount() {
  const count = useRecoilValue(charCountState);

  return <>Character Count: {count}</>;
}

6、异步请求

selector也可用来请求数据

const userNameQuery = selector({
  key: 'userName',
  get: async ({get}) => {
    const response = await myDBQuery({
      userID: get(currentUserIDState),
    });
    return response.name;
  },
});

function CurrentUserInfo() {
  const userName = useRecoilValue(userNameQuery);
  return <div>{userName}</div>;
}

三、方法解释

// atom: 一个 atom 表示 Recoil 的 state

// useRecoilState():当你同时需要对 atom 进行读写时,使用此 hook。使用此 hook 会使组件订阅 atom。
const [text, setText] = useRecoilState(textState)

// useRecoilValue():当你仅需要读取 atom 时,使用此 hook。使用此 hook 会使组件订阅 atom。
const count = useRecoilValue(charCountState);

// useSetRecoilState():当你仅需要写入 atom 时,使用此 hook。
const setNamesState =useSetRecoilState(namesState);
// useResetRecoilState():需将 atom 重置为默认值时,使用此 hook。

const resetList =useResetRecoilState(todoListState);

四、缺点

由于atom的使用方法和Hooks使用方法一致,所以这种方法都不能在纯js中单独使用,会有一些限制,使用时需要传入相应的set方法