iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React项目中hook怎么实现展示对话框功能
  • 799
分享到

React项目中hook怎么实现展示对话框功能

2023-06-30 13:06:39 799人浏览 八月长安
摘要

这篇文章主要介绍“React项目中hook怎么实现展示对话框功能”,在日常操作中,相信很多人在React项目中hook怎么实现展示对话框功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React项目中hoo

这篇文章主要介绍“React项目中hook怎么实现展示对话框功能”,在日常操作中,相信很多人在React项目中hook怎么实现展示对话框功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React项目中hook怎么实现展示对话框功能”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

React中使用对话框并不容易,主要因为:

  1. 对话框需要在父组件中声明,才能在子组件中控制其是否显示

  2. 给对话框传递参数只能由props传入,这意味着所有状态管理都必须在更高阶的组件中。而实际上这个对话框的参数只在子组件中才会维护。这时就需要我们使用自定义事件将参数传回

这些问题的本质就是:如何用一个统一的方式去管理对话框,从而让对话框相关的业务逻辑更加模块化,以及和其他业务逻辑进行解耦。

下面的方式只是经验总结,并不是唯一或者最佳实现:

思路:使用全局状态管理所有对话框

对话框本质上是独立于其他界面的一个窗口,用于完成一个独立的功能。

所以,定义一个对话框,定位等价于定义一个具有唯一URL路径的页面。只是前者由弹出层实现,后者是页面的切换。

对话框UI弹出过程和页面URL的切换非常类似,那么我们就可以给每一个对话框定义一个全局唯一的ID,然后通过这个ID去显示或者隐藏一个对话框,并且给它传递参数。

尝试设计一个api去做对话框的全局管理

假设我们实现的对话框为NiceModal,那么我们的目标是如下去使用:

const UserInfoModal = NiceModal.create(    'user-info-modal',    RealUserInfoModal) // 创建一个useNiceModal 这样的hook去获取某个id的对话框的操作对象const modal = useNiceModal('user-info-modal') // 通过 modal.show 显示一个对话框,并能够给它传递参数modal.show(args)modal.hide()

可以看到,如果有这样的API,那么无论在哪个层级的组件,只要知道某个Modal的ID,那么就都可以统一使用这些对话框,而不再需要考虑该在哪个层级的组件去定义了。

实现:创建NiceModal组件和相关API

创建一个处理所有对话框的action creator 和 reducer

function showModal(modalId, args) {    return {        type: "nice-modal/show",        payload: {            modalId,            args        }    }} function hideModal(modalId, force) {    return {        type: "nice-modal/hide",        payload: {            modalId,            force        }    }}
const modalReducer = (state = { hiding: {} }, action) {    switch (action.type) {        case "nice-modal/show":            const {modalId, args} = action.payload            return {                ...state,                // 如果存在 modalId 对应的状态(即args),就显示这个对话框                // 只要有参数就认为对话框应该显示,如果没有传递args,在reducer中使用默认值true                [modalId]: args || true,                // 定义一个hiding 状态, 用于处理对话框关闭动画                hiding: {                    ...state.hiding,                    [modalId]: false,                }            }        case "nice-modal/hide":            const { modalId, force: boolean } = action.payload            // 只有force时才真正移除对话框,否则就是隐藏中hiding            return action.payload.force                 ? {                    ...state,                    [modalId]: false,                    hiding: { [modalId]: false }                  }                : { ...state, hiding: { [modalId]: true } }            default:                return state    }}

这段代码的主要思路就是通过Redux的store去存储每个对话框状态和参数。在这里设计了两个action,分别显示和隐藏对话框。

特别注意的是,这里加入了hiding这样的一个状态,用来处理对话框关闭过程动画。

根据使用顺序,首先实现 createNiceModal,

使用容器模式,在对话框不可见时直接返回null,从而不渲染任何内容,

确保即使页面上定义了100个对话框,也不会影响性能。

createNiceModal = (modalId, Comp) => {    return (props) => {        const { visible, args } = useNiceModal(modalId)        if (!visible) return null        return <Comp {...args} {...props} />    }} // 使用const MyModal = createNiceModal('my-modal', () => {    return (        <NiceModal id="my-modal" title="Nice modal">            Hello NiceModal        </NiceModal>    )})

实现useNiceModal,根据id,封装一些逻辑。

让Redux的action使用起来更方便,在其内部封装对store的操作,从而实现对话框状态管理的逻辑重用。

const modalCallbacks = {} const useNiceModal = (modalId) => {    const dispatch = useDispatch()     // 封装Redux action 用于显示对话框    const show = useCallback(        (args) => {            dispatch(showModal(modalId, args))        },        [dispatch, modalId]    )        // 封装Redux action 用于隐藏对话框 (force: boolean)    const hide = useCallback(        (force) => {            dispatch(hideModal(modalId, force))        },        [dispatch, modalId]    )     const args = useSelector((s) => s[modalId])    const hiding = useSelector((s) => s.hiding[modalId])     // 只要有参数就认为对话框应该显示,如果没有传递args,在reducer中使用默认值true    return { args, hiding, visible: !!args, show, hide }}

这样,我们就实现了一个NiceModal这样的全局对话管理框架

这样使用:

import { Button } from 'antd'import NiceModal, {    createNiceModal,    useNiceModal} from "./NiceModal" const MyModal = createNiceModal("my-modal", () => {    return (        <NiceModal id="my-modal" title="Nice Modal">            Hello World        </NiceModal>    )}) function MyModalExample() {    const modal = useNiceModal("my-modal")    return (        <>            <Button type="primary" onClick={() => modal.show()}>                Show my modal            </Button>            <MyModal />        </>    )}

处理对话框的返回值

如果说对话框和页面这两种UI模式基本上是一致的,都是独立窗口完成独立逻辑。但是在用户交互上,有一定的差别:

  • 对话框可能需要返回值给调用者

  • 而页面切换一般不会关心页面执行的结果是什么

基于上面的NiceModal实现逻辑,现在考虑如何让调用者获得返回值。

我们可以把用户在对话框中的操作看成一个异步操作逻辑,那么用户在完成对话框中内容的操作后,就认为异步操作逻辑完成了。因此我们可以利用Promise来完成这样的逻辑。

那么,我们要实现的API如下:

const modal = useNiceModal('my-modal')// 实现一个 promise API 来处理返回值modal.show(args).then(res => {})

事实上,要实现这样一个机制并不困难,就是在 useNiceModal 这个 Hook 的实现中提供一个 modal.resolve 这样的方法,能够去 resolve modal.show 返回的 Promise。

代码的核心思路就是将show 和 resolve 两个函数通过 Promise 联系起来。因此两个函数调用位置不一样,所以我们使用一个局部的临时变量,来存放resolve回调函数。

// 使用一个 object 缓存 promise 的 resolve 回调函数const modalCallbacks = {};export const useNiceModal = (modalId) => {  const dispatch = useDispatch();  const show = useCallback(    (args) => {      return new Promise((resolve) => {        // 显示对话框时,返回 promise 并且将 resolve 方法临时存起来        modalCallbacks[modalId] = resolve;        dispatch(showModal(modalId, args));      });    },    [dispatch, modalId],  );  const resolve = useCallback(    (args) => {      if (modalCallbacks[modalId]) {        // 如果存在 resolve 回调函数,那么就调用        modalCallbacks[modalId](args);        // 确保只能 resolve 一次        delete modalCallbacks[modalId];      }    },    [modalId],  );    // 其它逻辑...   // 将 resolve 也作为返回值的一部分  return { show, hide, resolve, visible, hiding };};

到此,关于“React项目中hook怎么实现展示对话框功能”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: React项目中hook怎么实现展示对话框功能

本文链接: https://www.lsjlt.com/news/329254.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React项目中hook实现展示对话框功能
    目录思路:使用全局状态管理所有对话框尝试设计一个API去做对话框的全局管理实现:创建NiceModal组件和相关API处理对话框的返回值总结React中使用对话框并不容易,主要因为:...
    99+
    2024-04-02
  • React项目中hook怎么实现展示对话框功能
    这篇文章主要介绍“React项目中hook怎么实现展示对话框功能”,在日常操作中,相信很多人在React项目中hook怎么实现展示对话框功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React项目中hoo...
    99+
    2023-06-30
  • J2ME中怎么实现对话框选择功能
    这期内容当中小编将会给大家带来有关J2ME中怎么实现对话框选择功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。J2ME实现对话框选择功能在手机这么小的屏幕上开发使用,难...
    99+
    2024-04-02
  • PHP怎么实现弹出对话框功能
    这篇文章主要介绍“PHP怎么实现弹出对话框功能”,在日常操作中,相信很多人在PHP怎么实现弹出对话框功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP怎么实现弹出对话框功能”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-17
  • 怎么利用Qt实现可扩展对话框
    这篇文章主要介绍“怎么利用Qt实现可扩展对话框”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么利用Qt实现可扩展对话框”文章能帮助大家解决问题。可扩展对话框通常用于用户对界面有不同要求的场合。通常...
    99+
    2023-07-02
  • Android开发中怎么实现一个对话框交互功能
    本篇文章给大家分享的是有关Android开发中怎么实现一个对话框交互功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 在Android SDK中,虽然有许多的窗口,有些类似M...
    99+
    2023-05-31
    android roi
  • Android中怎么实现对话框
    这篇文章将为大家详细讲解有关Android中怎么实现对话框,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1 弹出普通对话框 --- 系统更新 //弹出普通对话框 &nbs...
    99+
    2023-05-30
    android
  • 怎么在Android应用中利用控件实现一个对话框功能
    怎么在Android应用中利用控件实现一个对话框功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。自定义提示对话框DialogM.Builder builder&nb...
    99+
    2023-05-31
    android roi
  • 如何在Android中利用Dialog实现一个对话框功能
    今天就跟大家聊聊有关如何在Android中利用Dialog实现一个对话框功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、普通对话框AlertDialog.Builder bui...
    99+
    2023-05-31
    android dialog roi
  • react项目中使用react-dnd实现列表的拖拽排序功能
    目录1.先安装依赖2.创建一个 index.js 文件3.新建example.js文件4.新建TopicLis.js文件5.新建 ItemTypes.js现在有一个新需求就是需要对一...
    99+
    2023-02-06
    react-dnd列表的拖拽排序 react-dnd拖拽排序 react拖拽排序
  • 怎么在Android中实现一个对话框
    怎么在Android中实现一个对话框?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。2个按钮public class MainActivity ...
    99+
    2023-05-30
    android
  • 在Android应用中使用AlertDialog对话框可以实现哪些功能
    今天就跟大家聊聊有关在Android应用中使用AlertDialog对话框可以实现哪些功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用的Dialog有确认对话框,单选按钮对话框...
    99+
    2023-05-31
    android alertdialog roi
  • 怎么在Java项目中实现一个分页功能
    怎么在Java项目中实现一个分页功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。分页对象public class PageUtils imp...
    99+
    2023-05-31
    java ava 目中
  • 怎么在html5项目中实现一个录音功能
    这篇文章给大家介绍怎么在html5项目中实现一个录音功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。步骤1由于新的api是通过navigator.mediaDevices.getUserMedia,且返回一个prom...
    99+
    2023-06-09
  • vue项目中怎么使用canvas实现截图功能
    本文小编为大家详细介绍“vue项目中怎么使用canvas实现截图功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中怎么使用canvas实现截图功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现效...
    99+
    2023-07-02
  • Android开发中怎么实现一个多图展示功能
    这篇文章将为大家详细讲解有关Android开发中怎么实现一个多图展示功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。.使用方法引用:compile 'com.w4lle.libra...
    99+
    2023-05-31
    android roi
  • vue列表单项展开收缩功能怎么实现
    这篇文章主要讲解了“vue列表单项展开收缩功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue列表单项展开收缩功能怎么实现”吧!代码逻辑###template部分:已去除与本文不...
    99+
    2023-07-04
  • Android 13.0 framework中实现默认长按电源键弹出关机对话框功能
    1.前言 在13.0的系统定制化开发中,在12.0的系统之前默认的都是长按电源键弹出关机对话框,而在13以后 就改成音量+电源键弹出对话框,由于使用不方便,所以就改成默认长按弹出关机对话框功能 2.framework中实现默认长按电源键弹出...
    99+
    2023-09-01
    android power长按电源键 framework java 电源键
  • 怎么在java项目中实现一个选择排序功能
    本篇文章为大家展示了怎么在java项目中实现一个选择排序功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、基本概念      每趟从待排序的记录...
    99+
    2023-05-31
    java 选择排序 ava
  • JavaWeb项目中怎么实现一个响应式下载功能
    今天就跟大家聊聊有关JavaWeb项目中怎么实现一个响应式下载功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。主要部分的代码<a href = ...
    99+
    2023-05-31
    javaweb ava 目中
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作