Hook 简介
参考官网----https://react.docschina.org/docs/hooks-overview.html
由于组件类存在以下缺点:
- 大型组件很难拆分和重构,也很难测试
- 业务逻辑分散在组件的各个方法之中,导致重复逻辑或关联逻辑
- 组件类引入了复杂的编程模式,比如
render props 和高阶组件
因此React 16.8 新增特性Hook 。它可以让你在不编写 class 组件的情况下使用 state 以及其他的 React 特性。
React 团队建议在编写组件时尽量使用函数组件。如下:
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
但是,这种写法有重大限制:函数组件必须是纯函数,不能包含状态,也不支持生命周期方法,因此无法取代类。 React Hooks 的设计目的,就是加强版函数组件,完全不使用"类",就能写出一个全功能的组件。
useState Hook
useState 会返回一对值:当前状态和一个让你更新它的函数,你可以在事件处理函数中或其他一些地方调用这个函数。返回的更新函数类似 class 组件的 this.setState ,但是它不会把新的 state 和旧的 state 进行合并。例如:
const [state, setState] = useState({
count: 0,
name: 'Tom'
})
setState({
...state,
count: state.count + 1
})
完整使用示例如下:
import React, { useState } from "react";
export default function HookComponent() {
const [state, setState] = useState({
count: 0,
name: 'hjj'
})
const [word, setWord] = useState('hello Hook')
console.log(state, word)
return (
<div>
<p onClick={clickHandle}>Hook组件------》 {state.count}</p>
<p onClick={clickHandle}>Hook组件------》 {word}</p>
</div>
)
function clickHandle() {
setState({
...state,
count: state.count + 1
})
setWord('my name is Tom')
}
}
useEffect Hook
useEffect Hook 相当于componentDidMount ,componentDidUpdate 和 componentWillUnmount 这三个生命周期的组合。其用法如下:
useEffect(() => {
}, [dependencies])
上面用法中,useEffect() 接受两个参数。
- 第一个参数是一个函数,异步操作的代码放在里面。
- 第二个参数是一个数组,用于给出
Effect 的依赖项,只要这个数组发生变化,useEffect() 就会执行。第二个参数可以省略,这时每次组件渲染时,就会执行useEffect() 。
以前,放在componentDidMount 里面的代码,现在可以放在useEffect() 。
import React, { useState, useEffect } from 'react';
export function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(count)
}, [count]);
return (
<div>
<p>点击次数:{count}</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
|