HOOK
简单说明
HOOK是React 16.8新增特性,是不写在class下使用state以及其他的特性
api
基础HOOK
useState
- 返回一个state以及更新该state的函数
const [state,setState] = useState(initSatate)
- 例子说明
function Counter({initialCount}) {
const [count, setCount] = useState(initialCount);
return (
<>
Count: {count}
<button onClick={() => setCount(initialCount)}>Reset</button>
<button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
<button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
</>
);
}
useEffect
- 该HOOK接受一个包含命令式、且可能有副作用代码的函数
- 更新 DOM 之后运行
- 跟 class 组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 具有相同的用途,只不过被合并成了一个 API。
- 清除effect
组件卸载时需要清除 effect 创建的诸如订阅或计时器 ID 等资源。要实现这一点,useEffect 函数需返回一个清除函数。
useEffect(() => {
const subscription = props.source.subscribe();
return () => {
// 清除订阅
subscription.unsubscribe();
};
});
//每次下次执行之前会取消上次定时器的订阅
useEffect(() => {
let num = 1;
const timer = setInterval(function(){
num = num + 1;
document.title = `You clicked ${num} times`;
},1000)
return () => {
clearInterval(timer)
}
});
- 可以给 useEffect 传递第二个参数,它是 effect 所依赖的值数组。(只有在该值发生变化时才会触发)
useConcent
- 接受一个context对象
const useContext(ThemeContex)
// App.js
export const ThemeContext = React.createContext("next");
function App() {
return (
<div className="App">
<ThemeContext.Provider value="22222">
<HelloMessage></HelloMessage>
</ThemeContext.Provider>
</div>
);
}
// index.jsx
import { ThemeContext } from "../../App.js";
const value = useContext(ThemeContext); // value="22222"
其他HOOK
useReducer
- 更复杂的useState(); 类似于redux
const [state, dispatch] = useReducer(reducer, initialArg, init);
const initialState = {count: 0};
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}
useCallback
- 返回一个回调函数 可以与React.memo 配合使用
// 当依赖项 a、b发生改变时触发
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
useMemo
- 返回一个值,当某个依赖项发生改变时触发;类似于VUE的计算属性
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
useRef
- 返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数
const refContainer = useRef(initialValue);
function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
// `current` 指向已挂载到 DOM 上的文本输入元素
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>
);
}