ReactHooks学习记录

简介: ReactHooks学习记录

1.useState
引入useState

import React, { useState } from 'react';
复制代码
在无状态组件中去声明一个useState

function test() {
// 解构赋值 useState传递的参数为初始值 跟前面的[num,setUnm] 没有关系。。
const [num,setNum] = useState(0)
//在页面渲染这个值
return(

   <div>
     你点击了 {num}次 <br/><br/>

//每点击一次 即可增加

      <button onClick={()=>{setNum(num+1)}}>点我</button>
     </div>

)
}
复制代码
使用这样的方式写组件很方便..

2.useEffect
引入useEffect:

import React, { useEffect,useState } from 'react';
复制代码
在组件中使用:

function tesst(){
const [num,setNum] = useState(0)

// useEffect相当于是一个生命周期 异步
// 组件渲染完成后和组件更新时 调用
// componentDidMount 和 componentDidUpdate
useEffect(()=>{
    console.log(num)

//return意思为解绑 当组件销毁时调用
return()=>{

        console.log('老弟走了!')
    }

// 空数组[]时,就是当组件将被销毁时才进行解绑
// 实现了componentWillUnmount的生命周期函数

},[])

}
复制代码
3.useContext和createContext
// 1引用userContext和createContext来传参

import React, { useState,useContext,createContext } from 'react';
复制代码
//2创建一个createContext上下文

const NumContent = createContext();
复制代码
// 4.创建子路由

function Didi(){

// 4.1使用useContext来接收父组件传递的参数
let Num = useContext(NumContent)
return(
    <h1>我是弟弟{Num}</h1>
)

}
function Exp2(){

const [Num,setNum] = useState(0)
return(
    <div>
        <h1>{Num}</h1>
        <button onClick={()=>{setNum(Num+1)}}>点击增加</button>
        {/* 3.在组件中是引入NumContent.Provider 固定写法  value是要传递的参数 */}
        <NumContent.Provider value={Num}>
            {/* 5在组件NumContent.Provider内部写入 子组件 */}
            <Didi/>
        </NumContent.Provider>
    </div>
    
)

}
export default Exp2;
复制代码
4.useReducer
import React, { useReducer } from 'react';

// 创建一个reducer 传递两个参数 一个是传递的值 一个是如何控制这个值
function ReducerDemo(){
    // useReducer需要传递两个参数 1一个是reducer本身,一个是初始值
    // 前面的两个变量count是初始值,dispatch是派发器用来控制初始值
    // useReducer本身中的state对应的是初始值,action对应的是dispatch传递的参数
    const [count,dispatch]  = useReducer((state,action)=>{
            switch(action){
                case 'add':{
                    return state+1
                }
                case 'sub':{
                    return state-1
                }
                default:{
                    return state
                }
            }
        },0)
        return(
            <div>
                <h2>现在的分数是{count}</h2>
                <button onClick={()=>dispatch('add')}>Increment</button>
                <button onClick={()=>dispatch('sub')}>Decrement</button>
            </div>
        )
}

export default ReducerDemo
复制代码
5.useMemo
useMemo主要用来解决使用React hooks产生的无用渲染的性能问题

问题描述:点击志玲按钮的时候 子组件的小白changeXiaobai()也会执行 又重复的渲染了一次

期望:点击相对应的按钮 只渲染相对应的组件 无相关的组件不重复的去渲染

解决方案:使用useMemo来规避重复渲染的问题

import React,{useState,useMemo} from 'react';
function Exp5(){

const [xiaobai,setXiaobai] = useState('小白正在等待')
const [zhiling,setZhiling] = useState('志玲正在等待')
return (
    <div>
        <hr/>
        <button onClick={()=>{
            setXiaobai(new Date().toLocaleTimeString())
        }}>
            小白
        </button>
        <button onClick={()=>{
            setZhiling(new Date().toLocaleTimeString()+'志玲来了')
        }}>
            志玲
        </button> <br/> <br/>
        {/* 向子组件传递两个值 */}
        {/* 如果传递在组件中 而不是以属性的方式传递,在子组件中使用children接收 */}
        <Child name={xiaobai} name2={zhiling}></Child>
    </div>
)

}
//子组件
function Child({name,name2,children}){

function changeXiaobai(name){
    console.log('小白来了')
    return name +'你喊了一声小白 小白走过来了'
}
//使用useMemo 两个参数第一个是渲染的组件的方法 ,第二个是对应参数变化(条件) 下面的例子解释为只有name变化时候才 执行actionXiaobai() 这个函数
const actionXiaobai = useMemo(()=>changeXiaobai(name),[name])
return(
    <div>
        <div>{actionXiaobai}</div>
        <div>{name2}</div>
    </div>
)

}
export default Exp5
复制代码
6.useRef:
两个用处:用useRef获取React JSX中的DOM元素、用useRef来保存变量

import React,{useRef,useState,useEffect} from 'react';
// useRef获取React JSX中的DOM元素
// useRef来保存变量
function Exp6(){

// 声明一个dom变量 默认为Null 下面进行绑定
const inputEl = useRef(null)
// 声明一个方法
const onButtonClick = ()=>{
    inputEl.current.value = '你好彪哥'
    // console.log(inputEl.current.value )
}
//保存变量
const textRef = useRef()
const [text,setText] = useState('彪哥')
useEffect(()=>{
    textRef.current = text
    console.log('textRef.current',textRef.current)
})
return (
    <div>
        {/* 跟上面声明的inputEl进行绑定 */}
        <input ref={inputEl} type="text"></input>
        <button onClick={onButtonClick}>展示文字</button>
        <hr/>
        <input value={text} onChange={(e)=>{setText(e.target.value)}}></input>
    </div>
)

}
export default Exp6
复制代码
7.自定义hooks函数
一个自定义Hooks函数,要用use开头,区分出什么是组件,什么是自定义函数。
下面自定义Hooks函数获取窗口大小
import React,{useEffect,useState} from 'react';
function useSizeChange(){

//获取当前浏览器的宽高
let [size,setSize] = useState({
    width:document.documentElement.clientWidth,
    height:document.documentElement.clientHeight
})
//声明一个改变浏览器宽高的方法
let setSizeAction = () =>{
    setSize({
        width:document.documentElement.clientWidth,
        height:document.documentElement.clientHeight
    })
}
//在useEffect周期函数中调用
useEffect(()=>{
    window.addEventListener('resize',setSizeAction)
    //离开页面时解绑resize事件
    return()=>{
        window.removeEventListener('resize',setSizeAction)
    }
},[])
// 把size返回出去 在下面Exp7函数中使用(相当于是一个闭包)
return size

}
function Exp7(){

var size = useSizeChange()
return (
    <div>
        窗口的Sizi:{size.width}*{size.height}
    </div>
)

}
export default Exp7
复制代码

作者: Bill 本文地址: http://biaoblog.cn/info?id=1574931180000

版权声明: 本文为原创文章,版权归 biaoblog 个人博客 所有,欢迎分享本文,转载请保留出处,谢谢!

相关文章
|
1天前
|
人工智能 自然语言处理 安全
阿里云AI数智鉴密:AI 生成内容如何拿到一张"防篡改的身份证"
隐形水印 + C2PA签名:让AI生成内容“持证上岗”。
1086 0
|
9天前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
3599 3
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
|
21天前
|
人工智能 缓存 前端开发
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
DeepSeek Harness + DeepSeek V4 Pro 项目实战保姆级教程!手把手带你从零安装开源 AI 编程工具,开发架构图、知识讲解网站、3D 网页游戏、全栈 AI 应用 4 个项目,覆盖运行模式选择、插件安装与开发,看看能不能对标 Claude。
13330 91
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
|
15天前
|
Web App开发 人工智能 API
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
DeepSeek Harness 精选插件推荐合集,从图片识别、浏览器操控、多 Agent 协作到手机远程控制,一口气带你看完 DSH 社区热门的十几个插件,覆盖技能扩展、UI 界面增强、整活玩法三大类,让你的鲸鱼变得更强。
1853 4
|
7天前
|
人工智能 监控 测试技术
Qwen3.8-Flash 来了,100万上下文、Agent、Coding 都加强了
8月26日,通义千问发布Qwen3.8-Flash-Next:125B参数、每Token仅激活6B,原生支持26万Token、可扩展至100万上下文;Coding、Agent与工具调用能力显著增强,面向真实软件工程任务,推动大模型从“回答问题”迈向“完成工作”。
|
10天前
|
人工智能 Linux iOS开发
Ollama使用教程:Ollama官网下载、Ollama本地部署大模型(2026最新)
Ollama 是一款免费开源的本地大模型运行工具,支持在 Windows/macOS/Linux 上离线运行 Qwen、DeepSeek、Llama 等主流开源模型,数据不出本机、隐私安全。提供 OpenAI 兼容 API,命令行一键拉取/运行/管理模型,无需联网,无调用限制,是开发者与 AI 爱好者部署本地 AI 助手的理想选择。(239 字)
|
16天前
|
人工智能 Java BI
【AI】DeepSeek Harness 安装、运行、管理插件
本文介绍了如何运行DeepSeek开源的Agent框架DeepSeek Harness(dsh)。主要内容包括:使用nvm安装适配的Node版本;通过代理加速克隆GitHub源码;使用pnpm安装依赖并启动项目;配置DeepSeek API Token;安装扩展功能的插件。该框架自带Web界面,支持模型适配、文件编辑等插件化功能
2058 1