07 hook学习01

news/2024/5/22 2:07:09/文章来源:https://blog.csdn.net/qq_39225271/article/details/127183056

hook学习01

  • Hooks理解
  • useState
  • useEffect
  • 自定义hook函数

Hooks理解

react组件分为类组件和函数组件

函数组件是一个更加匹配react的设计理念UI = f(data),利于逻辑拆分与重用的组件表达形式,而之前的函数组件是不可以有自己的状态的,为了能让函数组件可以拥有自己的状态,react16.8开始,Hooks出现

  • Hooks出现后,类组件并没有移除,还是可以使用
  • Hooks出现有,不能把函数成为无状态组件
  • Hooks只能在函数组件中使用

Hooks出现解决的问题:

1,组件的状态逻辑复用

2,claas组件自身的问题

  • 告别难以理解的Class
  • 解决业务逻辑难以拆分的问题
  • 使状态逻辑复用变得简单可行
  • 函数组件在设计思想上,更加契合react理念

useState

提供一个状态,以及修改状态的方法,useState后的值表示初始化的值

// useState
// 1,导入useState函数 react
// 2,执行这个函数并且传入初始值,必须在函数组件中
// 3,[数据,修改数据的方法]
// 4,使用数据,修改数据
import { useState } from 'react'
function App () {// useState返回一个数组,如下是结构赋值的写法// 名字是可以自定义的 -> 保持语义化// 顺序不可以换,数组是有序的,第一个参数是数据状态,第二个参数就是修改数据的方法// setCount是一个函数,作用: 用于修改count状态的值,依旧保持不能直接修改原值,还是用于计算得到的新值替换原值// count和setCount是绑在一起的const [count, setCount] = useState(0)return (<div><button onClick={() => setCount(count + 1)}>{count}</button></div>)
}

更新过程:

// 当调用setCount时,更新过程// 首次渲染
/*** 首次被渲染时,组件内部的代码会被执行一次* 其中useState也会跟着执行* useState(0)初始值,只在首次渲染时生效*/// 更新渲染
/*** setCount都会更新* APP组件会再次渲染,这个函数会再次执行* useState再次执行得到的新的count执行不是0,而是修改后的1,模板会使用新值*/

useState调用多次,初始化多个状态

function App () {const [count, setCount] = useState(0)const [flag, setFlag] = useState(true)const [list, setList] = useState([1, 2, 3])console.log(count)return (<div><button onClick={() => setCount(count + 1)}>{count}</button>{list.map(item => <h2 key={item}>{item}</h2>)}</div>)
}

注意事项:

  • 只能出现在函数组件中

  • 不能嵌套在if/for/其他函数中(react按照hooks的调用顺序识别每一个hook),如下是错误写法

    let name = 'seek'
    function Show(){name = 'seek18'// 错误写法if (name = 'seek18'){const [age,setAge] = useState(18)}const [flag,setFlag] = useState(true)
    }
    

    可以通过开发者工具查看hook状态

在这里插入图片描述

useEffect

函数的副作用:

一个函数除了主作用,其他的作用就是副作用,对于react组件来说,主作用就是根据数据渲染UI,除此以外都是副作用(例如:手动修改DOM)

常见的副作用:

  • ajax请求
  • 手动修改dom
  • localstorage操作

useEffect函数的作用就是为react函数组件提供副作用处理

import { useEffect, useState } from 'react'// 在修改数据后,把count值放到页面标题中
// 1,导入useEffect函数
// 2,在函数组件中执行
// 3,当我们通过修改状态更新组件时,副作用也不断执行
function App () {const [count, setCount] = useState(0)useEffect(() => {document.title = count})return (<div><button onClick={() => setCount(count + 1)}>{count}</button></div>)
}export default App

通过依赖项,控制执行实际

1,默认状态
2,添加一个空数组
3,依赖特性项
function App () {const [count, setCount] = useState(0)const [name, setName] = useState('seek')// 默认:组件第一次渲染以及每次更新执行useEffect(() => {document.title = countconsole.log('每次执行')})// 只会在首次渲染执行useEffect(() => {console.log('first console')}, [])// 添加特定的依赖项,表示只有修改count才会执行,后面是一个数组useEffect(() => {console.log('count console')}, [count])// 同时修改count和name,或者只改一个都会执行useEffect(() => {console.log('count console')}, [count,name])return (<div><button onClick={() => setCount(count + 1)}>{count}</button><button onClick={() => setName(name + 'a')}>{name}</button></div>)
}

注意事项:

useEffect 回调函数中用到的数据(比如,count)就是依赖数据,就应该出现在依赖项数组中,如果不添加依赖项就会有bug出现

hook的出现,就是不想用生命周期概念,也可以写业务代码

自定义hook函数

自定义一个hook函数,实现获取滚动距离Y,const [y] = useWindowScroll()

import { useEffect, useState } from 'react'function useWindowScroll () {const [y, setY] = useState(0)window.addEventListener('scroll', () => {const h = document.documentElement.scrollTopsetY(h)})return [y]
}function App () {const [y] = useWindowScroll()return (<div style={{ height: '12000px' }}>{y}</div>)
}export default App

自定义hook函数,可以自动同步到本地LocalStorage

const [message, setMessage] = useLocalStorage(key,defaultValue)

function useLocalStorage (key, defaultValue) {const [message, setMessage] = useState(defaultValue)useEffect(() => {window.localStorage.setItem(key, message)}, [key, message])return [message, setMessage]
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二章:微服务架构构建

第二章&#xff1a;微服务架构构建 2.1&#xff1a;IDEA新建project工作空间 父工程步骤 New Project 聚合总父工程名字 Maven版本选择 字符编码 注解生效激活 Java编译版本选择8 父工程pom文件 <?xml version"1.0" encoding"UTF-8"?&g…

谷粒商城 nacos

下载nacos&#xff1a;https://github.com/alibaba/nacos/releases启动 startup.cmd -m standalone依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></depende…

(附源码)计算机毕业设计ssm大学生健康系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Vue学习第37天——.sync修饰符、$attrs和$listeners属性的使用场景和案例

目录一、.sync修饰符作用使用场景使用方法案例.sync修饰符的优势二、$attrs作用使用场景使用方法案例$attrs注意点三、$listeners作用使用场景使用方法案例$listeners注意点一、.sync修饰符 作用 之前组件进行双向绑定时&#xff0c;需要通过proos进行父传子&#xff0c;再通…

Python 实现DNS查询放大攻击

查询放大攻击的原理是&#xff0c;通过网络中存在的DNS服务器资源&#xff0c;对目标主机发起的拒绝服务攻击&#xff0c;其原理是伪造源地址为被攻击目标的地址&#xff0c;向DNS递归服务器发起查询请求&#xff0c;此时由于源IP是伪造的&#xff0c;固在DNS服务器回包的时候&…

六自由度模拟飞行C++教程

六自由度模拟飞行C教程 带引导、控制和导航 课程英文名&#xff1a;Flight Dynamics in Six Degrees of Freedom 此视频教程共14.5小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全 下载地址 百度网盘地址&#xff1a;https://pan.baidu.com…

云原生|kubernetes|k8s集群测试时的一些基本操作

前言&#xff1a; kubernetes集群作为一个能够明显提升生产力的工具&#xff0c;还是需要多多练习一些基本操作的&#xff0c;我说的基本操作主要是针对基本的测试环节而不是生产环境下的操作。例如&#xff0c;在生产环境下用命令行启动一个pod并通过NodePort把这个pod运行的…

前端性能优化 - 华为面试题

前端性能优化面试题 前端性能优化总体来说分为 &#xff1a;优化请求、打包优化、代码优化 。 文章目录前端性能优化面试题Ⅰ、如何优化请求图片方面① 精灵图 ② 小图标 Base64③ 图片懒加载④ 图标库 采用 svg请求内容方面 ① 减少请求内容大小 ②更改请求方式③ 防抖节流④…

PyCharm 的初始设置

PyCharm 的官方网站地址&#xff1a;https://www.jetbrains.com/pycharm/ 教育版下载地址&#xff1a;https://www.jetbrains.com/pycharm-edu/download/#sectionlinux 专业版下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionlinux 1、恢复 PyCharm …

视觉里程计

2D-2D&#xff1a;对极几何 C0, C1分别是两个位置中相机的光心&#xff0c;也就是针孔相机模型中的针孔 P是空间中的一个三维点&#xff0c;p0, p1分别是P点在不同成像平面上对应的像素点 C0-C1-P-p0-p1他们都是在同一个平面上的&#xff0c;你可以想象C0-C1-P组成的平面是一个…

5_循环神经网络 RNN

RNN什么是RNN序列数据处理序列数据的神经网络RNN弊端LSTM什么是RNN 循环神经网络RNN用于语言分析, 序列化数据。 序列数据 有一组序列数据 data 0,1,2,3. 在当预测 result0 的时候,我们基于的是 data0, 同样在预测其他数据的时候, 我们也都只单单基于单个的数据. 每次使用的…

零基础小白复现Java 若依项目

若依项目1 概述2 环境配置3 打包项目4 导入项目5 配置项目数据库连接&#xff0c;数据源配置6 然后运行代码1 概述 RuoYi-Vue 是一个 Java EE 企业级快速开发平台&#xff0c;基于经典技术组合&#xff08;Spring Boot、Spring Security、MyBatis、Jwt、Vue&#xff09;&#x…

redis常用命令,redis入门,启动redis,启动哨兵

Redis服务器默认使用6379号端口&#xff0c;通过–port参数可以自定义端口号&#xff1a; 正确停止Redis的方式应该是向Redis发送SHUTDOWN命令&#xff0c;方法为&#xff1a; Redis可以妥善处理SIGTERM信号&#xff0c;所以使用kill Redis进程的PID也可以正常停止Redis&#…

yolov3 spp讲解

1、yolov3 spp各个版本对比 yolov3 spp版本主要在以下几个方面做了改进&#xff1a;(1)、Mosaic图像增强&#xff1b;&#xff08;2&#xff09;、SPP模块&#xff1b;&#xff08;3&#xff09;、CIOU Loss ;&#xff08;4&#xff09;、Focal Loss . 2、Mosaic图像增强 Mosai…

聊一聊ShardingSphere的读写分离

什么是 ShardingSphere Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。 ShardingSphere-JDBC ShardingSphere-JDBC 定位为轻量级 Java 框架&…

【 uniapp 】打包Android的apk(原生APP-云打包),及发布测试

前言&#xff1a; 跨端(小程序、Android、IOS)项目开发好了&#xff0c;我们如何去利用 uniapp 的云打包去打包 apk 文件&#xff0c;然后上传测试呢&#xff1f;今天我们一起来学习一下&#xff0c;一步一步如何实现&#xff01; 目录 一、 打包 Android &#xff0c;生成apk…

猿创征文|TiDB架构解析和注意事项

TiDB 简介 TiDB是一款开源的分布式HTAP数据库&#xff0c;同事支持TP&#xff08;Transactional Processing&#xff09;的在线事务处理&#xff0c;也支持AP&#xff08;Analytical Processing&#xff09;的在线分析处理。 实际使用下来的感受&#xff1a;TP场景的高并发确实…

修建金字塔-第12届蓝桥杯Scratch省赛3真题第4题

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第42讲。 第12届蓝桥杯青少年组省赛分两次进行&#xff0c;这是2021年4月24日举行的第二次省赛考试初级组&#xff0c;形式为在线考试。Scratch分为初级组和中…

Redis常用数据类型:String、List、Set(待补充。。。)

文章目录Redis键&#xff08;key&#xff09;字符串&#xff08;String&#xff09;常用命令String的数据结构列表&#xff08;List&#xff09;常用命令List的数据结构集合&#xff08;Set&#xff09;常用命令Set的数据结构Redis键&#xff08;key&#xff09; 基本命令 key…

EPCNSA方式引入5G

VoG 短信和 USSD方案介绍 在 Vo5G 下&#xff0c;无论 VoNR、EPS FB、VoeLTE或 RAT FB&#xff0c;短信和 USSD均借助 5GC 和 IMS来实现&#xff1a; 短信通过 SMS over IMS 实现&#xff0c;可参考 3GPP TS 23.204&#xff1b; 补充业务修改通过 XCAP/Ut 接口实现&#xff…