小工具      在线工具  汉语词典  css  js  c++  java

Recoil在React中的完整实践计划

Web前端,React,react.js,前端,vue.js 额外说明

收录于:39天前

我先抱怨一下吧。 Recoil的文档确实不友好。另外我发现国内用Recoil的人很少,很多文章都是抄袭官网文档。如果有问题,直接去官方网站查看即可。如果您碰巧看到这篇文章,请仔细阅读,这绝对是有用的信息。至于它的一些优点和特点,大家可以自己去找其他的对比文章。这里我只通过一个简单的例子来演示和学习。

第 1 步:创建项目

使用维特创造反应项目,其他都一样,别问我为什么只讲维特,因为这就是我用的维特

pnpm create vite

……选择react项目至于是ts还是js看你自己的喜好……

npm install

npm run dev

这是我的项目目录:

第二步:畏缩安装

pnpm add recoil

项目使用

插入 main.tsx<RecoilRoot/>,请注意,此标签必须是 UI 的根。

import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import { RecoilRoot } from "recoil";
import App from "./App";
import "antd/dist/reset.css";
import "animate.css";
import "@/assets/styles/index.scss";

// react 18 创建(会导致 antd 菜单折叠时闪烁,等待官方修复)
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
  // * react严格模式
  // <React.StrictMode>
  <BrowserRouter>
   <RecoilRoot>
    <App></App>
   </RecoilRoot>
  </BrowserRouter>,
  // </React.StrictMode>,
);

为了方便使用,我根据流行的标准创建了一个目录,并做了一些简单的封装。好不好用就看你自己了;如果不好,你可以自己改变。

// 示例封装
import { atom, selector } from "recoil";
import ThemeConfig from "@/config/themeConfig";
import { ITheme } from "@/interface/theme";

const theme: ITheme = {
  title: import.meta.env.VITE_TITLE,
  theme: "default",
  i18n: ThemeConfig.i18nDef,
};

export const themeState = atom({
  key: "themeState",
  default: theme,
});

export default {
  i18nState: atom({
   key: "i18nState",
   default: ThemeConfig.i18nDef,
  }),
  useThemeState: selector({
   key: "useThemeState",
   get: ({ get }) => {
    return get(themeState);
   },
   set: ({ get, set }, newValue) => {
    const oldValue = get(themeState);
    const updateValue = Object.assign({}, oldValue, newValue);
    set(themeState, updateValue);
   },
  }),
};
// index.ts入口
import Theme from "./modules/theme";

export default {
  …Theme,
};

使用示例

import { useEffect } from "react";
import { Row, Col, Pagination, Switch } from "antd";
import { atom, useSetRecoilState, useRecoilState, useRecoilValue } from "recoil";
import Store from "@/store";
import "@/assets/styles/page/home.scss";

export default function Home() {
  const [i18nState, setI18nState] = useRecoilState(Store.i18nState);
  const setThemeState = useSetRecoilState(Store.useThemeState);
  const themeState = useRecoilValue(Store.useThemeState);
  useEffect(() => {
   setI18nState("en-us");
   console.log(i18nState);
  }, []);

  const onChange = (checked: boolean) => {
   console.log(`switch to ${checked}`);
   setThemeState({ i18n: "en-us" });
   if (checked) {
    setThemeState({ i18n: "zh-cn" });
   } else {
    setThemeState({ i18n: "en-us" });
   }
   console.log(themeState);
  };

  return (
   <Row justify="center" className="content-body home-box">
    <Col span={24}>
     <Pagination total={85} showSizeChanger showQuickJumper showTotal={(total) => `Total ${total} items`}></Pagination>
     <Switch defaultChecked onChange={onChange} />
    </Col>
   </Row>
  );
}

重点! ! ! :根据它的特点,简单介绍一下如何正确理解和使用它的一些属性和钩子。仅限于常用的。如果不常用的话可以自己研究或者私信我。

原子(选项)

包含我们应用程序中的状态源。最细的粒子直接定义了我们使用的状态,因为后续的选择器也是基于此进行操作的。

export const demoState = atom({
  key: 'demoState',
  default: ”demo”,
});
export const atomState = atom({
  key: 'atomState',
  default: {i18n: “en”},
});

选择器(选项)

代表一个派生状态,您可以将派生状态视为将状态传递给以某种方式修改给定状态的纯函数的输出。说白了,这是为了处理复杂的状态,或者说处理你需要的状态。

export const useAtomState = selector({
  key: 'useAtomState',
  get: ({ get }) => {return get(atomState)},
  set: ({ get, set }, newValue) => {set(atomState, newValue)},
});

useRecoilState(状态)

可以使用这个hook来进行读写操作,可以说和react中的useState一模一样。只要理解 useRecoilState 如何理解 useState 就可以了。

const [demoState, setDemoState] = useRecoilState(demoState);

useRecoilValue(状态)

这是直接读取其内部值,仅此而已。

const demoState = useRecoilValue(demoState);

useSetRecoilState(状态)

这也只是修改了值,仅此而已。

const setDemoState = useSetRecoilState(demoState);

请记住,写下您定义的任何内容。不要定义一个对象并将其写入字符串或其他奇怪的东西。这样你肯定不会报错,但是使用的时候肯定会生气。

其他的钩子你可以自己研究和玩。如果有兴趣,请直接看我写的完整项目。

项目地址

. . .

相关推荐

额外说明

CentOS7.9。离线安装 Docker

CentOS 7上离线安装Docker 下载适用于CentOS 7的Docker安装包: https://download.docker.com/linux/static/stable/x86_64/ 将下载的 docker-24.0.4.tgz 文

额外说明

【Unity 实用工具篇】✨| 受击插件Feel 详细教程,开发游戏时更好的操控 游戏打击感

- 博客主页:https://xiaoy.blog.csdn.net - 本文由 呆呆敲代码的小Y 原创,首发于 CSDN- - 学习专栏推荐:Unity系统学习专栏 - 游戏制作专栏推荐:游戏制作 -Unity实战100例专栏推荐:Unity 实战10

额外说明

Java基础 第四节 第二课

线程安全 概述 案例 模拟票 测试类 线程同步 同步代码块 格式 同步锁 同步方法 格式 代码 Lock 锁 概述 如果有过个线程在同时运行, 而这些线程可能会勇士运行这段代码. 程序每次运行结果和单线程运行的结果是一样的, 而其他的变量的值也和预期的是

额外说明

ch1_系统启动_setup.S

1 功能分析 大写的.s 后缀名, 是为了说明是一个16位, 实模式下的汇编语言, 小写的 s 是保护模式下的汇编语言; 1.1 使用中断,读取机器参数 setup.S 是一个操作系统的加载程序, 主要作用使用 ROM BIOS 中断读取机器系统数据,

额外说明

安卓 每日一题 2020年2月问题及答案

最新 文章连接,本文不再同步 Android 2月2日题:android图片占用的内存大小怎么计算? 答案:分辨率像素点大小。但是分辨率不一定是原图分辨率,而像素点一般就ARGB_8888(4字节)与RGB_565(2字节)。android系统会根据图片

额外说明

Hadoop3 - MapReduce 分组介绍及案例实践

一、MapReduce 分组 上篇文章对 MapReduce 分区进行了介绍,通过分区规则控制不同的数据进到不同的 reducetask 中,而本篇文章讲的分组则是进到同一个 reducetask 中的数据的归类分组规则,下面是上篇文章的地址: http

额外说明

《Cesium 基础知识点》- LabelCollection 修改 Label 样式

一、API Cesium.Label Cesium.LabelCollection 二、修改 LabelCollection 中的 Label 集合 // 这里是循环设置字体颜色为半透明,同理,也可修改其它样式,如:outlineColor、font 等

额外说明

Docker常见面试题

文章目录 什么Docker? Docker 与虚拟机有何不同? 什么是Docker 镜像? 什么是Docker 容器? Docker 容器有几种状态? Dockerfile 中最常见的指令是什么? Dockerfile 中的命令COPY 和ADD 命令有

额外说明

wordpress配置_您可能不知道的15个有用的WordPress配置技巧

WordPress 配置 WP-config is one of the most powerful files on your WordPress site, and it plays an important role in WordPress 的幕

ads via 小工具