1、Hook 是什么
官方介绍:Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。
2、Hook 的Api
1、useState 设置类组件中的state
import React
, { useState
} from "react";
function App() {
const [value
, setValue
] = useState("123");
如果初始值比较复杂,可以用一个函数包裹,返回一个复杂对象。
const [userInfo
, setUserInfo
] = useState(getUserInfo
);
return (
<div
>
<p
>value
: {value
}</p
>
<input type
="text" value
={value
} onChange
={onChangeAction
} />
<input type
="text" value
={value
} onChange
={onChangeAction()} />
</div
>
)
const onChangeAction = (ev
) => {
setValue(ev
.target
.value
);
};
const getUserInfo = ()=>{
return {
a
:1,
b
:2
}
}
}
export default App
2、useEffect 用来模拟 类组件中的各种生命周期钩子函数
import React
, { useState
, useEffect
} from "react";
...
const [value
, setValue
] = useState("123");
useEffect(()=>{
console
.log('1 useEffect run.......');
});
useEffect(()=>{
console
.log('2 useEffect run.......');
}, [value
, props
.data
]);
useEffect(()=>{
console
.log('3 useEffect run.......');
}, []);
useEffect(()=>{
console
.log('4 useEffect run.......');
console
.log(document
.querySelector('#flag').innerHTML
);
return (...rest
)=>{
console
.log('4 useEffect return func run.......');
console
.log(document
.querySelector('#flag').innerHTML
);
}
});
useEffect(()=>{
console
.log('5 useEffect run.......');
return ()=>{
console
.log('5 useEffect return func run.......');
}
}, []);
3、useRef 用来拿到DOM对象,类组件中的 React.createRef 一样。
import React
, { useRef
} from 'react'
...
let h4DOM
= useRef();
return (
<h4 ref
={h4DOM
}>test
</h4
>
)
4、useContext 提供数据的用法和类组件是一样的,不同点在于消费数据。
const [value
, setValue
] = useState(1)
<DataContext
.Provider
value
={{
value
,
setValue
,
}}
>
<div className
="app">
<One
/>
<hr
/>
<Two
/>
</div
>
</DataContext
.Provider
>
import React
, {useContext
} from 'react'
import DataContext
from '../context/DataContext'
import ThemeContext
from '../context/ThemeContext'
export default function Two() {
const context
= useContext(DataContext
);
console
.log(context
);
const context2
= useContext(ThemeContext
);
console
.log(context2
);
return (
<div
>
<h1
>{context
.value
}</h1
>
<button onClick
={()=>{
context
.setValue(context
.value
+1);
}}>修改
</button
>
</div
>
)
}
5、useCallback 该hook,保证了某一些特殊函数,只执行一次,避免过多执行而消耗性能,第一个参数是想只执行一次的函数体,第二个参数可以是函数体用到的依赖状态。
import React
, { useEffect
, useState
, useCallback
} from 'react'
const list
= [];
export default function App() {
console
.log('render.....');
const [value
, setValue
] = useState('');
const valueChange
= useCallback((ev
)=>{
console
.log(value
);
setValue(ev
.target
.value
);
}, [value
]);
useEffect(()=>{
list
.push(valueChange
);
console
.log(list
.length
);
if(list
.length
=== 2){
console
.log(list
[0] === list
[1]);
}
});
return (
<div className
="app">
<h1
>value
: {value
}</h1
>
<input type
="text" value
={value
} onChange
={valueChange
}/>
</div
>
)
}
6、useMemo 相当于计算属性,只有依赖的值发生变化,才会执行memo包裹的函数。
import React
, { useState
, useCallback
, useMemo
, memo
} from "react";
function One() {
console
.log("render............");
const [a
, setA
] = useState(1);
const [b
, setB
] = useState(2);
const [c
, setC
] = useState(3);
const list
= [];
const result
= useMemo(() => {
var result
= 100;
for (var i
= 1; i
<= a
&& i
<= b
; i
++) {
console
.log("计算最大公约数...");
if (a
% i
=== 0 && b
% i
=== 0) {
result
= i
;
}
}
return result
;
}, [a
, b
]);
console
.log(result
);
const btn1Action
= useCallback(() => {
setA((a
) => a
+ 1);
}, []);
const btn2Action
= useCallback(() => {
setB((b
) => b
+ 1);
}, []);
const btn3Action
= useCallback(() => {
setC((c
) => c
+ 1);
}, []);
return (
<div
>
<p
>A: {a
}</p
>
<p
>b
: {b
}</p
>
<p
>求
A,
B的最大公约数:
{result
}</p
>
<p
>c
: {c
}</p
>
<button onClick
={btn1Action
}>修改
A</button
>
<button onClick
={btn2Action
}>修改
B</button
>
<button onClick
={btn3Action
}>修改
C</button
>
</div
>
);
}
export default memo(One
);
7、useHistory 与 useLocation 与 useMatch 用来获取路由参数,相当于类组件中的 withRouter 高阶组件。
import React
from "react";
import { useHistory
, useLocation
,useRouteMatch
,useParams
} from "react-router-dom";
export default function Two(props
) {
const history
= useHistory();
console
.log(history
);
const location
= useLocation();
console
.log(location
);
}
8 、useSelect 与 useDispatch 与 useStore 用来获取store中的数据和方法。类组件中用到高阶组件 content
import React
from 'react'
import { useCallback
} from 'react';
import {useSelector
, useDispatch
, useStore
} from 'react-redux'
export default function One(props
) {
const val
= useSelector(state
=>{
return state
.value
;
});
const dispatch
= useDispatch();
const btnAction
= useCallback(()=>{
dispatch({type
: 'modify-value', value
: 'hello'});
}, [dispatch
]);
const store
= useStore();
console
.log(store
);
return (
<div className
="one">
<h1
>one组件
</h1
>
<h2
>{val
}</h2
>
<button onClick
={btnAction
}>修改value
</button
>
</div
>
)
}