react16.8新增特性,它可以让你在不编写class的情况下使用state及其它react特性
hook可取代class的使用
hook产生的原因:
1.解决组件间复用状态逻辑难的问题
2.复杂组件变得难以理解
hook使用规则:
1.只能在函数最外层调用hook,不要在循环、条件判断或子函数中调用
2.只能在react得函数组件中调用hook。不要在其它JavaScript函数中调用。
3.自定义hook中也可以调用hook
规范hook使用规则的插件:
eslint-plugin-react-hooks
"react-hooks/rules-of-hooks": "error", // 检查 Hook 的规则
"react-hooks/exhaustive-deps": "warn" // 检查 effect 的依赖
useState用法:
声明变量:
const [age,setAge]=useState(42)
const [fruit,setFruit]=useState('banana')
const [todos,setTodos] = useState([{text:'学习hook'}])
单独更新值:
setFruit('orange')
hook与class的对于写法:
//HOOK写法 import React, { useState } from 'react'; function Example() { // 声明一个叫 "count" 的 state 变量 const [count, setCount] = useState(0); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); } //Class写法 class Example extends React.Component { constructor(props) { super(props); this.state = { count: 0 }; } render() { return ( <div> <p>You clicked {this.state.count} times</p> <button onClick={() => this.setState({ count: this.state.count + 1 })}> Click me </button> </div> ); } }
useEffect Hook用法:
useEffect hook可以看作componentDidMount、componentDidUpdate和componentWillUnmount这三个函数的组合。在第一次渲染之后和每次更新之后都会执行
import React, { useState, useEffect } from 'react';
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
// Specify how to clean up after this effect:
return function cleanup() {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
自定义hook:
1.必须以use开头