【react】常用的Hook

news/2024/7/15 17:40:54 标签: react.js

一、简介

Hook是React 16.8.0版本增加的新特性/新语法
可以在函数组件中使用 state 以及其他的 React 特性

二、使用

1、State Hook

(1)State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作
(2)语法: const [xxx, setXxx] = React.useState(initValue)
(3)useState()说明:

参数: 第一次初始化指定的值在内部作缓存
返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数

(4)setXxx()2种写法:

setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值

用类式组件如下:

export default class Demo extends Component {
	state = {count:0}
	add = () => {
		this.setState(state => ({count: state.count + 1}))
	}
	render() {
		return (
			<div>
				<h2>当前求和为:{this.state.count}</h2>
				<button onClick={this.add}>点我加1</button>
			</div>
		)
	}
}

用函数式组件如下:

export default function Demo() {
	const [count,setCount] = React.useState(0)
	// 其他状态也要用同样的方法
	const [name,setName] = React.useState('Jack')
	
	function add() {
		// 写法一
		// setCount(count + 1)
		// 写法二
		setCount(count => count + 1)
	}
	
	return (
		<div>
			<h2>当前求和为:{this.state.count}</h2>
			<button onClick={add}>点我加1</button>
		</div>
	)
}

Demo函数调用1+n次,每次调用const [count,setCount] = React.useState(0)都会执行,理论上count的值一直都是0,但实际上每次点击按钮count的值都会加1。那是因为React底层做了处理,第一次调用的时候就把count的值存下来了,后续再调用函数的时候不会因为传入的是0把原来的值给覆盖掉。

2、Effect Hook

(1)Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
(2)React中的副作用操作:

发ajax请求数据获取
设置订阅 / 启动定时器
手动更改真实DOM

(3)语法和说明:

useEffect(() => { 
    // 在此可以执行任何带副作用操作
    return () => { // 在组件卸载前执行
      // 在此做一些收尾工作, 比如清除定时器/取消订阅等
    }
}, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行

(4)可以把 useEffect Hook 看做如下三个函数的组合

componentDidMount()
componentDidUpdate()
componentWillUnmount() 

用类式组件如下:

export default class Demo extends Component {
	state = {count:0}
	add = () => {
		this.setState(state => ({count: state.count + 1}))
	}

	unmount = () => {
		ReactDOM.unmountComponentAtNode(document.getElementById('root'))
	}
	
	componentDidMount() {
		this.timer = setInterval(() => {
			this.setState(state => ({count:state.count + 1}))
		},1000)
	}
	
	componentWillUnmount(){
		clearInterval(this.timer)
	}
	
	render() {
		return (
			<div>
				<h2>当前求和为:{this.state.count}</h2>
				<button onClick={this.add}>点我加1</button>
				<button onClick={this.unmount}>卸载组件</button>
			</div>
		)
	}
}

用函数式组件如下:

export default function Demo() {
	const [count,setCount] = React.useState(0)
	
	React.useEffect(() => {
		let timer = setInterval(() => {
			setCount(count=> count + 1)
		},1000)
		return () => {
			clearInterval(timer)
		}
	},[])
	
	function add() {
		setCount(count => count + 1)
	}

	function unmount() {
		ReactDOM.unmountComponentAtNode(document.getElementById('root'))
	}
	
	return (
		<div>
			<h2>当前求和为:{this.state.count}</h2>
			<button onClick={add}>点我加1</button>
			<button onClick={unmount}>卸载组件</button>
		</div>
	)
}

(1)React.useEffect(() => {}),如果第二个参数没有写,会监测所有的状态,初始化以及每个状态变化的时候都会调用,相当于componentDidMountcomponentDidUpdate
(2)React.useEffect(() => {},[]),如果第二个参数是空数组,所有的状态都不会监测,执行1次(初始化),相当于componentDidMount
(3)React.useEffect(() => {},[count]),监测count值,执行1+n次(初始化以及count值变化的时候)
(4)React.useEffect(() => {})中返回一个函数,相当于componentWillUnmount

3、Ref Hook

(1)Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
(2)语法: const refContainer = useRef()
(3)作用:保存标签对象,功能与React.createRef()一样

用类式组件如下:

export default class Demo extends Component {
	myRef = React.createRef()
	show = ()=>{
		alert(this.myRef.current.value)
	}
	render() {
		return (
			<div>
				<input type="text" ref={this.myRef}/>
				<button onClick={this.show }>点击提示数据</button>
			</div>
		)
	}
}

用函数式组件如下:

export default class Demo extends Component {
	const myRef = React.useRef()
	function show() {
		alert(myRef.current.value)
	}
	render() {
		return (
			<div>
				<input type="text" ref={myRef}/>
				<button onClick={show }>点击提示数据</button>
			</div>
		)
	}
}

http://www.niftyadmin.cn/n/1556465.html

相关文章

如何在Windows电脑上打开heic图片

苹果自iOS11系统之后默认的是heic图片格式&#xff0c;在电脑和安卓中都无法直接查看&#xff0c;需要将其转换图片格式&#xff0c;如何在Windows电脑上打开heic图片&#xff1f;下面我们一起来看看吧&#xff01;使用工具&#xff1a;电脑、图片操作方法&#xff1a;1、想要打…

Sentinel 1.5.0 正式发布,引入 Reactive 支持

近日&#xff0c;流控降级组件 Sentinel 的又一个里程碑版本 1.5.0 正式发布。 该版本引入 Reactive 的支持&#xff0c;并提供多项新特性与改进。从 1.5.0 版本开始&#xff0c;Sentinel 仅支持 JDK 1.7 及以上版本&#xff0c;不再支持 JDK 1.6。现在&#xff0c;我们可以利用…

阿里巴巴的微服务开源之路

2019独角兽企业重金招聘Python工程师标准>>> 2019阿里云峰会北京开发者专场 侠之大者&#xff0c;为国为民。 在金庸小说中&#xff0c;郭靖和黄蓉是“侠之大者&#xff0c;为国为民”的典范&#xff0c;他们以布衣之身帮助宋军守护襄阳十余年。 技术的世界里&#…

java基础知识: day9-分支结构和Number类

分支结构 顺序结构只能顺序执行&#xff0c;不能进行判断和选择&#xff0c;因此需要分支结构。 Java有两种分支结构&#xff1a; if语句switch语句if语句 If语句 if(布尔表达式) {//如果布尔表达式为true将执行的语句 } 复制代码if...else语句 if(布尔表达式){//如果布尔表达式…

2018-2019-2 网络对抗技术 20165231 Exp3 免杀原理与实践

实践内容&#xff08;3.5分&#xff09; 1.1 正确使用msf编码器&#xff08;0.5分&#xff09;&#xff0c;msfvenom生成如jar之类的其他文件&#xff08;0.5分&#xff09;&#xff0c;veil-evasion&#xff08;0.5分&#xff09;&#xff0c;加壳工具&#xff08;0.5分&#…

【express】路由

一、概念 路由指的是客户端的请求与服务器处理函数之间的映射关系 Express中的路由分3部分组成&#xff0c;分别是请求的类型、请求的URL地址、处理函数&#xff0c;格式如下&#xff1a; app.METHOD(PATH,HANDLER)路由的匹配过程&#xff1a; 每当一个请求到达服务器之后&…

正则表达式,js里的正则应用

我爱撸码&#xff0c;撸码使我感到快乐&#xff01;大家好&#xff0c;我是Counter。好吧已经到凌晨了&#xff0c;其实还是蛮困的&#xff0c;体力不支了&#xff0c;想了想还是把今天任务结束掉吧&#xff0c;为期5天&#xff0c;又重新把JavaScript以及jQuery给大致过了一遍…

正则表达式的实现原理(一)

2019独角兽企业重金招聘Python工程师标准>>> 正则表达式大家已经非常熟悉&#xff0c;这里不是教大家怎么用&#xff0c;而是说明如何用代码实现正则表达式。该篇先理清正则表达式的组成结构&#xff1a; 1、正则表达式描述的是一个字符串的匹配模式&#xff0c;本质…