react中的HOOK

react中的HOOK

react的生命周期
react的路由v6版本与v5版本的差别


前言

Hook 是⼀些可以让你在函数组件⾥“钩⼊” React state 及⽣命周期等特性的函数。
Hook 不能在 class 组件中使⽤⸺这使得你不使⽤ class 也能使⽤ React。


一、useState()

为函数式组件提供状态
useState():会返回数组,第一个是初始值(可为任何基础数据类型),第二个是修改函数。

import React, { useState } from 'react'; 
function Example() {
 // 声明⼀个叫 “count” 的 state 变量,为0。setCount修改函数。
const [count, setCount] = useState(0);
const [my, setCount] = useState({num:0});
 return ( 
	<div>
  		<p>You clicked {count} times</p> 
  		<button onClick={() => setCount(count + 1)}> Click count	</button>
  		<button onClick={() => setCount(my.num + 1)}> Click my	</button>
	</div>
 );
}

它和setState一样是异步。短时间多个更改会合并为一个。并且它是按顺序存储。所以不能放在条件判断里使用useState()。

if(true){
	const [count, setCount] = useState(0);
}
//这种是错误写法,不能放在条件判断里使用useState()。

二、useEffect()

相当于函数组件的生命周期
接收一个函数和数组当参数。函数是触发后会执行的部分,数组是需要监控的数据,数组中
它跟 class 组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 具有相同的⽤途,
只不过被合并成了⼀个 API。下面是对比的例子

给数组传值,监控数组里的值。发生变化就触发。不在数组中的数据不会影响
  //当age发生变化之后的周期
    useEffect(()=>{
    	console.log("我数据发生了变化")
  	},[age])
  	
如果没传数组,监控所有数据。相当于类组件中数据发生变化之后的周期,
  //compomentDidUpDate当 props 或 state 发生变化之后的周期
    useEffect(()=>{
    	console.log("我数据发生了变化")
  	})
  	
如果传空数组,则不监控数据,就完全相当于组件渲染之后的周期compomentDidMount
  //compomentDidMount在组件挂载之后
    useEffect(()=>{
    	console.log("我挂载了")
  	},[])
  	
还有其返回值会在组件卸载之前返回,相当于组件卸载之前的周期
   //compomentWillUnmount组件卸载之前
	useEffect(()=>{
	   console.log("我执行了")
	  return ()=>{
	   console.log("我卸载了")
	  }
	})

但要注意,渲染之后useEffect()是肯定会执行一次,上面所有例子,都会在渲染之后执行一次。如果不想页面初次渲染时执行,可以使用自定义 hook

function useDidUpdateEffect(fn, inputs) {
  const didMountRef = useRef(false);
  useEffect(() => {
    if (didMountRef.current) fn();
    else didMountRef.current = true;
  }, inputs);
}

三、useContext()

⽤来解决跨组件之间传值的问题

先使用React Context API,在组件外部建立一个 Context,使用Context.Provider标签包住后代组件,用value属性传值给后代组件。在后代组件中使用useContext(Context)获取到传递的数据。

//第⼀步我们需要创建⼀个单独的⽂件,创建我们的上下⽂对象Context并导出
const Context=createContext()
export default Context;

{/* 在⽗组件中引⼊上下⽂对象,使用Context.Provider标签来包住子组件组件,要传递的数据通过Provider提供出去*/}
import Context from './context';
import Child from "./Child"
const [count, setCount] = useState("⽗数据中的数据");
 <Context.Provider value={count}>
   <div>我是父组件</div>
   <My></My>
 </Context.Provider>

{/* 在子组件中使用useContext(Context)获取到传递的数据。 */}
import React ,{useContext}from 'react'
import Context from './context';
function Chile(){
const reContext=useContext(Context)
  return (
    <div>我是子组件,这是父组件的数据:{reContext}</div>
  )
}

总结

这是3个最基本,也是最常用的hook。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值