自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上来说,它本身并不算React的特性。
举个例子:
需求:所有的组件在创建和销毁时都进行打印;
- 组件被创建:打印,组件被创建了;
- 组件被销毁:打印,组件被销毁了;
分析:如果对每个组件都搞一个useEffect来控制,未免也太繁琐了;这时候我们需要对复用的代码逻辑进行抽取。
注意:在普通function中不能使用hooks;这时候,我们自定义hook名称以use开头,变成了useLoggingLife,就可以在其中用hooks了。
import React, { useEffect } from 'react'
const Home = (props) => {
useLoggingLife("Home");
return <h2>Home</h2>
}
const Profile = (props) => {
useLoggingLife("Profile");
return <h2>Profile</h2>
}
export default function CustomLifeHookDemo01() {
useLoggingLife("CustomLifeHookDemo01")
return (
<div>
<h2>CustomLifeHookDemo1</h2>
<Home />
<Profile />
</div>
)
}
function useLoggingLife(name) {
useEffect(() => {
console.log(`${name}组件被创建出来了`);
return () => {
console.log(`${name}组件被销毁掉了`);
}
}, [])
}
抽离可复用代码
import React from 'react'
import useUserContext from '../hooks/user-hook';
export default function CustomContextShareHook() {
const [user, token] = useUserContext();
console.log(user, token);
return (
<div>
<h2>CustomContextShareHook</h2>
</div>
)
}
// user-hook
import { useContext } from "react";
import { UserContext, TokenContext } from "../App";
function useUserContext() {
const user = useContext(UserContext);
const token = useContext(TokenContext);
return [user, token]
}
export default useUserContext;