React Hooks使用方法:useState,useRef,useEffect,useReducer,useContext用法实战案例

news2025/3/30 15:03:13

 react hooks介绍,包括了state,ref,effect,reducer,context等常见hooks,也包括forwardRef和createContext用法,下面看代码吧,我用的是js写的。每个hook都做了个案例。

// 使用state来实现点击加减
import { useState} from 'react'
const UseStateTest=()=> {
  const [count, setCount] = useState(0)

  const increment=()=>{
    console.log('+')
    setCount(prev=>prev+1)
  }
  const decrement=()=>{
    console.log('-')
    setCount(prev=>prev-1)
  }
  
  return (
    <>
      <div>
        <p>count的数值为:{count}</p>
        <button onClick={increment}>点击加一</button>
        <button onClick={decrement}>点击减一</button>
      </div>
    </>
  )
}

export default UseStateTest
// 这里是state和ref配合使用赋予输入框的值
import { useState,useRef } from 'react'

const UseRefTest=()=> {
  const [inputValue,setInputValue]=useState('')
  const iptRef = useRef()

  const change=()=>{
    let value=iptRef.current.value
    console.log(value)
    setInputValue(value)

  }

  
  return (
    <>
      <div>
        <input value={inputValue} ref={iptRef} onChange={change}/>
      </div>
    </>
  )
}

export default UseRefTest
// 这里son子组件配合father使用,达到子组件传值到父组件并且让父组件调用和修改
import { useState,useRef } from 'react'
import SonUseRefTest from './SonUseRefTest'
const FatherUseRefTest=()=> {
  const sonRef = useRef();
  const [SonRefItem,setSonRefItem]=useState(null)
  const onshow=()=>{
    setSonRefItem(JSON.stringify(sonRef.current))
  }
   const onreset=()=>{
    sonRef.current?.setInputValue('')
  }


  
  return (
    <>
      <div>
        <h1>父组件</h1>
        <h2>{SonRefItem}</h2>
        <button onClick={onshow}>点击显示</button>
        <button onClick={onreset}>点击重置</button>
        <hr/>
        <SonUseRefTest ref={sonRef}/>
      </div>
    </>
  )
}

export default FatherUseRefTest




// 这里son子组件配合father使用,达到子组件传值到父组件并且让父组件调用和修改
import React,{ useState,useRef,useImperativeHandle } from 'react'

const SonUseRefTest=React.forwardRef((props,ref)=> {
  const [inputValue,setInputValue]=useState('')
  const change=(e)=>{
    setInputValue(e.target.value)
  }
  useImperativeHandle(ref,()=>({
      inputValue,
      setInputValue
    }))
  return (
    <>
      <div>
        <h2>子组件</h2>
        <input value={inputValue} onChange={change}/>
      </div>
    </>
  )
})

export default SonUseRefTest


import { useState , useEffect , useReducer} from 'react'
import SonUseReduceTest from './SonUseReduceTest'
const defaultState={
  count:0,
  name:'李四',
  flag:true
}
const reducer=(state=defaultState,action)=>{
  switch(action.type){
    case 'change_name':
      console.log(action)
      return {...state,name:action.name}
    case 'change_flag':
      console.log(action)
      return {...state,flag:action.flag}
    case 'son_change_name':
      console.log(action)
      return {...state,name:action.name}
    case 'son_change_flag':
      console.log(action)
      return {...state,flag:action.flag}  
    default : 
      return state;
  }
  
}
const UseReduceTest=()=> {
  const [state,dispatch]=useReducer(reducer,defaultState)
  const changeName=()=>{
    dispatch({type:'change_name',name:"张三"})
  }
  const changeFlag=()=>{
    dispatch({type:'change_flag',flag:!state.flag})
  }
  return (
    <>
      <div>
        <div>当前name为{String(state.name)}</div>
        <br/>
        <button onClick={changeName}>点击修改name</button>
        <br/>
        <div>当前flag为{String(state.flag)}</div>
        <br/>
        <button onClick={changeFlag}>点击修改flag</button>
        <br/>
        <SonUseReduceTest {...state} dispatch={dispatch}/>
      </div>
    </>
  )
}

export default UseReduceTest



import { useState , useEffect} from 'react'
const SonUseReduceTest=(props)=> {
  const {dispatch,...state}=props
  const changeName=()=>{
    dispatch({type:'son_change_name',name:"王五"})
  }
  const changeFlag=()=>{
    dispatch({type:'son_change_flag',flag:!state.flag})
  }
  return (
    <>
      <div>
        <br/>
        <br/>
        <div>SonUseReduceTest</div>
        <div>当前名字为{state.name}</div>
        <button onClick={changeName}>点击修改name</button>
        <div>当前flag为{JSON.stringify(state.flag)}</div>
        <button onClick={changeFlag}>点击修改flag</button>
      </div>
    </>
  )
}

export default SonUseReduceTest




import { useState , useEffect} from 'react'
const UseEffectTest=()=> {
  const [current, setCurrent] = useState(0)
  const [pagesize, setPagesize] = useState(10)
  const [totle] = useState(0)
  const [count, setCount] = useState(0)
  const [flag, setFlag] = useState(true)
  const add=(num)=>{
  	setCount(prev=>prev+num)
  }
  const showHide=()=>{
  	setFlag(prev=>!prev)
  }
  // 不传递依赖项,就是状态有更新就重新执行effect函数
  // useEffect(()=>{
  // 	console.log('刷新了组件!!!')
  // })
  
  // 传递依赖项,只有对应state改变时才会执行effect函数
  //  useEffect(()=>{
  // 	console.log('刷新了组件!!!')
  // },[count])
  
  // 传递依赖项为空,只有第一次渲染完成时才会执行effect函数
  useEffect(()=>{
  	console.log('刷新了组件!!!')
  },[])
  return (
    <>
      <div>
        <div>当前count的为:{count}</div>
        <button onClick={()=>add(1)}>点击+1</button>
        <button onClick={()=>add(-1)}>点击-1</button>
        <br/>
        <button onClick={showHide}>点击修改Flag</button>
        <div>当前flag的为:{String(flag)}</div>
      </div>
    </>
  )
}

export default UseEffectTest
//定义一个context文件,单独存放在src下即为src->context-context,里面具体代码为如下:
import React ,{useState,useRef,useEffect,useContext} from 'react'
const FirstContext=React.createContext()

export {
  FirstContext
}


// 非嵌入式context
import React ,{ useState , useEffect , useContext} from 'react'
import LevelB from './LevelB'
import {FirstContext} from '../../../context/context'
const LevelA=()=>{
	const [count,setCount]=useState(0)
	const add=()=>{
		setCount(prev=>prev+1)
	}
	return (
		<>
			<FirstContext.Provider value={{count,setCount}}>
				<div>这是LevelA组件的count值为:{count}</div>
				<button onClick={add}>+1</button>
				<hr/>
				<br/>
				<LevelB/>
			</FirstContext.Provider>
		</>
	)
}

export default LevelA


import React ,{ useState , useEffect , useContext} from 'react'
import LevelC from './LevelC'
const LevelB=()=>{

	return (
		
		<div>
			<div>这是LevelB组件</div>
			<hr/>
			<br/>
			<LevelC/>
		</div>
	)
}

export default LevelB


import React ,{ useState , useEffect , useContext} from 'react'
import {FirstContext} from '../../../context/context'
const LevelC=()=>{
	const {count,setCount}=useContext(FirstContext)
	const cadd=()=>{
		setCount(prev=>prev+1)
	}
	return (
		<>
			<div>这是LevelC组件</div>
			<div>{count}</div>
			<button onClick={cadd}>+1</button>
		</>
	)
}
export default LevelC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

扩展卡尔曼滤波

1.非线性系统的线性化 标准卡尔曼滤波 适用于线性化系统&#xff0c;扩展卡尔曼滤波 则扩展到了非线性系统&#xff0c;核心原理就是将非线性系统线性化&#xff0c;主要用的的知识点是 泰勒展开&#xff08;我另外一篇文章的链接&#xff09;&#xff0c;如下是泰勒展开的公式…

4.Matplotlib:基础绘图

一 直方图 1.如何构建直方图 将值的范围分段&#xff0c;将整个值的范围分成一系列间隔&#xff0c;然后计算每个间隔中有多少值。 2.直方图的适用场景 一般用横轴表示数据类型&#xff0c;纵轴表示分布情况。 直方图可以用于识别数据的分布模式和异常值&#xff0c;以及观察数…

VSCode 市场发现恶意扩展正在传播勒索软件!

在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店&#xff0c;但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld&#xff0c;目前已从商店中删除。 此外&#xff0c;ahban.cychelloworld 扩展于 2024 年 10 月…

工作流引擎Flowable介绍及SpringBoot整合使用实例

Flowable简介 Flowable 是一个轻量级的业务流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;基于 Activiti 项目发展而来&#xff0c;专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。 Flowable 的核心…

K8s证书--运维之最佳选择(K8s Certificate - the best Choice for Operation and Maintenance)

K8s证书--运维之最佳选择 No -Number- 01 一个月速通CKA 为了速通CKA&#xff0c;主要办了两件事情 1. 在官方的Killercoda上&#xff0c;练习CKA的题目。把命令敲熟悉。 // https://killercoda.com/killer-shell-ckad 2. 使用K3s在多台虚拟机上快速搭建了K8s集群&…

Leaflet.js+leaflet.heat实现热力图

Leaflet热力图 #mermaid-svg-I1zXN0OrNCBGKEWy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-icon{fill:#552222;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-text{fill:#552222;stroke:#5522…

通过git文件查看大模型下载链接的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

多源最短路:Floyd算法の暴力美学

多源最短路求解的是图中的任意两个节点之间的最短路。 前文我们已经讲过单源最短路&#xff0c;我们完全可以做n次单源最短路算法&#xff0c;求出任意两节点的最短距离。最快的堆优化版的 dijkstra 算法的时间复杂度为o&#xff08;m * logm&#xff09;&#xff0c;枚举n次时…

simpleITK - Setup - Pythonic Syntactic Sugar

Pythonic Syntactic Sugar Image Basics Notebook 非常简单&#xff0c;与 ITK 的 C 接口非常接近。 Sugar非常棒&#xff0c;它能让你精力充沛&#xff0c;更快地完成任务&#xff01;SimpleITK 也应用了大量Sugar来帮助更快地完成任务。 %matplotlib inline import matplo…

下载vmware17

我用VMware10安装ubuntu24&#xff0c;死活不能成功&#xff0c;要么突然退出&#xff0c;要么装着装着&#xff0c;眼看完成&#xff0c;居然卡住不动&#xff0c;一查日志&#xff0c;提示光盘读取失败&#xff08;用的ISO文件&#xff0c;居然装模作样的说光驱读取失败&…

德昂观点:如何看待MicroStrategy改名为Strategy?

2025年2月&#xff0c;纳斯达克上市公司MicroStrategy&#xff08;股票代码&#xff1a;MSTR&#xff09;宣布更名为“Strategy”&#xff0c;并同步启用全新品牌标识与橙色主视觉。这不仅是品牌形象的更新&#xff0c;更是公司战略方向的明确宣示。德昂作为MSTR中国区BI合作伙…

嵌入式八股RTOS与Linux---网络系统篇

前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块   这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…

Django 生成 ssl 安全证书,切换 https、wss协议(daphne 、nginx)

Django 普通 http 协议不够安全&#xff0c;无法支持连接本地摄像头&#xff08;虽然在本地 localhost 上能连&#xff09;&#xff0c;此时需要切换成 https 协议&#xff08;先提个醒&#xff0c;我这个方法最后失败了&#xff0c;不过对您应该也有帮助&#xff09; 目录 配置…

告别Win10强制更新:永久关闭系统更新指南

你是否厌倦了Win10在开关机时的强制自动更新&#xff1f;无论你是在赶时间还是专注于工作&#xff0c;那突如其来的更新提示总是让人不胜其烦。屏幕上那句“正在更新&#xff0c;请勿关闭电源”的提示&#xff0c;仿佛是对你无奈的嘲笑。别担心&#xff0c;今天我将教你如何永久…

罗杰斯特回归

定义 逻辑回归其实就是原来的线性回归加了激活函数&#xff0c;这个函数其实就是sigmoid函数&#xff0c;把一个回归的连续数值压缩到了0到1的空间&#xff0c;其实只要有函数能够满足把数值压缩到0,1之间就可以&#xff08;因为0到1之间的数值就是概率值&#xff09; 对于分类…

【嵌入式学习2】C语言 - VScode环境搭建

目录 ## 语言分类 ## c语言编译器 ## VScode相关配置 ## 语言分类 编译型语言&#xff1a;C&#xff0c;C解释型语言&#xff1a;python&#xff0c;JS ## c语言编译器 分类GCC 系列MinGWCygwinMSVC系列一套编程语言编译器将GCC编译器和GNU Binutils移植到Win32平台下的产物…

利用脚本和Shader制作屏幕后处理效果

一、屏幕后处理的实现原理 该屏幕后处理的原理是将渲染完成后的屏幕纹理通过脚本和Shader完成一些操作&#xff0c;然后实现各种屏幕效果 而实现屏幕后处理效果的主要操作就是获得当下渲染完成后的屏幕图像&#xff0c;其中unity提供了一个函数用于获取此图像——OnRenderIma…

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …

3.1.2 内存池

文章目录 3.1.2 内存池1. 什么是内存池2. 内存管理1. 定长2. 不定长3. jemalloc4. tcmalloc 3.1.2 内存池 1. 什么是内存池 内存池&#xff08;Memory Pool&#xff09; 是一种 预先分配 一块大内存&#xff0c;然后按需分配和回收 其中小块内存的技术。它的本质是管理一块连续…

基于SpringBoot + Vue 的餐厅点餐管理系统

SpringBootVue餐厅点餐管理系统 技术框架 后端&#xff1a;springboot mybatisPlus前端&#xff1a;Vue2 elementUI数据库&#xff1a;mysql项目构建工具&#xff1a;maven 数据库表 14张 角色及功能 管理员&#xff1a;登录、用户管理、餐桌信息管理、菜品类型管理、菜…