首页 > 其他分享 >掌握 React 中的 useImperativeHandle(使用 TypeScript)

掌握 React 中的 useImperativeHandle(使用 TypeScript)

时间:2024-09-26 20:37:00浏览次数:1  
标签:TypeScript useImperativeHandle 自定义 api useimperativehandle React gt 组件 ref

使用 typescript 构建 react 应用程序时,开发人员经常遇到需要创建具有高级功能的自定义、可重用组件的场景。本文将探讨两个强大的概念:用于对引用管理进行细粒度控制的 useimperativehandle 挂钩,以及创建表单验证和模态组件等自定义组件。我们将深入探讨:useimperativehandle 钩子:它的作用、何时使用它以及它如何允许您自定义父组件可以访问的 ref 值。创建表单验证组件:使用 typescript 构建可重用组件进行表单验证的实际示例。实现模态组件:另一个示例展示如何使用 typescript 创建交互式且可重用的模态。这些示例将帮助初学者了解如何利用 typescript 构建交互式和可重用的组件,同时探索引用管理等高级概念。读完本文后,您将为在 react 应用程序中创建强大的自定义组件奠定坚实的基础。 什么是 useimperativehandle?useimperativehandle 是 react 中的一个钩子,允许您自定义父组件可以访问的 ref 对象。当您想要向父组件公开自定义 api,而不是公开组件的内部实现细节时,这非常有用。 何时以及为何应该使用它在大多数情况下,useref 提供了足够的功能来访问 dom 元素或组件实例。但是,当您需要更多控制时,useimperativehandle 就会介入,提供一种仅向父组件公开您选择的方法或状态的方法。这可以确保您的组件保持模块化、封装性并且更易于维护。该钩子还允许更好的抽象,这意味着您可以在应用程序中以最少的重复重复使用组件。 示例 1 - 拨动开关组件此示例演示了如何使用 typescript 创建切换开关组件。组件使用 useimperativehandle 向父组件公开自定义 api,允许父组件控制开关状态。用例:创建可由父组件控制的自定义切换开关组件。实施:定义组件并使用 useimperativehandle 公开自定义 api。在父组件中创建一个 ref 并将其传递给 toggleswitch 组件。使用ref调用自定义api并控制开关状态。import react, { forwardref, `useimperativehandle`, usestate } from "react";interface toggleref { toggle: () =&gt; void; getstate: () =&gt; boolean;}type toggleswitchprops = { initialstate?: boolean;};const toggleswitch = forwardref<toggleref toggleswitchprops>((props, ref) =&gt; { const [istoggled, setistoggled] = usestate(props.initialstate ?? false); `useimperativehandle`(ref, () =&gt; ({ toggle: () =&gt; setistoggled(!istoggled), getstate: () =&gt; istoggled, })); return ( <motion.button onclick="{()"> setistoggled(!istoggled)} classname="flex items-center justify-start w-12 h-6 p-1 overflow-hidden bg-gray-300 rounded-full" animate={{ backgroundcolor: istoggled ? "#4caf50" : "#f44336", }} transition={{ duration: 0.3 }} &gt; <motion.div classname="flex items-center justify-center w-5 h-5 bg-white rounded-full" animate="{{" x: istoggled : transition="{{" type: stiffness: damping:></motion.div></motion.button> );});function example() { const toggleref = useref<toggleref>(null); return ( <div classname="flex flex-col items-center justify-center h-screen gap-4"> <section classname="flex flex-row items-center justify-center w-full py-4 border border-gray-200 rounded-md gap-x-4"><toggleswitch ref="{toggleref}"></toggleswitch><button onclick="{()"> toggleref.current?.toggle()} classname="px-4 py-2 text-white bg-blue-500 rounded-md" &gt; toggle switch </button> </section></div> );}</toggleref></toggleref>登录后复制 示例 2 - 手风琴组件此示例演示了如何使用 typescript 创建手风琴组件。该组件使用 useimperativehandle 向父组件公开自定义 api,允许父组件控制折叠状态。用例:创建可由父组件控制的自定义手风琴组件。实施:定义组件并使用 useimperativehandle 公开自定义 api。在父组件中创建一个 ref 并将其传递给 accordion 组件。使用ref调用自定义api并控制accordion状态。interface AccordionRef { expand: () =&gt; void; collapse: () =&gt; void; isExpanded: () =&gt; boolean; toggle: () =&gt; void;}type AccordionProps = { initialState?: boolean; title: string; content: ReactNode;};const Accordion = forwardRef<accordionref accordionprops>((props, ref) =&gt; { const [expanded, setExpanded] = useState(props.initialState ?? false); `useImperativeHandle`(ref, () =&gt; ({ expand: () =&gt; setExpanded(true), collapse: () =&gt; setExpanded(false), isExpanded: () =&gt; expanded, toggle: () =&gt; setExpanded((prev) =&gt; !prev), })); const handleToggle = () =&gt; { setExpanded((prev) =&gt; !prev); }; return ( <div classname="overflow-hidden border border-gray-200 rounded-md w-ful"> <motion.button classname="w-full px-4 py-2 text-left bg-gray-100 hover:bg-gray-200" onclick="{handleToggle}" initial="{false}" animate="{{" backgroundcolor: expanded :> {props.title} </motion.button><animatepresence initial="{false}"> {expanded &amp;&amp; ( <motion.div initial="collapsed" animate="expanded" exit="collapsed" variants="{{" expanded: opacity: height: collapsed: transition="{{" duration: ease:><div classname="p-4 bg-white">{props.content}</div> </motion.div> )} </animatepresence></div> );});function Example() { const accordionRef = useRef<accordionref>(null); return ( <div classname="flex flex-col items-center justify-center h-screen gap-4"> <main classname="w-full px-4"><accordion ref="{accordionRef}" title="Click to expand" content="This is the accordion content. It can contain any text or elements."></accordion></main><button onclick="{()"> { accordionRef.current?.expand(); }} className="px-4 py-2 text-white bg-blue-500 rounded-md disabled:bg-gray-500" &gt; Expand Accordion </button> <button onclick="{()"> accordionRef.current?.collapse()} className="px-4 py-2 text-white bg-blue-500 rounded-md" &gt; Collapse Accordion </button> <button onclick="{()"> accordionRef.current?.toggle()} className="px-4 py-2 text-white bg-blue-500 rounded-md" &gt; Toggle Accordion </button> </div> );}</accordionref></accordionref>登录后复制 使用 useimperativehandle 的优点useimperativehandle 提供了一些关键的好处,特别是在构建可重用和交互式组件时:封装通过使用 useimperativehandle,您可以隐藏组件的内部实现细节,并仅公开您希望父级与之交互的方法。这可以确保您的组件保持其内部逻辑,而不受外部因素的影响,使其更加健壮。细粒度控制它使您可以对 ref 对象进行细粒度控制。您无需公开整个组件实例或 dom 节点,而是可以决定哪些方法或值可用。当使用表单、切换或模态等复杂组件时,这一点至关重要。提高可重用性通过抽象某些逻辑并控制向父级公开的内容,您的组件可以变得更加可重用。例如,表单验证组件或使用 useimperativehandle 构建的模式可以轻松地在具有不同配置的应用程序的多个部分中重用。清除父组件的 api您可以为父组件创建一个干净、定义良好的 api,而不是提供对整个组件的直接访问。这会减少错误并提高组件行为的可预测性。typescript 中更好的类型安全借助 typescript,useimperativehandle 变得更加强大。您可以定义父级可以使用的确切方法和属性,从而提高类型安全性并确保开发人员在使用组件时遵循预期的 api。 结论useimperativehandle 是一个强大的钩子,允许您自定义父组件可以访问的 ref 对象。当您想要向父组件公开自定义 api,而不是公开组件的内部实现细节时,这非常有用。通过使用useimperativehandle,您可以创建更灵活、更强大的自定义组件,这些组件可以轻松地被父组件重用和自定义。 资源react 文档 - useimperativehandlereact 文档 -forwardrefreact 文档 - usereftypescript 文档以上就是掌握 React 中的 useImperativeHandle(使用 TypeScript)的详细内容,更多请关注我的其它相关文章!

标签:TypeScript,useImperativeHandle,自定义,api,useimperativehandle,React,gt,组件,ref
From: https://www.cnblogs.com/aow054/p/18434270

相关文章

  • 掌握 React:提出伟大问题的艺术
    掌握React:提出伟大问题的艺术作为一名React开发人员,你可以培养的最有价值的技能之一就是提出好问题的能力。你不需要了解React的一切才能发挥作用,但你确实需要知道如何深思熟虑地处理问题。这项技能是优秀工程师与伟大工程师的区别。可视化:React组件树将您的React应......
  • 掌握 React Router Hooks:综合指南
    reactrouter是在react应用程序中处理导航的重要库。随着reactrouterv6中引入hooks,管理路由变得更加直观和强大。在这篇博文中,我们将探索五个关键的reactrouter钩子,它们可以提升你的路由游戏。1.usenavigate():轻松编程导航usenavigate钩子提供了一个函数,可以通......
  • 我如何修复 TypeScript 设置问题:类型请求中不存在属性用户
    问题我一直在使用typescript和express.js开发node.js项目。有一次,我需要将一个用户对象附加到expressrequest对象,但我遇到了这个typescript错误:类型“request”上不存在属性“user”。我很快意识到发生这种情况是因为express的默认request对象不包含用户属性,而typ......
  • 使用duxapp开发 React Native App 事半功倍
    Taro的ReactNative端开发提供了两种开发方式,一种是将壳和代码分离,一种是将壳和代码合并在一起开发壳是用来打包调试版或者发版安装包使用的代码是运行在壳上的js代码Taro壳子的代码仓库https://github.com/NervJS/taro-native-shellduxapp中更进一步,你不需要太关注壳子什么......
  • setup配置;ref与reactive
    setup配置Vue3中的setup函数接收两个参数,分别是props和context。1、props:值为对象,包含:组件外部传递过来。切组件内部声明接收了的属性。需要注意的是,Vue3中的props是只读的,即在setup函数中不能修改props的值。如果需要修改传递过来的数据,可以使用响应式对象或ref。2、......
  • 深入理解 JSX:构建 React 用户界面的利器
    目录一、JSX介绍1.JSX概念2.为什么使用JSX,JSX有什么好处?二、JSX基本语法1.基本元素: 2.嵌套元素:3.组件:4.属性: 5.表达式6.条件渲染:7.样式:三、JSX语法规则四、JSX编译过程五、JSX小案例1.待办事项列表2.计时器应用六、总结一、JSX介绍1.JSX概念    ......
  • react-router-dom嵌套路由实践
    想要通过react-router-dom实现类似vue的router-view的嵌套路由效果,在点击导航菜单时切换页面,官方文档是真的没找到相关内容,现做个总结:在createBrowserRouter的配置中配置给目标路由配置子路由;在目标组件的相应位置添加一个<Outlet/>作为子路由的组件渲染容器(Outlet组件类似vue......
  • 使用 Vue3、TypeScript 和 Spring Boot 实现文件上传至 MinIO 和 OSS
    目录《使用Vue3、TypeScript和SpringBoot实现文件上传至MinIO和OSS》一、技术选型二、环境搭建三、前端实现四、后端实现五、代码解析在现代web应用开发中,文件上传是一个常见的需求。本文将介绍如何使用Vue3、TypeScript和SpringBoot实现文件上传功能,并......
  • 豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏
    以下是「 豆包MarsCode 体验官」优秀文章,作者Find。背景在人工智能快速发展的时代,大模型(LLM)只要有足够的算力和数据就可以做到任何的事情,甚至可以模拟出另一个地球。LLM作为一个革命化的科技,可以取代很多岗位,甚至可以让人类达到“躺着领钱的时代”。Marscode作为一个新推出的IDE......
  • react之jsx基础(2)高频使用场景
    在React中,JSX的使用是非常广泛和高频的。以下是一些常见的高频使用场景及其示例,帮助你更好地理解JSX的实际应用:1.组件定义JSX最常见的用途之一是定义组件的结构。组件可以是函数组件或类组件,通常会使用JSX来描述组件的UI。函数组件示例:functionGreeting(props){......