react-hooks学习

關於 React 中的 Hooks - 完全上手指南 關於 React 中的 Hooks - 完全上手指南前言正文什麼是 Hooks?useState自定義 HooksuseEffectuseRefuseLayoutEffectuseCallbackuseMemouseReduceruseContext結語參考 前言 這篇要來討論關於 react 的 hooks。學過 react 的人肯定都知道什麼是 hooks,也就是說 hooks 可以說是 react 必會的東西,所幸通過這篇我來整理下關於 hooks 的知識點以及一些個人理解。這篇應該會很長,不過整體來 阅读详情

react hooks在react16.8版本以后,推出的一组函数式的api.专门用于函数组件,使函数组件也能像类组件一样使用state和生命周期等一些特性。

1.useState

useState可以使函数组件处理数据的状态。它只能放在函数组件中,不可以用在判断和循环语句中。

let [state,setState] = useState(initialState);

 useState接收一个state初始值,返回这个state和设置state的函数;设置state的函数不能自动合并state中的数据,需要手动合并。 

代码示例:

1.未封装版form表单收集数据

import { useState } from 'react';


// 使用函数实现表单数据收集
// 不需要访问this
// 代码更简洁
function Form() {

  let [ email, setEmail ] = useState('');
  let [ password, setPassword ] = useState('');

  return (
    <div>
        <h1>react hooks</h1>
        <div>
            <input type="text" name="email" placeholder="输入邮箱" value={email} onChange={e => setEmail(e.target.value)} />
        </div>
        <div>
            <input type="password" name="password" placeholder="输入密码" value={password} onChange={e => setPassword(e.target.value)} />
        </div>
        <div>
           <button onClick={e => console.log('Form 数据:',email,password)}>提交</button>
        </div>
    </div>
  );
}

export default Form;

2.自定义hook封装版form表单收集数据 

//hooks/useForm.js
import { useState } from 'react';

// 收集表单数据的自定义hooks
export default function useForm(initialVal){
    let [ values, setValues ] = useState(initialVal);

    // 返回一个数组
    return [
        values,
        // 箭头函数方法
        e => {
             //useState不能自动合并state的数据,以下通过解构,新值覆盖的方式来合并
            // 解构原先的对象,从e.target中收取最新的一个[name:value],覆盖原先的[name:value],此操作将数据进行合并
            setValues({
                ...values,
                [e.target.name]: e.target.value
            })
        }
    ]
}
/src/FormComp.js
import useForm from './hooks/useForm';


// 使用函数实现表单数据收集
// 不需要访问this
// 代码更简洁
function FormComp() {

  let [ values, handleChange ] = useForm({ email: '', password: '' });

  return (
    <div>
        <h1>react hooks</h1>
        <div>
            <input type="text" name="email" placeholder="输入邮箱" value={values.email} onChange={handleChange} />
        </div>
        <div>
            <input type="password" name="password" placeholder="输入密码" value={values.password} onChange={handleChange} />
        </div>
        <div>
           <button onClick={e => console.log('Form 数据:',values.email,values.password)}>提交</button>
        </div>
    </div>
  );
}

export default FormComp;

2.useEffect

 useEffect的四个用法

  • 注册一个生命周期didMount和didUpdate
  • 增加清除操作(返回一个清除函数,在该函数中清除);比如清除定时器,绑定的事件等等,类似于在willUnmount生命周期中执行一些解除的操作
  • 只注册一次didMount和willUnmount(给useEffect的第二个参数传入空数组);常用于初次发送异步请求此类操作
  • 性能优化,在某个条件下更新

代码示例:

//用法一 注册一个生命周期didMount和didUpdate

import { useEffect,useState } from 'react';

export default function LearnEffect(){

    let [ count,setCount ] = useState(0);

    //此函数会在didMount和didUpdate时执行
    useEffect(() => {
       console.log('render: '+ count);
       console.log('didMount&&didUpdate');
    });

    return (
        <div>
            <h1>useEffect 用法</h1>
            <p>{count}<p>
            <button onClick={() => setCount(count + 1)}>+1</button>
        </div>
    )
}
//用法二 增加清除操作(返回一个清除函数,在该函数中清除);比如清除定时器,绑定的事件等等,类似于在willUnmount生命周期中执行一些解除的操作

useEffect(() => {
   const subscription = props.source.subscribe();
   //返回清除函数
   return function cleanup(){
       //清除订阅
       subscription.unsubscribe();
   }
})
//用法三 只注册一次didMount和willUnmount(给useEffect的第二个参数传入空数组);常用于初次发送异步请求此类操作
//形成闭包,无法获取最新的state,setState 需要传递函数

//当传入空数组时,效果相当于拥有了didMount和willUnmount两个生命周期
useEffect(() => {
   const subscription = props.source.subscribe();
   //返回清除函数
   return function cleanup(){
       //清除订阅
       subscription.unsubscribe();
   }
},[])
//用法四  性能优化,在某个条件下更新

useEffect(() => {
   const subscription = props.source.subscribe();
   //返回清除函数
   return function cleanup(){
       //清除订阅
       subscription.unsubscribe();
   }
//传入非空数组,则在此条件下进行渲染更新
},[props.id])

3.useRef

代替类组件中的React.createRef() ,在函数组件中使用的ref.

import { useRef } from 'react';

export default function UseRefTest(){
    
    // 声明一个元素,一开始不知道指向哪个标签,先标识为null
    const element = useRef(null);

    function handleClick(){
        console.log('获取input的值:', element.current.value);
    }

    return (
        <div>
            <input type="text" ref={element} />
            <button onClick={handleClick} >获取input的值</button>
        </div>
    )
}

 

4.useContext

通过createContext来创建上下文空间,Provider组件来传递值;通过以下两种方式来获取值:

  • Consumer组件中解构获取
  • useContext(上下文) 获取
import React, { useState, useContext, createContext } from 'react';

// 创建上下文空间
const NumContext = createContext();
console.log('NumContext:', NumContext);

function Son(){
    // const { num } = useContext(NumContext);
    // return <div>啦啦啦{num}</div>
    return (
        // useContext 消费者
        <NumContext.Consumer>
            {/* 内部可以接收到context的数据,通过解构使用 */}
            {
                ({num}) => <div>呵呵呵{num}</div>
            }
        </NumContext.Consumer>
    )
}

function Btn(){
    return (
        <NumContext.Consumer>
            {
                ({num,setNum}) => <button onClick={ () => { setNum(num + 1) }} >累加</button>
            }
        </NumContext.Consumer>
    )
}

export default function UseContextTest(){
    const [num,setNum] = useState(0);

    return (
        <div>
            {/* 
              *上下文空间提供器 
              单参传递,value={变量}
              多参处传递,value={ obj }  传递对象
            */}
            <NumContext.Provider value={{ num,setNum }}>
                <Son />
                <Btn />
            </NumContext.Provider>
        </div>
    )
}

 tips:跨文件时如何传递?

5.useReducer 

在函数组件中使用的reducer 

import React, { useReducer } from 'react';

// 定义一个关于num的reducer
function NumReducer(state, action){
    let newState = JSON.parse(JSON.stringify(state));
    switch (action.type) {
        case 'addNum':
            newState.num += action.value;
            break;
        default:
            break;
    }

    return newState;
}

export default function UseReducerTest(){
    // useReducer:传入手写reducer方法和原始state返回新state和dispatch进行使用
    const [state, dispatch] = useReducer(NumReducer, { num: 0});

    return (
        <div>
            <div>嘻嘻嘻{state.num}</div>
            <button onClick={ () => dispatch({ type: 'addNum', value: 1 }) } >累加</button>
        </div>
    )
}

延伸:

使用useReducer和useContext来实现简易react-redux

import React, { useReducer, useContext, createContext } from 'react';

// 1-创建上下文空间
const NumContext = createContext();


function NumReducer(state, action){
    let newState = JSON.parse(JSON.stringify(state));
    switch (action.type) {
        case 'addNum':
            newState.num += action.value;
            break;
        default:
            break;
    }

    return newState;
}


function Son(){
    return (
        // 使用消费者
        <NumContext.Consumer>
            {
                ({state}) => <div>嘿嘿嘿{state.num}</div>
            }
        </NumContext.Consumer>
    )
}

function Btn(){
    return (
        // 使用消费者
        <NumContext.Consumer>
            {
                ({dispatch}) => <button onClick={ () => dispatch({ type: 'addNum', value: 1 }) } >累加</button>
            }
        </NumContext.Consumer>
    )
}


// useContext搭配useReducer实现react-redux
export default function UseReducerTest(){
    // useReducer:传入手写reducer方法和原始state返回新state和dispatch进行使用
    const [state, dispatch] = useReducer(NumReducer, { num: 0});

    return (
        <div>
            {/* 2-上下文空间传参,传参对象为useReducer的返参 */}
            {/* 使用提供者 */}
            <NumContext.Provider value={{state, dispatch}}>
                <Son />
                <Btn />
            </NumContext.Provider>
        </div>
    )
}

趣味学习React Hooks 核心 趣味学习📚 React Hooks 核心 阅读详情

相关推荐

Mixer-First Receiver适用于宽带阵列应用的接收机技术1

Mixer-First Receiver适用于宽带阵列应用的接收机技术1技术的背景单元级数字化阵列传统链路到Mixer-First链路的逻辑考虑三种场景小结 技术的背景 在文章《吊打全球的顶级毫米波数字阵列项目-MIDAS》中提到了DARPA在MIDAS项目中在毫米波实现宽带单元级数字化阵列用到了一个关键的叫做N-Path filter的技术,而这个技术同样出现在了《让微波射频工程师颤抖的芯片-MATRICs》的MATRICs芯片中。 为什么DARPA的各个合作研究机构选择这种技术?这篇来自Universi

ICONO的博客 2167

hooks 和Form表单提交

import React, { useState } from "react"; import { Form, Button } from "semantic-ui-react"; const Register = () => { const [values, setValues] = useState({ username: "", email: "", pa...

weixin_43550927的博客 2935

STM32F407硬件IIC驱动OLED避坑实录:从‘不显示’到‘稳定刷屏’的完整调试过程

本文详细记录了使用STM32F407硬件IIC驱动OLED屏幕的完整调试过程,从初始的‘不显示’问题到最终实现‘稳定刷屏’。文章涵盖了硬件接线、I2C外设配置、常见问题排查及性能优化技巧,特别针对STM32标准库开发中的难点提供了实用解决方案,是嵌入式开发者驱动OLED屏幕的实用指南。

weixin_30315723的博客 304

react——useState和useReducer

useState和useReducer都是用来存储和更新state,useReducer状态管理是useState的升级版。useReducer可以在外部存储变量,实现异步操作。若要实现跨组件通信,需要结合useContext来实现

m0_55173487的博客 885

手把手教你用Gazebo插件实现阿克曼底盘仿真(附Navigation2适配指南)

本文提供了一份完整的ROS2 Navigation2与Gazebo阿克曼底盘仿真全栈指南。从阿克曼运动学原理出发,详细讲解了如何构建URDF/SDF模型、集成gazebo_ros_ackermann_drive插件并进行PID调优,并重点阐述了如何深度适配Navigation2,包括配置Ackermann运动模型、调整规划器与恢复行为,最终实现从建图到自主导航的全流程仿真。

weixin_29310631的博客 399

从牛顿冷却定律到热传导方程:一维热传导方程的物理直觉与数学推导

本文从牛顿冷却定律出发,结合傅里叶热传导定律和能量守恒原理,系统推导了一维热传导方程的数学形式。通过微元分析和物理直觉,揭示了温度随时间变化与空间二阶导数之间的关系,并阐释了热扩散率α的物理意义。文章还探讨了方程的边界条件、数值解法及其在材料科学和工程中的应用,为理解热量传递提供了清晰的物理图像和数学框架。

palm99的专栏 840

使用 React-Hook-Form 让你的表单天生强大

没有人喜欢创建和重新创建带有验证的复杂表单,包括React开发人员。 在React中构建表单时,必须使用一个表单库,该库提供了许多方便的工具,而且不需要太多代码。 基于实用和简单这两个标准,应用程序最理想的React表单库是 React-hook-form 。 让我们看看如何在你自己的项目中使用 React-hook-form 来为你的React应用程序构建丰富的、有特色的表单。 安装 让我们来讨论一个典型的用例:一个用户注册到我们的应用程序。 对于我们的注册表单,我们将为任何新用户的用户名、密码和电子邮.

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 1万+

71、机器人与机器人控制器技术解析

本文深入解析了机器人控制器的通信接口、传感器数据采集与处理以及抓手技术三大核心技术。详细介绍了数字I/O、串行接口、总线系统和以太网等通信方式,探讨了各类传感器在焊接、装配、质量检测等场景中的应用,并阐述了手眼校准与路径校正的关键方法。同时,文章还分析了不同类型抓手的特点及选型设计原则,展示了机器人在现代工业自动化中的高效性与灵活性。通过实际编程示例与流程图,全面呈现了机器人系统的集成与控制逻辑。

gin88的博客 277

vue3 hooks封装useForm

vue3 自定义封装 hooks-form

xiangruyimo_1的博客 262

YOLO26改进策略【Neck】| CVPR 2024 MFM(Modulation Fusion Module,调制融合模块):动态特征加权融合,突出关键特征抑制冗余

本文主要利用DCMPNet中的 MFM 模块优化 YOLO26 的目标检测网络模型。模块通过动态调制特征融合过程,实现了对多尺度、跨层级特征的智能聚合。将其应用于的改进过程中,针对目标检测中边界特征与语义信息的互补性需求,缓解网络中浅层细节与深层语义融合不足的问题。Depth Information Assisted Collaborative Mutual Promotion Network for Single Image Dehazing在图像去雾网络中,不同层级和类型的特征包含着互补的信息(如浅层的

Limiiiing的博客 224

工业级实战:C#实现欧姆龙PLC FINS-TCP通信(协议解析+完整源码+避坑指南)

// FINS主命令码+子命令码枚举(工业级常用指令)ReadData = 0x0101, // 读取数据WriteData = 0x0102, // 写入数据ReadPlcStatus = 0x0601, // 读取PLC状态ResetPlc = 0x0605 // 复位PLC(慎用)/// 欧姆龙PLC数据区枚举(工业常用)CIO = 0x30, // CIO区(核心数据区)WR = 0x31, // 工作区HR = 0x32, // 保持区。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 658

React Hooks 学习实践项目推荐

React Hooks 学习实践项目推荐 本项目是一个关于React Hooks的学习和实践项目,主要使用JavaScript语言进行开发。该项目旨在提供一系列逐步深入的React Hooks示例,从基础场景到高级主题,帮助开发者更好地理解和应用React Hooks。 1. 项目基础介绍和主要编程语言 项目名称:React Hooks By Example 编程语言:JavaScript 本项目...

gitblog_00724的博客 859

【OpenCV】图像的像素直方图 图像特征点 cv::FAST cv::ORB ORB_SLAM2::ORB

文章目录图像直方图代码实现cv::FAST和cv::ORB 检测图像特征点cv::FAST和cv::ORB 检测图像特征点代码实现ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比代码实现 图像直方图代码实现 图像是由不同数值(颜色)的像素构成的,像素值在图像中的分布情况是图像的重要属性,可以用直方图修改图像的外观,标识图像的内容,检测图像中特定的物体或纹理。 单通道灰度图像中每个像素都有一个 0(黑色)-255(白色)的整

小秋 AI SLAM 入门实战教程 2510

React Hooks 学习

React Hooks 学习 动机、解决了什么问题 State Hook 简单来说 组件分为三种、无状态组建可以通过function 编写、但是有了 hooks ,可以很轻易的写出带状态的组件 Effect Hook 可以让你在函数组件中执行一些具有effect(副作用)的操作;每次render之后都会执行effect相当于DidMonut 和 DidUpdate,如果需要对指定的参数进行监听,...

与你清欢 455

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

react hooks学习

react Hooks API学习react Hooks前言一、useState的使用二、使用步骤1.引入库2.读入数据总结 前言 本文主要记录Hooks学习 一、useState的使用 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sn

顶峰相见的博客 395

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

React Hooks的深入学习

ReactHooks的出现,就标志着React不会存在无状态组件的情况,只有类组件和函数组件。

fish_skyyyy的博客 548

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

React Hooks - 学习/实践

1.应用场景 主要用于学习使用react hooks进行前端项目的开发. 2.学习/操作 1.文档阅读 http://www.ruanyifeng.com/blog/2019/09/react-hooks.html //React Hooks 入门教程 https://segmentfault.com/a/1190000019900931 //Hooks 与 React 生命周期的关系 视频: https://www.bilibili.com/...

"代码"的日常搬运 762

React中Hooks的学习一些总结

react的hooks的学习

huihui_999的博客 954

React学习笔记5:React Hooks概述

文章目录概述React的两套API类和函数的差异副效应(副作用)是什么?钩子(hook)出现的意义三大框架对比为什么学习hooks应用场景新版本特性解读Hook使用规则 概述 React的两套API 以前,React API 只有一套,现在有两套:类(class)API 和基于函数的钩子(hooks) API。 任何一个组件,可以用类来写,也可以用钩子来写。下面是类的写法。 class HelloReact extends React.Component { render() { return

HTZW的博客 490

React Hooks学习指北

自定义hooks是在基础上的一个拓展,可以根据业务需要制定满足业务需要的hooks,更注重的是逻辑单元。通过业务场景不同,我们到底需要做什么,怎么样把一段逻辑封装起来,做到复用,这是自定义hooks产生的初衷。hooks 专注的就是逻辑复用, 是我们的项目,不仅仅停留在组件复用的层面上。hooks让我们可以将一段通用的逻辑存封起来。将我们需要它的时候,开箱即用即可。

weixin_41086056的博客 1469

react hooks学习总结

react hooks学习总结 react hooks优点 1:解决了class组件状态逻辑难以复用的问题 2:解决了class组件复杂难以维护的问题 生命周期函数中包含了很多不相干的逻辑,比如componentDidUpdate中只要一个字段发生变化都会触发,为了优化这种场景会写很多的优化逻辑; 类组件中到处都是对状态的访问和处理,导致组件难以拆分成更小的组件; 3:解决了类组件中this的问题...

yangjidaimin的专栏 509

React Hooks学习

React Hooks useState 很常用的一个hook,可以保存函数组件中的状态 参数 useState(val) 传进去的是初始状态的值 useState(true) usestate(50) useState('aaa')… 也可以是一个函数,会自动拿到函数的返回值 useState(() => { ... const res = a + b; return res; }) 返回 useState() 会返回一个数组,数组的第一项是当前的初始状态,第二项是个函数,

qian____的博客 856

react hooks 学习

react hooks 学习 一. React Hooks是什么? React Hooks 是 React 16.8 引入的新特性,允许我们在不使用 Class 的前提下使用 state 和其他特性,组件尽量写成纯函数,如果需要外部功能和副作用,就用钩子把外部代码"钩"进来。 二. React Hooks解决的问题是? 状态共享,避免嵌套。用于解决长时间使用和维护react过程中常遇到的问题。 1.难以重用和共享组件中的与状态相关的逻辑。 2.逻辑复杂的组件难以开发与维护,当我们的组件需要处理多个互不相关的

weixin_44254470的博客 380

React学习-hooks

官方文档:https://zh-hans.react.dev/reference/react/useActionState。

beekim的博客 875

如何快速掌握React Hooks:初学者必备的终极学习指南

Hooks.Guide是一个由社区精心打造的React Hooks学习资源库,汇集了丰富的内置和第三方Hooks使用指南。无论你是刚入门React的新手,还是希望提升技能的开发者,这里都能为你提供简单易懂的Hooks学习方案,帮助你快速掌握React Hooks的核心用法和实战技巧。 ## 为什么选择Hooks.Guide学习React Hooks? React Hooks彻底改变了React

gitblog_00039的博客 301

React 学习笔记 - 使用React Hooks进行简单的表单封装

React 学习笔记 - 使用React Hooks进行简单的表单封装前言示例组件使用Form组件FormItem 组件Input 组件 前言 学完@我不是外星人的React进阶实践指南,了解了props的基本使用、隐式注入props、表单嵌套原理等。利用所学React Hooks知识对原文给出的demo进行了简单改动 希望通过这实践 demo 让大家学习到: props 基本使用 学会操作 props.children ,隐式注入 props 掌握表单嵌套原理(现实情况要比这个复杂) 示例 组件使用

绿胡子大叔的博客 1472
上一篇: mock.js了解学习
下一篇: 【工具】vue excel导出
谭CV
博客等级 码龄9年 73粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值