当前位置: 首页 > news >正文

老年大学网站建设北京手机版建站系统开发

老年大学网站建设,北京手机版建站系统开发,西宁哪家网络公司做网站好,2021年最新的网站在React开发中#xff0c;组件间的通信是一个核心话题。虽然props和state能够处理大部分场景#xff0c;但有时我们需要更直接的方式来操作子组件。今天我们来深入探讨两个强大的React Hook#xff1a;forwardRef和useImperativeHandle。 forwardRef#xff1a;传递引用的… 在React开发中组件间的通信是一个核心话题。虽然props和state能够处理大部分场景但有时我们需要更直接的方式来操作子组件。今天我们来深入探讨两个强大的React HookforwardRef和useImperativeHandle。 forwardRef传递引用的桥梁 什么是forwardRef forwardRef是React提供的一个高阶组件它允许组件将ref传递给其子组件。在正常情况下ref只能用于DOM元素或类组件但通过forwardRef我们可以让函数组件也能接收和转发ref。 基本语法 const MyComponent React.forwardRef((props, ref) {return div ref{ref}Hello World/div; });实际应用场景 场景1封装输入组件 import React, { forwardRef, useRef } from react;const CustomInput forwardRef((props, ref) {return (div classNameinput-wrapperlabel{props.label}/labelinputref{ref}type{props.type || text}placeholder{props.placeholder}{...props}//div); });// 使用示例 function App() {const inputRef useRef(null);const focusInput () {inputRef.current?.focus();};return (divCustomInputref{inputRef}label用户名placeholder请输入用户名/button onClick{focusInput}聚焦输入框/button/div); }场景2组件库开发 在开发组件库时forwardRef特别有用因为用户可能需要直接访问底层DOM元素 const Button forwardRef(({ children, variant primary, ...props }, ref) {return (buttonref{ref}className{btn btn-${variant}}{...props}{children}/button); });useImperativeHandle精确控制暴露的接口 什么是useImperativeHandle useImperativeHandle允许我们自定义通过ref暴露给父组件的实例值。它通常与forwardRef一起使用让我们能够精确控制哪些方法和属性对外可见。 基本语法 useImperativeHandle(ref, createHandle, [deps])ref从forwardRef传入的refcreateHandle返回暴露值的函数deps依赖数组可选 高级应用场景 场景1可控制的媒体播放器 import React, { forwardRef, useImperativeHandle, useRef, useState } from react;const VideoPlayer forwardRef((props, ref) {const videoRef useRef(null);const [isPlaying, setIsPlaying] useState(false);const [currentTime, setCurrentTime] useState(0);useImperativeHandle(ref, () ({play: () {videoRef.current?.play();setIsPlaying(true);},pause: () {videoRef.current?.pause();setIsPlaying(false);},seek: (time) {if (videoRef.current) {videoRef.current.currentTime time;setCurrentTime(time);}},getCurrentTime: () currentTime,isPlaying: () isPlaying,getDuration: () videoRef.current?.duration || 0}), [isPlaying, currentTime]);return (videoref{videoRef}src{props.src}onTimeUpdate{(e) setCurrentTime(e.target.currentTime)}style{{ width: 100%, height: auto }}/); });// 使用示例 function MediaController() {const playerRef useRef(null);const handlePlay () playerRef.current?.play();const handlePause () playerRef.current?.pause();const handleSeek () playerRef.current?.seek(30);return (divVideoPlayer ref{playerRef} src/video.mp4 /divbutton onClick{handlePlay}播放/buttonbutton onClick{handlePause}暂停/buttonbutton onClick{handleSeek}跳转到30秒/button/div/div); }场景2表单验证组件 const ValidatedInput forwardRef(({ validation, ...props }, ref) {const [value, setValue] useState();const [error, setError] useState();const inputRef useRef(null);const validate () {if (validation) {const result validation(value);setError(result.error || );return result.isValid;}return true;};useImperativeHandle(ref, () ({validate,focus: () inputRef.current?.focus(),getValue: () value,setValue: (newValue) setValue(newValue),clearError: () setError(),hasError: () !!error}));return (divinputref{inputRef}value{value}onChange{(e) setValue(e.target.value)}onBlur{validate}{...props}/{error span classNameerror{error}/span}/div); });// 使用示例 function RegistrationForm() {const emailRef useRef(null);const passwordRef useRef(null);const handleSubmit (e) {e.preventDefault();const emailValid emailRef.current?.validate();const passwordValid passwordRef.current?.validate();if (emailValid passwordValid) {console.log(表单提交成功);} else {console.log(表单验证失败);}};return (form onSubmit{handleSubmit}ValidatedInputref{emailRef}typeemailplaceholder邮箱validation{(value) ({isValid: /^[^\s][^\s]\.[^\s]$/.test(value),error: /^[^\s][^\s]\.[^\s]$/.test(value) ? : 请输入有效邮箱})}/ValidatedInputref{passwordRef}typepasswordplaceholder密码validation{(value) ({isValid: value.length 6,error: value.length 6 ? : 密码至少6位})}/button typesubmit注册/button/form); }最佳实践和注意事项 1. 避免过度使用 虽然这两个Hook很强大但不应该成为组件通信的首选方案。优先考虑props和callback的方式 // ❌ 过度使用imperative方式 const BadExample forwardRef((props, ref) {useImperativeHandle(ref, () ({updateData: (data) setData(data),showModal: () setModalVisible(true),hideModal: () setModalVisible(false)}));// ... });// ✅ 更好的声明式方式 const GoodExample ({ data, modalVisible, onDataChange, onModalToggle }) {// ... };2. 合理命名和文档化 const DataTable forwardRef((props, ref) {useImperativeHandle(ref, () ({// 清晰的方法命名refreshData: () fetchData(),exportToCSV: () exportData(csv),exportToExcel: () exportData(excel),selectAllRows: () setSelectedRows(allRows),clearSelection: () setSelectedRows([])})); });3. 性能优化 使用依赖数组来避免不必要的重新创建 useImperativeHandle(ref, () ({someMethod: () {// 方法实现} }), [dependency1, dependency2]); // 添加依赖数组4. TypeScript支持 interface VideoPlayerRef {play: () void;pause: () void;seek: (time: number) void;getCurrentTime: () number; }const VideoPlayer forwardRefVideoPlayerRef, VideoPlayerProps((props, ref) {// 实现 });
http://www.dnsts.com.cn/news/135019.html

相关文章:

  • 建设一个营销型网站用dw做的网站怎么发布
  • 苏中建设 官方网站网络网站开发培训
  • 淘客返利网站建设网页设计分为几个部分
  • 软件项目管理考试题及答案优化稳定网站排名
  • 大连装修网站推广长沙企业推广
  • 福州建站网络公司比特币交易网站可以做空吗
  • 网站开发团队简介如何写织梦响应式网站
  • 部队网站建设招标wordpress安装不了插件吗
  • 制作小网站免费软件下载app
  • 宁波网站建设公司信息查询吉安做网站
  • 网站开发费用构成网站搜索 收录优化
  • 纯文本网站做seo是要先有网站吗
  • 国外开源网站建设软件查企业的app软件 排名
  • 网站建设分金手指排名二九邢台营销型网站制作
  • 宁波网站建设风格公司宣传策划方案
  • 一流的基础微网站开发公司的网站建设费进入什么科目
  • 电子商城网站开发项目描述洪梅镇做网站
  • 做用户名和密码网站页面常州中小企业网站制作
  • 昆明网站建设哪家强网站编程
  • saas建站 彩页佛山做外贸网站代理商
  • 开不锈钢公司怎么做网站网站推广常用的方法
  • 做网站的经验和体会湖北专业的网瘾戒除学校有哪些
  • 济南专业网站开发公司下载整个网站的软件
  • 电影海报模板哪个网站好首页通知书
  • 网站后台 批量上传小程序管理平台登陆
  • 南充公司网站建设互联网创业项目什么赚钱
  • 可以做公众号封面图的网站织梦做网站好不好
  • 门户网站建设的书籍wordpress手机端图片
  • 潍坊高端模板建站仿亿欧网wordpress
  • 江苏企业建网站排名优化百度搜索app免费下载