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

【React】深入探索React:表单控制、组件通信、副作用管理、自定义Hook

一、React表单控制

表单控制是React应用中常见的需求,React Hooks提供了两种方式来实现:受控组件和非受控组件。

1.1 受控组件

受控组件是将表单输入的值保存在组件的状态中。这样,表单数据就完全由React控制。

import React, { useState } from 'react';function ControlledInput() {const [value, setValue] = useState('');const handleChange = (e) => {setValue(e.target.value);};return <input type="text" value={value} onChange={handleChange} />;
}

1.2 非受控组件

非受控组件不使用React的状态来控制输入值,而是通过直接操作DOM来获取输入值。

import React, { useRef } from 'react';function UncontrolledInput() {const inputRef = useRef(null);const handleChange = () => {console.log(inputRef.current.value);};return <input type="text" ref={inputRef} onChange={handleChange} />;
}

二、React组件通信

组件通信是React应用中另一个重要的概念,它允许不同组件之间进行数据交换。

2.1 父子通信

父子组件之间的通信可以通过props实现。

function ParentComponent() {const name = 'Parent Name';return <ChildComponent name={name} />;
}function ChildComponent(props) {return <div>{props.name}</div>;
}

2.2 子传父通信

子组件可以通过回调函数将数据传递给父组件。

function ParentComponent() {const getMsg = (msg) => console.log(msg);return <ChildComponent onGetMsg={getMsg} />;
}function ChildComponent({ onGetMsg }) {const handleClick = () => {onGetMsg('this is son msg');};return <button onClick={handleClick}>Send Message</button>;
}

2.3 兄弟组件通信

兄弟组件通信通常通过提升状态到它们共同的父组件来实现。

function ParentComponent() {const [name, setName] = useState('');const handleAName = (name) => {setName(name);};return (<><AComponent onGetAName={handleAName} /><BComponent name={name} /></>);
}function AComponent({ onGetAName }) {const handleClick = () => {onGetAName('A Component Name');};return <button onClick={handleClick}>Send A Name</button>;
}function BComponent({ name }) {return <div>B Component Name: {name}</div>;
}

2.4 跨层组件通信

跨层组件通信可以通过React的Context API实现。

import React, { createContext, useContext, useState } from 'react';const MsgContext = createContext();function DeepChildComponent() {const msg = useContext(MsgContext);return <div>{msg}</div>;
}function IntermediateComponent() {return <DeepChildComponent />;
}function ParentComponent() {const msg = 'Message from Parent';return (<MsgContext.Provider value={msg}><IntermediateComponent /></MsgContext.Provider>);
}

三、React副作用管理:useEffect

useEffect是React Hooks中用于处理副作用的函数,它可以在组件渲染后执行操作。

3.1 基本使用

import React, { useEffect, useState } from 'react';function ComponentWithEffect() {const [count, setCount] = useState(0);useEffect(() => {console.log('Component did mount and update');}, []); // 空依赖数组表示只在挂载时执行return (<div>Count: {count}</div>);
}

3.2 清除副作用

useEffect可以返回一个清除副作用的函数,通常用于定时器或订阅的清理。

function ComponentWithCleanup() {useEffect(() => {const timer = setInterval(() => {console.log('Timer tick');}, 1000);// 清除副作用return () => clearInterval(timer);}, []); // 空依赖数组return <div>Component with cleanup</div>;
}

四、自定义Hook实现

自定义Hooks允许你封装可复用的逻辑。

4.1 创建自定义Hook

import { useState, useCallback } from 'react';function useToggle(defaultValue) {const [value, setValue] = useState(defaultValue);const toggle = useCallback(() => {setValue(prevState => !prevState);}, []);return [value, toggle];
}

4.2 使用自定义Hook

function App() {const [isOn, toggleOn] = useToggle(true);return (<div>{isOn ? 'Toggle is ON' : 'Toggle is OFF'}<button onClick={toggleOn}>Toggle</button></div>);
}

4.3 React Hooks使用规则

  1. 只能在函数组件中使用:Hooks让你在不编写类的情况下使用state和其他React特性。
  2. 只能在顶层使用:不要在循环、条件判断或嵌套函数中调用Hooks。

结语

​ 通过本文的探索,我们了解到React Hooks提供了一种强大且灵活的方式来构建组件。无论是表单控制、组件通信,还是副作用管理,Hooks都提供了简洁的解决方案。自定义Hooks的引入更是让我们能够复用状态逻辑,编写更干净、更可维护的代码。掌握这些概念和技巧,将极大地提升你的React开发能力。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring Boot(八十二):SpringBoot通过rsa实现API加密
  • 基于深度学习算法,支持再学习功能,不断提升系统精准度的智慧地产开源了。
  • pdf格式过大怎么样变小 pdf文件过大如何缩小上传 超实用的简单方法
  • 百易云资产管理运营系统 comfileup.php 文件上传致RCE漏洞复现(XVE-2024-18154)
  • ChatGPT的原理和成本
  • 【YOLOv8系列】图像分类篇----通过YOLOv8实现图像分类功能
  • GPT-4o mini小型模型具备卓越的文本智能和多模态推理能力
  • 2024收集的scratch教程资源 少儿编程课程合集资源 50T
  • FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
  • 单元测试--Junit
  • 煤矿运输卡车4G/5G视频监控管理系统的应用与优势
  • 人工智能与机器学习原理精解【8】
  • Springboot:自定义过滤器
  • Java整理12
  • 独孤思维:减肥就跟赚钱一样痛苦
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 11111111
  • Idea+maven+scala构建包并在spark on yarn 运行
  • iOS 颜色设置看我就够了
  • JS学习笔记——闭包
  • js作用域和this的理解
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • springMvc学习笔记(2)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • WePY 在小程序性能调优上做出的探究
  • 工作中总结前端开发流程--vue项目
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于 Cirru Editor 存储格式
  • 回顾 Swift 多平台移植进度 #2
  • 记录一下第一次使用npm
  • 前端
  • 入门到放弃node系列之Hello Word篇
  • 深入浅出webpack学习(1)--核心概念
  • 智能合约Solidity教程-事件和日志(一)
  • 06-01 点餐小程序前台界面搭建
  • 阿里云ACE认证学习知识点梳理
  • 整理一些计算机基础知识!
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​queue --- 一个同步的队列类​
  • (2)MFC+openGL单文档框架glFrame
  • (2)nginx 安装、启停
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (万字长文)Spring的核心知识尽揽其中
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)VirtualBox安装增强功能
  • (原創) 未来三学期想要修的课 (日記)
  • (转)C#调用WebService 基础
  • (转)母版页和相对路径
  • .form文件_一篇文章学会文件上传
  • .net core docker部署教程和细节问题
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net php 通信,flash与asp/php/asp.net通信的方法