Recoil在React中完整实践方案

news2024/11/24 0:51:14

先让我吐槽一下,Recoil这个玩意文档是真的不友好,另外发现国内很少有人去用Recoil,然后好多文章都是照搬官网文档,我特喵的要是出了问题直接看官方不就行了。如果你碰巧看到这个文章了,就细心看完吧,绝对的干货。至于它的一些优点特性,自己找找别的对比文章吧,我这里仅仅进行一个简单的示例演示及学习。

第一步:创建项目

利用vite创建一个React项目,其他的一样,别问我为啥只讲vite,因为我就是用的vite

pnpm create vite

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

npm install

npm run dev

这是我的项目目录:

第二步:Recoil安装

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>
  );
}

 

重点!!!:针对其特性我简单给大家讲一下如何正确理解并使用它的一些属性及hook,仅仅限于其常用的,不常用的大家自行研究或者给我留私信。

Atom(options)

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

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

Selector(options) 

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

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

useRecoilState(state)

利用此hook可以进行读写操作,和react中的useState可以说是一模一样的用法,你怎么理解useState就怎么理解useRecoilState就行。

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

useRecoilValue(state)

这个就是直接读取其内部的值,仅此而以。

const demoState = useRecoilValue(demoState);

useSetRecoilState(state)

这个也是仅仅修改值,仅此而以。

const setDemoState = useSetRecoilState(demoState);

记住,你定义的什么就写入什么,不要定义一个object写入一个string或者其他的奇奇怪怪的东西,这样肯定不会报错,但是你用的时候肯定会肝火旺盛。

其他的hook大家自己研究玩吧。大家感兴趣的话,直接去看我写的完整项目吧。

项目地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从一文不值到数字黄金 诞生于极客圈的比特币,究竟经历了什么?

比特币作为技术性很强的神奇发明&#xff0c;从一文不值到数字黄金&#xff0c;在发展过程中不仅为金融范式转变奠定了基础&#xff0c;改变了人们感知和交易价值的方式&#xff0c;也为无数数字资产开辟了一条可追随的道路。 比特币之所以复杂&#xff0c;是因为技术属性、金融…

在线未注册域名批量查询-域名注册批量查询

域名批量注册查询 域名批量注册查询是一种工具&#xff0c;可以帮助用户批量查询并注册多个域名。这种工具通常被域名管理者、品牌专家、互联网营销人员等使用。 以下是域名批量注册查询工具的优点&#xff1a; 提高效率&#xff1a;与手动单独注册域名相比&#xff0c;域名批…

机器学习基础(粗学)【未完待续】

卷积神经网络粗学 卷积&#xff1a;用卷积求系统的存量&#xfeff;&#xfeff;&#xfeff; 卷积&#xff0c;就是把输出函数反转一下。。。。&#xff08;离谱&#xff09; 实际不是从物理意义上理解的函数翻转&#xff0c;而是应该从数学意义上&#xff0c;去理解卷积的…

六、IDEAJ同一个服务启动多台服务器的方法

目录 1、打开启动类配置窗口--->选择Edit Configurations进入配置窗口 2、从左侧Springboot应用选择需要启动的多台服务器&#xff08;服务只要启动一次就会在此窗口有显示&#xff09;--->勾选Allow parallel run菜单&#xff08;默认不勾选&#xff0c;则只能启动一台…

【JAVAEE】常见的锁策略

目录 1.常见的锁 1.乐观锁&悲观锁 2.轻量级锁&重量级锁 3.读写锁&普通互斥锁 4.自旋锁&挂起等待锁 5.可重入锁&不可重入锁 6.公平锁&非公平锁 2.CAS 1.什么是CAS 2.CAS的应用 1.实现原子类 2.实现自旋锁 3.synchronized用到的锁策略 1.s…

RobotFramework +appium实现Android自动化

环境准备 1、已安装python37版本&#xff08;SDK、JDK均已安装完成&#xff0c;且环境变量都配置好了&#xff09;。 2、已安装robotframework。 3、已安装安卓模拟器&#xff08;本文使用夜神模拟器&#xff09;。 4、安装appium&#xff08;下载地址&#xff1a;http://6…

立创梁山派学习笔记——GPIO输出控制

梁山派 前言开发板简介GD32F407ZGT6官方资源数据手册1.系统框图2. 引脚复用表3.命名规则4.其他 用户手册固件库与PACK包 开发环境搭建立创官方的资料包资料齐活&#xff0c;开发1.工程搭建2.使用寄存器点亮LEDGPIO数量LED的GPIO口GPIO的配置流程GPIO的寄存器1.端口控制寄存器&a…

假如你是一位测试主管,如何判断一名测试工程师是否优秀?

假如你是一位测试主管&#xff0c;去评价一名测试工程师是否优秀&#xff0c;那么你将如何去判断呢&#xff1f;你最看重的是哪方面的能力呢&#xff1f; 对于这个问题&#xff0c;是不能一概而论的&#xff0c;要分为两种情况&#xff0c;情况不同&#xff0c;答案一定是不同…

自媒体素材哪里找?这5个网站告诉你答案。

做自媒体最需要的就是各种视频、配乐、图片等素材了。想要图文好&#xff0c;那就必须要一个好封面图。想要视频好&#xff0c;那就必须要有好的素材和配乐。 那要如何找到这些素材&#xff1f;看这几个网站就够了。 1、菜鸟图库 https://www.sucai999.com/video.html?vNTY…

基于Kubernetes集群构建大中型企业CICD应用平台(1)-- devOps

一、DevOps介绍 软件开发最开始是由两个团队组成&#xff1a; 开发计划由开发团队从头开始设计和整体系统的构建。需要系统不停的迭代更新。 运维团队将开发团队的Code进行测试后部署上线。希望系统稳定安全运行。 这看似两个目标不同的团队需要协同完成一个软件的开发。 …

【游戏逆向】《创世战车》玩家遍历分析

对于这种FPS游戏来说&#xff0c;玩家的血量并不是很关键&#xff0c;不过想分析玩家对象内的其他信息&#xff0c;还是要从血量作为突破口的。 但是由于试驾场是很少有发包的&#xff0c;包括战车的攻击等等&#xff0c;所以只能通过正常匹配战斗进行扫描。又由于匹配模式中没…

局域网会议软件

局域网会议软件怎么选&#xff1f;连通宝视频会议系统&#xff0c;当然也可以从以下维度进行视频会议选择。 1、部署简单方便连通宝视频会议系统部署简单&#xff0c;五分钟部署专业级的视频会议系统&#xff0c;系统支持主流视频会议设备&#xff0c;支持桌面型会议、机顶盒型…

字节面试挂在2面,复盘总结了经验,决定再战一次.....

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

算法修炼之练气篇——练气十一层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

【2023 阿里云云计算工程师 ACP 认证练习题库】01、VPC 专有网络题库

目录 一、多选题 1 1 答案与解析 2 2 答案与解析 3 ​3 答案与解析 辑 4 4 答案与解析 5 5 答案与解析 6 ​6 答案与解析 7 7 答案与解析 8 ​8 答案与解析 9 ​9 答案与解析 10 ​10 答案与解析 11 ​11 答案与解析 12 ​12 答案与解析 13 ​13…

HTB靶机011-Node-WP

11-Node 10.10.10.58 1、PortScan 上来端口扫描&#xff0c;masscan扫全端口&#xff0c;nmap快速扫前100端口 ┌──(xavier㉿kali)-[~] └─$ sudo masscan 10.10.10.58 -p1-65535 -e tun0 --max-rate 500┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 -F 10.10.10.…

需求、测试用例、BUG、软件的生命周期开发模型(瀑布、螺旋、增量迭代、敏捷)和测试模型(V模型和W模型)【详细介绍】

本篇文章将详细介绍测试中的相关概念&#xff08;需求、BUG、测试用例&#xff09;以及常见的开发模型和测试模型。 目录 一、需求 1.需求的定义 2.需求的产生 3.测试人员眼中的需求 练习&#xff1a;将“删除微信聊天记录功能是否正常”的需求拆分成子需求&#xff08;测…

Google I/O 2023 - Flutter 3.10 发布

核心部分原文链接&#xff1a;https://medium.com/flutter/whats-new-in-flutter-3-10-b21db2c38c73 Flutter 3.10 主要包括有对 Web、mobile、graphics、安全性等方面的相关改进&#xff0c;核心其实就是&#xff1a; iOS 默认使用了 Impeller 一堆新的 Material 3 控件袭来…

Redis(9)分布式锁(2)

主从复制主节点宕机导致锁失效问题 主节点会不断的把自己的数据传递给从节点&#xff0c;来保证主节点的数据和从节点的数据是相等的&#xff0c; 毕竟不是在同一台机器&#xff0c;主和从之间会存在一定的延时&#xff0c;主从同步也会存在一定的延时 1)现在有一个线程1来进行…

人工智能引发了科学研究的革命

人工智能引发了科学研究的革命 科学研究从第一&#xff0c;第二范式&#xff0c;升级到第三范式 趣讲大白话&#xff1a;人工智能成精了 【趣讲信息科技162期】 **************************** 国内顶尖的AI专家陆奇总结 科学研究的五个范式 1、经验主义&#xff08;比如中医&am…