Umi Hooks
的代碼片斷整理,這篇是整理了Umi Hooks
中的一部分方法,爲了方便本身快速查閱和使用。此文中的方法,一部分是本身比較經常使用的,一部分是我我的認爲比較實用,關於剩下沒有加入的方法,多是我本人尚未發現它的優勢,你們能夠移步到官網查閱哦!(下面的方法中,部分代碼沒有在項目中用過的方法,是直接copy的官網,關於本身用過的會有添加註釋,若是沒有,你們以官網的解釋爲主哦!)react
若是看到這篇文的你,剛好也是也在用react
的umi
庫的小夥伴,我是大力推薦使用umi Hooks
,真香!地址奉上bash
Async
之 useRequest
異步數據請求const { data } = useRequest(
async () => {
const response = await getList();
return response;
}
);
複製代碼
manual
、run
const { data: list, run: listRequest } = useRequest(
async () => {
const response = await getList();
return response;
},
{
manual: true,
},
);
useEffect(() => {
if('某些條件'){
listRequest();
}
}, []);
複製代碼
cancel
const { data, run, cancel } = useRequest(
async () => {
const response = await getList();
return response;
},
{
manual: true,
},
);
<Button.Group>
<Button onClick={run}>開始請求</Button>
<Button onClick={cancel}>中止請求</Button>
</Button.Group>
複製代碼
refresh
使用上一次的
params
,從新執行service
antd
const { data, run,cancel,refresh } = useRequest(
async () => {
const response = await getList();
return response;
},
{
manual: true,
},
);
<Button.Group>
<Button onClick={run}>開始請求</Button>
<Button onClick={cancel}>中止請求</Button>
<Button onClick={refresh}>刷新</Button>
</Button.Group>
複製代碼
onSuccess
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
onSuccess: res => {
// 這裏的res是拿到的接口返回的全部數據
message.success('請求成功')
},
},
);
複製代碼
onError
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
onError: (error) => {
// 這裏的error是拿到的接口返回的錯誤信息
message.success('請求失敗')
},
},
);
複製代碼
loading
const { data: authList,loading } = useRequest(
async () => {
const response = await getAuthList();
return response;
}
);
複製代碼
data
數據const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
initialData:[],
},
);
複製代碼
refreshDeps
refreshDeps
參數變化,會觸發service
,從新執行請求,只適用於簡單狀況,當須要通過一些判斷再觸發請求時,建議仍是放在useEffect
中dom
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
refreshDeps:[state1,state2],
},
);
複製代碼
注意:默認會自動請求一次,當依賴多個參數時,並不會合併參數的變化發起請求異步
formatResult
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
formatResult: (res) => {
// 這裏的res是拿到的接口返回的數據
const list = [];
res.forEach(item => {
list.push(item.id);
});
return list;
},
},
);
複製代碼
data
數據:mutate
mutate
:可能只截取一部分的data
,或者根據接口返回的數據,自定義返回內容。formatResult
:原則上是用來作格式化,對數據進行從新整理async
const { data,mutate } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
onSuccess: res => {
// 這裏的res是拿到的接口返回的全部數據
message.success('請求成功')
mutate([{ id: 111, name: '測試' }]);
},
},
);
複製代碼
run
的時候,默認帶上的參數:defaultParams
只適用於初始 + 自動請求帶的參數函數
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
defaultParams: [{ id: defaultList }],
},
);
複製代碼
如下的寫法也能夠:測試
const { data } = useRequest(
async () => {
const response = await getList({ id: defaultList });
return response;
},
);
複製代碼
refreshOnWindowFocus
默認爲
false
,若是設置爲true
,在屏幕從新聚焦或從新顯示時,會從新發起請求。ui
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
refreshOnWindowFocus: true
},
);
複製代碼
focusTimespan
: 屏幕從新聚焦,若是每次都從新發起請求,不是很好,咱們須要有一個時間間隔,在當前時間間隔內,不會從新發起請求,須要配置refreshOnWindowFocus
使用,默認:5000
。this
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
refreshOnWindowFocus: true,
focusTimespan:10000,
},
);
複製代碼
debounceInterval
適用於屢次手動頻繁請求
run
,設置的防抖攔截,最後一次請求發起後的n秒後,纔會發起真正的接口請求
const { data, run,cancel } = useRequest(
async () => {
const response = await getList();
return response;
},
{
manual: true,
debounceInterval: 500,
},
);
<Button.Group>
<Button onClick={run}>發起請求</Button>
</Button.Group>
複製代碼
throttleInterval
適用於屢次手動頻繁請求run,設置的節流攔截,必定時間內只觸發一次接口請求
const { data, run,cancel } = useRequest(
async () => {
const response = await getList();
return response;
},
{
manual: true,
throttleInterval: 500,
},
);
<Button.Group>
<Button onClick={run}>發起請求</Button>
</Button.Group>
複製代碼
pollingInterval
設置後會進入輪詢模式,定時觸發函數執行
const { data, run,cancel } = useRequest(
async () => {
const response = await getList();
return response;
},
{
pollingInterval: 500,
},
);
複製代碼
pollingWhenHidden
:屏幕隱藏時是否會繼續輪詢,默認爲true
,當屏幕不可見時,再發起輪詢任務就很浪費,能夠設置,當屏幕不可見,暫停定時任務
const { data, run,cancel } = useRequest(
async () => {
const response = await getList();
return response;
},
{
pollingInterval: 500,
pollingWhenHidden: false
},
);
複製代碼
useDebounce
:用來處理防抖值的 Hook用來處理防抖值的
Hook
import { Input } from 'antd';
import React, { useState } from 'react';
import { useDebounce } from '@umijs/hooks';
export default () => {
const [value, setValue] = useState();
const debouncedValue = useDebounce(value, 500);
return (
<div>
<Input
value={value}
onChange={e => setValue(e.target.value)}
placeholder="Typed value"
style={{ width: 280 }}
/>
<p style={{ marginTop: 16 }}>DebouncedValue: {debouncedValue}</p>
</div>
);
};
複製代碼
useDebounceFn
:用來處理防抖函數的 Hook用來處理防抖函數的
Hook
const { run: handleSubmit } = useDebounceFn(() => {
// 處理handleSubmit 函數的hooks,能夠在這裏處理一些判斷,發起請求。當handleSubmit必定時間內被屢次調用,但只在最後一次點擊後的1000毫秒,會進入到函數內
}, 1000);
複製代碼
useThrottle
:用來處理值節流的Hook用來處理值節流的
Hook
import { Input } from 'antd';
import React, { useState } from 'react';
import { useThrottle } from '@umijs/hooks';
export default () => {
const [value, setValue] = useState();
const throttledValue = useThrottle(value, 500);
return (
<div>
<Input
value={value}
onChange={e => setValue(e.target.value)}
placeholder="Typed value"
style={{ width: 280 }}
/>
<p style={{ marginTop: 16 }}>throttledValue: {throttledValue}</p>
</div>
);
};
複製代碼
useThrottleFn
:用來處理函數節流的Hook用來處理函數節流的
Hook
const { run: handleSubmit } = useDebounceFn(() => {
// 處理handleSubmit 函數的hooks,能夠在這裏處理一些判斷,發起請求。當handleSubmit必定時間內被屢次調用,1000秒內只會進入到函數內1次
}, 1000);
複製代碼
useMount
:只在組件 mount 時執行的 hook在組件首次渲染時,執行方法。
useMount(() => {
console.log('mount');
});
複製代碼
等同於初次加載的useEffect
沒有依賴的時候:
useEffect(() => {
console.log('mount');
}, []);
複製代碼
useUnmount
:只在組件unmount
時執行的hook
在組件卸載時,執行方法。
useUnmount(() => {
// 能夠在卸載的時候,處理取消計時器等一些操做
console.log('卸載');
});
複製代碼
useUpdateEffect
:一個只在依賴更新時執行的 useEffect
hook
。以前用
useEffect
的時候,一直有一個困惑,就是useEffect
不管是否有依賴項,首次渲染都會進入到函數內,爲了不這樣尷尬的狀況,每次都須要用if
判斷來攔截。useUpdateEffect
就解決了這個痛點,它在使用上同useEffect
徹底同樣,只是它忽略了首次渲染,且只在依賴項變化時進行運行。
useEffect:
useEffect(() => {
// 首次會運行
console.log('tabkey', tabKey);
}, [tabKey]);
複製代碼
useUpdateEffect:
useUpdateEffect(() => {
// 首次不運行,只有在依賴更新的時候運行,當第二個參數爲空,也不會運行
console.log('tabkey', tabKey);
}, [tabKey]);
複製代碼
總結:若是你須要首次運行,監聽到相應參數也運行,那就用
useEffect
,若是你想要的結果是首次不運行,只有在監聽到參數變化後再運行,那就用useUpdateEffect
。
useFullscreen
:一個用於處理 dom 全屏的 Hook可處理是否全屏的功能
ref
設置須要全屏的元素import React from 'react';
import { Button } from 'antd';
import {useFullscreen} from '@umijs/hooks';
export default () => {
const { ref, isFullscreen, setFull, exitFull, toggleFull } = useFullscreen<HTMLDivElement>();
return (
<div ref={ref} style={{ background: 'white' }}>
<div style={{ marginBottom: 16 }}>{isFullscreen ? 'Fullscreen' : 'Not fullscreen'}</div>
<Button.Group>
<Button onClick={setFull}>setFull</Button>
<Button onClick={exitFull}>exitFull</Button>
<Button onClick={toggleFull}>toggle</Button>
</Button.Group>
</div>
);
};
複製代碼
function
來監放任意的 dom 節點可用於圖片,指定元素的全屏
import React from 'react';
import { Button } from 'antd';
import {useFullscreen} from '@umijs/hooks';
import img from './react-hooks.jpg';
export default () => {
const { setFull } = useFullscreen<HTMLElement>({
dom: () => document.getElementById('fullscreen-img'),
});
return (
<div style={{ background: 'white' }}>
<div style={{ marginBottom: 16 }}>
<img id="fullscreen-img" src={img} style={{ width: 320 }} alt="" />
</div>
<Button onClick={setFull}>setFull</Button>
</div>
);
};
複製代碼
useHover
: 一個用於追蹤dom 元素是否有鼠標懸停的Hook
可使用
ref
來設置須要監聽的元素,並獲取到狀態,進行一些操做
import React from 'react';
import { useHover } from '@umijs/hooks';
export default () => {
const [isHovering, hoverRef] = useHover<HTMLDivElement>();
return <div ref={hoverRef}>{isHovering ? 'hover' : 'leaveHover'}</div>;
};
複製代碼
一樣也支持拿到懸停的回調,這樣你能夠根據不一樣回調來執行不一樣操做
import React from 'react';
import { useHover } from '@umijs/hooks';
export default () => {
const [isHovering] = useHover({
dom: () => document.getElementById('hover-div'),
onEnter: () => {
console.log('onEnter');
},
onLeave: () => {
console.log('onLeave');
},
});
return <div id="hover-div">{isHovering ? 'hover' : 'leaveHover'}</div>;
};
複製代碼
useMouse
:一個跟蹤鼠標位置的Hook能夠實時拿到鼠標的位置
import React, { useMemo } from 'react';
import {useMouse} from '@umijs/hooks';
export default () => {
const mouse = useMouse();
return <div>Mouse Pos: {JSON.stringify(mouse)}</div>;
};
複製代碼
useInViewport
:一個用於判斷dom
元素是否在可視範圍以內的 Hook
適用於有些業務場景,若是一個
dom
元素不在但是範圍以內,觸發其餘dom
的變化,使用ref
監聽節點在視圖變化或者滾動時是否在可視範圍以內
import React from 'react';
import {useInViewport} from '@umijs/hooks';
export default () => {
const [inViewPort, ref] = useInViewport<HTMLDivElement>();
// 一樣可使用id來設置綁定元素
// const [inViewPort] = useInViewport(() => document.querySelector('#demo2'));
return (
<div>
<div ref={ref} id="dome2">observer dom</div>
<div style={{ marginTop: 70, color: inViewPort ? '#87d068' : '#f50' }}>
{inViewPort ? 'visible' : 'hidden'}
</div>
</div>
);
};
複製代碼
useSize
:一個用於監聽dom節點尺寸變化的hook
能夠實時拿到監聽元素的寬、高
import React from 'react';
import {useSize} from '@umijs/hooks';
export default () => {
const [state] = useSize(document.querySelector('body'));
// 一樣能夠用id來綁定:
// const [state] = useSize(() => document.querySelector('#demo2'));
return (
<div id="demo2">
this demo is listening to body size change, try to resize the window instead <br />
dimensions -- width: {state.width} px, height: {state.height} px
</div>
);
};
複製代碼
useTextSelection
:實時獲取用戶當前選取的文本內容及位置能夠拿到選取的文本值、上下左右座標、高度、寬度
import React from 'react';
import { useTextSelection } from '@umijs/hooks';
export default () => {
const [selection, ref] = useTextSelection();
// 經過id 來監聽
// const [{ text }] = useTextSelection(() => document.querySelector('#target-dom'));
return (
<div>
<div ref={ref}>
<p id="target-dom">
Please swipe your mouse to select any text on this paragraph.
</p>
</div>
<p>Result:{JSON.stringify(selection)}</p>
</div>
);
};
複製代碼