考虑 React 中模式实现的最佳实践

   2023-02-08 学习力0
核心提示:模态实现在有限元开发中无处不在,随着需求和模态数量的增加,实现变得复杂,很多人对设计感到厌烦。所以我想到了模态实现的最佳实践设计方针我决定为 Recoil 和状态管理的模态逻辑制作自定义钩子。使用 Recoil 的原因是 Recoil 提供的状态管理的atomFamily

模态实现在有限元开发中无处不在,随着需求和模态数量的增加,实现变得复杂,很多人对设计感到厌烦。
所以我想到了模态实现的最佳实践

设计方针

我决定为 Recoil 和状态管理的模态逻辑制作自定义钩子。
使用 Recoil 的原因是 Recoil 提供的状态管理的atomFamily 与模态实现非常兼容。

模态实现的反模式

主页.tsx
const MainPage = () => {
  const [isFaqVisible, setIsFaqVisible] = useState(false)

  return (
    <div>
      {isFaqVisible && <FaqModal />}
      <button onClick={() => setIsFaqVisible(true)}>
        クリックするとFAQモーダルが開くよ
      </button>
    </div>
  )
}

export default MainPage

虽然是一定的写法,但是如果像这样在同一个组件中有modal的开启和关闭状态,就会出现如下缺点

  • 由于打开和关闭以及显示状态完全依赖于组件,因此很难从另一个组件打开和关闭。特别是由于它预计会从FAQ modal等许多页面调用,它很可能成为意外错误的温床。
  • 随着要显示的模式数量的增加,状态也会增加,从而使代码的可预测性和可维护性降低。

解决方案

  • 打开/关闭状态和处理与自定义挂钩松散耦合
  • 通过atomFamily抽象模态状态,消除了状态的冗余描述

模态状态管理

src/states/modal.ts
import { atomFamily } from 'recoil'

export type ModalType =
  | 'contact'
  | 'faq'
  | 'confirm'
export const ModalVisibilityState = atomFamily({
  key: 'ModalVisibilityState',
  default: false,
})

这里,模态状态由ModalTypeatomFamily 抽象,具体取决于模态类型。

常见问题模式

FAQ.tsx
import Modal from 'components/Common/Modal'
import useModalWindow from 'hooks/useModalWindow'

const FaqModal = () => {
  const [isVisible, setIsVisible] = useModalWindow('faq')

  return (
    isVisible && (
      // propsにモーダルを閉じるcomponent
      <Modal closeModal={() => setIsVisible(false)}>{/*Modalの中身*/}</Modal>
    )
  )
}

export default FaqModal

关键是它可以在不知道调用者的打开/关闭状态的情况下通过仅显示/隐藏组件内部的关注点来实现。

模态自定义钩子

src/hooks/useModal.ts
import { useRecoilState, SetterOrUpdater } from 'recoil'
import { ModalVisibilityState, ModalType } from 'states/modal'

type Response = [
  boolean,
  SetterOrUpdater<boolean>
]

const useModalWindow = (modalType: ModalType): Response => {
  const [isVisible, setIsVisible] = useRecoilState(
    ModalVisibilityState(modalType)
  )

  return [isVisible, setIsVisible]
}

export default useModalWindow

atomFamily 创建的ModalVisibilityStateuseRecoilState 包裹,以创建唯一的状态并管理打开/关闭过程。
这样一来,就不用一一描述每个模态的状态了,会让人耳目一新
此外,通过将ModalType 作为参数传递,您可以从任何组件灵活地打开它。

要显示模态的组件

DisplayModalComponent.tsx
import React from 'react'
import FaqModal from 'components/Modal/FaqModal'

const DisplayModalComponent = () => {
  return (
   <FaqModal />
  )
}

export default DisplayModalComponent

您要调用模态的组件

CallModalComponent.tsx
import useModalWindow from 'hooks/useModalWindow'

const CallModalComponent = () => {
  const [, setIsVisible] = useModalWindow("faq")

  return (
    <button onClick={() => setIsVisible(true)}>
      クリックするとFAQモーダルが開くよ
    </button>
  )
}



export default CallModalComponent

拨打useModalWindow并点击按钮打开FAQ模式

考虑

我认为还有其他方法可以使用上下文或 RecoilRoot 来管理全局状态,但是这种编写方式更简洁,我认为这是我个人目前的最佳实践!


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623570.html

 
标签: TypeScript React Recoil
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • React , TypeScript,  CSS Module , Less , Antd 遇到的坑
    React , TypeScript, CSS Module , Less , Ant
    因为React 本身的脚手架自身在webpack中已经做了对CSS Module 的配置,因最近遇到了很多坑,所以从头整理了一遍 使用版本"react": "^16.13.1","antd": "^4.4.0","typescript": "~3.7.2","webpack": "4.42.0","less": "^3
    03-08
  • vscode 配置  typeScript+nodejs 和 react+typeScript 开发环境
    vscode 配置 typeScript+nodejs 和 react+type
     电脑环境:需要先安装好 1.  nodejs  (官网下载安装,安装8.0以上版本, 使用 node --version 查看是否安装成功)2.  npm  (安装好node时跟着就安装好了npm,使用 npm -v 查看是否安装成功)3.  typescript  (打开终端命令,输入 npm install -g t
    03-08
  • React 与 Hooks 如何使用 TypeScript 书写类型
    本文写于 2020 年 9 月 20 日函数组件与 TS对于 Hooks 来说是不支持使用 class 组件的。如何在函数组件中使用 TS 呢?首先定然是函数的类型,我们需要告诉 TS,这个函数他是个 React 组件。如果是 JavaScript,我们会这么写函数组件:import React from 'reac
    03-08
  • React中常见的TypeScript定义实战教程
    React中常见的TypeScript定义实战教程
    目录一 引沿二 什么是调和三 什么是Filber四 实现调和的过程五 总结一 引沿Fiber 架构是React16中引入的新概念,目的就是解决大型 React 应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是React的虚拟D
    03-08
  • Vue3+TypeScript 项目中,配置 ESLint 和 Prett
    接上篇:从0搭建vite-vue3-ts项目框架:配置less+svg+pinia+vant+axios文档同步项目gitee:https://gitee.com/lixin_ajax/vue3-vite-ts-pinia-vant-less.git 一、Eslint:用于检测代码安装eslint相关依赖yarn add eslint eslint-plugin-vue @typescript-esli
    03-08
  • Angular6 + Typescript 项目中怎么引用包装到j
    Angular6 + Typescript项目中用到了一个包含到jquery里面的插件 fontIconPickerhttps://github.com/fontIconPicker/fontIconPickerhttps://codeb.it/fonticonpicker/首先根据github上面的readme 安装 jquery 和 fonticonpickernpm install jquery@1.12.4 @fo
    03-08
  • typescript + echarts-for-react 制作渐变柱状图, 提示[ts] 类型“Graphic”上不存在属性“LinearGradient”
    typescript + echarts-for-react 制作渐变柱状
     更新: 2019/03 无意间发现Graphic上已有 LinearGradient属性 ???????????? 效果如图: 是不是比较炫~遇到的问题:@types/echart 到目前只到 v4.1.1,类型“Graphic”上没有 LinearGradient属性tslint提示:color: new echarts.graphic中没有LinearGra
    03-08
  • 基于Vue3+TypeScript的全局对象的注入和使用详解
    基于Vue3+TypeScript的全局对象的注入和使用详
    目录1、Vue2的全局挂载2、Vue3+TypeScript的全局挂载3、Vue3+TypeScript的全局挂载的对象接口定义刚完成一些前端项目的开发,腾出精力来总结一些前端开发的技术点,以及继续完善基于SqlSugar的开发框架循序渐进介绍的系列文章,本篇随笔主要介绍一下基于Vue3+
    03-08
  • vue3+vite引入插件unplugin-auto-import的方法 vite vue3 typescript
    vue3+vite引入插件unplugin-auto-import的方法
    自动引入 composition api,不需要再手动引入。github地址:https://github.com/antfu/unplugin-auto-import下载npm i unplugin-auto-import -D修改vite.config.ts文件import AutoImport from 'unplugin-auto-import/vite'export default defineConfig({plugi
    03-08
  • React+umi+typeScript创建项目的过程 react typescript 教程
    React+umi+typeScript创建项目的过程 react typ
    目录项目框架搭建的方式react脚手架Ant-design官网一、安装方式npm二、安装方式yarn三、安装方式umi dev项目框架搭建的方式react脚手架命令行:npx create-react-app myReactName项目目录结构:浏览器运行,端口号3000:Ant-design官网一、安装方式npm前提:r
    03-08
点击排行