aHooks
Фрагменты кода организованы, это организованоaHooks
Некоторые из методов в нем, чтобы облегчить вам быстрый доступ и использование. Некоторые из методов в этой статье я обычно использую, а некоторые потому, что я лично считаю их более практичными.Что касается остальных методов, которые не были добавлены, возможно, я еще не обнаружил их преимущества.Вы можете перейти на официальный сайт, чтобы проверить это! (В следующих методах часть кода не использовалась в проекте, она напрямуюcopy
На официальном сайте будут комментарии к тем, которые вы использовали. )
!!!!! Оригинальные проект UMI крючков был интегрирован и повторно обновлен, теперь используяUmi hooks
с новыми альтернативамиaHooks
, первоначально использовалсяUmi Hooks
Одноклассники, которые не знакомы с ним, могут следить за обновлением.В основном имя импортируемого пакета было изменено, а другие были немного изменены.Я также внес некоторые изменения в следующие пункты.Вы можете обратить внимание, когда будете использовать его!
// umi hooks 的引入方式
import { useDebounce } from '@umijs/hooks';
// ahooks 的引入方式
import { useRequest } from 'ahooks';
Если вы читаете эту статью, вы также используете ееreact
изumi
Библиотеки, я настоятельно рекомендую использоватьumi Hooks
, Вкусный!
один,Async
ИзuseRequest
Асинхронный запрос данных
1. Автоматический запрос
const { data } = useRequest(
async () => {
const response = await getList();
return response;
}
);
2. Ручной запрос:manual
,run
const { data: list, run: listRequest } = useRequest(
async () => {
const response = await getList();
return response;
},
{
manual: true,
},
);
useEffect(() => {
if('某些条件'){
listRequest();
}
}, []);
3. Запрос зависимости:ready
готов к получению логического значения, значение готовности только становится истинным, оно инициирует запрос, запрос, зависящий от реализации
const { data, run, cancel } = useRequest(
async () => {
const response = await getList();
return response;
},
{
ready: Boolean(isOk),
},
);
4. Вручную приостановите запрос: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>
5. Некоторые операции, выполняемые после успешного запроса:onSuccess
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
onSuccess: res => {
// 这里的res是拿到的接口返回的所有数据
message.success('请求成功')
},
},
);
6. Некоторые действия, которые необходимо выполнить после сбоя запроса:onError
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
onError: (error) => {
// 这里的error是拿到的接口返回的错误信息
message.success('请求失败')
},
},
);
7. Во время запросаloading
const { data: authList,loading } = useRequest(
async () => {
const response = await getAuthList();
return response;
}
);
8. Если запрос не возвращается, по умолчаниюdata
данные
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
initialData:[],
},
);
9. Изменение параметра запроса инициирует запрос интерфейса:refreshDeps
refreshDeps
изменения параметра, он сработаетservice
, чтобы повторно выполнить запрос, который подходит только для простых случаев.Когда запрос должен быть запущен после некоторого суждения, рекомендуется поместить его вuseEffect
середина
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
refreshDeps:[state1,state2],
},
);
Примечание. По умолчанию он будет автоматически запрошен один раз. Если используется несколько параметров, изменения в параметрах не будут объединены для инициирования запроса.
10. Отформатируйте возвращаемый результат: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;
},
},
);
11. Напрямую изменить возвращенный интерфейсdata
данные:mutate
mutate
: может перехватывать только частьdata
или настроить возвращаемый контент в соответствии с данными, возвращаемыми интерфейсом.
formatResult
: В принципе, используется для форматирования и перестановки данных
const { data,mutate } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
onSuccess: res => {
// 这里的res是拿到的接口返回的所有数据
message.success('请求成功')
mutate([{ id: 111, name: '测试' }]);
},
},
);
12. Автоматическое выполнение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;
},
);
13. Экран фокусируется, повторно инициирует запрос,refreshOnWindowFocus
По умолчанию
false
, если установленоtrue
, запрос будет повторно инициализирован при изменении фокуса или повторном отображении экрана.
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
refreshOnWindowFocus: true
},
);
focusTimespan
: Экран перефокусирован.Если запрос каждый раз переинициируется, это не очень хорошо.Нам нужен интервал времени.В течении текущего интервала времени запрос не будет повторно инициирован.Надо настроить .refreshOnWindowFocus
использовать по умолчанию:5000
.
const { data } = useRequest(
async params => {
const response = await getList(params);
return response;
},
{
refreshOnWindowFocus: true,
focusTimespan:10000,
},
);
14. Антивибрационный интерфейс: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>
15. Дросселирование:throttleInterval
Он подходит для нескольких ручных и частых запросов на запуск, установленного перехвата дросселирования, и только один запрос интерфейса срабатывает в течение определенного периода времени.
const { data, run,cancel } = useRequest(
async () => {
const response = await getList();
return response;
},
{
manual: true,
throttleInterval: 500,
},
);
<Button.Group>
<Button onClick={run}>发起请求</Button>
</Button.Group>
16. Запрос на опрос: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
},
);
2. Защита от сотрясений и дросселирование
1. useDebounce
: Хук для обработки значения debounce
Используется для обработки значения защиты от сотрясений
Hook
import { Input } from 'antd';
import React, { useState } from 'react';
import { useDebounce } from 'ahooks';
export default () => {
const [value, setValue] = useState();
const debouncedValue = useDebounce(value, { wait: 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>
);
};
2. useDebounceFn
: Крючок, используемый для управления функцией защиты от сотрясений.
Для обработки функции стабилизации изображения
Hook
const { run: handleSubmit } = useDebounceFn(() => {
// 处理handleSubmit 函数的hooks,可以在这里处理一些判断,发起请求。当handleSubmit一定时间内被多次调用,但只在最后一次点击后的1000毫秒,会进入到函数内
}, {
wait: 1000,
},);
3. useThrottle
: Крючок используется для обработки значения значения
используется для обработки регулирования значений
Hook
import { Input } from 'antd';
import React, { useState } from 'react';
import { useThrottle } from 'ahooks';
export default () => {
const [value, setValue] = useState();
const throttledValue = useThrottle(value, {wait: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>
);
};
4. useThrottleFn
: Перехватчик для управления регулированием функций.
Используется для регулирования функции
Hook
const { run: handleSubmit } = useDebounceFn(() => {
// 处理handleSubmit 函数的hooks,可以在这里处理一些判断,发起请求。当handleSubmit一定时间内被多次调用,1000秒内只会进入到函数内1次
}, {
wait:1000
});
3. Жизненный цикл
1. useMount
: хук, который выполняется только при монтировании компонента
Метод выполняется при первом рендеринге компонента.
useMount(() => {
console.log('mount');
});
Эквивалент начальной загрузкиuseEffect
Когда нет зависимостей:
useEffect(() => {
console.log('mount');
}, []);
2. useUnmount
: только в компонентахunmount
выполняется, когдаhook
Метод выполняется, когда компонент размонтирован.
useUnmount(() => {
// 可以在卸载的时候,处理取消计时器等一些操作
console.log('卸载');
});
3. useUpdateEffect
: тот, который выполняется только при обновлении зависимостейuseEffect
hook
.
использовался раньше
useEffect
Всегда была путаница, когдаuseEffect
Независимо от того, есть зависимости или нет, в функцию войдет первый рендеринг, во избежание такой конфузной ситуации нужно использоватьif
Решение заблокировать.useUpdateEffect
Он решает эту болевую точку, он использует то же самоеuseEffect
Точно так же, за исключением того, что он игнорирует первый рендеринг и запускается только при изменении зависимостей.
использоватьЭффект:
useEffect(() => {
// 首次会运行
console.log('tabkey', tabKey);
}, [tabKey]);
использоватьобновлениеЭффект:
useUpdateEffect(() => {
// 首次不运行,只有在依赖更新的时候运行,当第二个参数为空,也不会运行
console.log('tabkey', tabKey);
}, [tabKey]);
Резюме: если вам нужно запустить в первый раз и контролировать соответствующие параметры для запуска, используйте
useEffect
, если вы хотите, чтобы результат не запускался в первый раз, а запускался только после прослушивания изменений параметров, используйтеuseUpdateEffect
.
4. Дом
1. useFullscreen
: Хук для работы с полноэкранным режимом dom.
Может обрабатывать функцию полноэкранного режима или нет
- использовать
ref
Набор элементов, которые нуждаются в полноэкранном режиме
import React from 'react';
import { Button } from 'antd';
import {useFullscreen} from 'ahooks';
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 'ahooks';
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>
);
};
2.useHover
: трекер для отслеживания того, есть ли наведение мыши на элемент domHook
можно использовать
ref
Чтобы установить элементы, которые необходимо контролировать, получить статус и выполнить некоторые операции
import React from 'react';
import { useHover } from 'ahooks';
export default () => {
const [isHovering, hoverRef] = useHover<HTMLDivElement>();
return <div ref={hoverRef}>{isHovering ? 'hover' : 'leaveHover'}</div>;
};
Он также поддерживает получение обратного вызова при наведении, поэтому вы можете выполнять различные операции на основе разных обратных вызовов.
import React from 'react';
import { useHover } from 'ahooks';
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>;
};
3.useMouse
: хук, который отслеживает положение мыши
Получить положение мыши в режиме реального времени
import React, { useMemo } from 'react';
import {useMouse} from 'ahooks';
export default () => {
const mouse = useMouse();
return <div>Mouse Pos: {JSON.stringify(mouse)}</div>;
};
4. useInViewport
: один для оценкиdom
Находится ли элемент в пределах видимого диапазонаHook
Применимо к некоторым бизнес-сценариям, если
dom
Элемент не входит в область действия, вызывая другиеdom
изменения, используяref
Отслеживайте, находится ли узел в пределах видимого диапазона, когда представление изменяется или прокручивается.
import React from 'react';
import {useInViewport} from 'ahooks';
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>
);
};
5. useSize
: один для мониторинга изменений размера узла domhook
Вы можете получить ширину и высоту элемента мониторинга в режиме реального времени.
import React from 'react';
import {useSize} from 'ahooks';
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>
);
};
6. useTextSelection
: получить текстовое содержимое и позицию, выбранную пользователем в данный момент, в режиме реального времени.
Вы можете получить выбранное текстовое значение, координаты вверх, вниз, влево и вправо, высоту, ширину
import React from 'react';
import { useTextSelection } from 'ahooks';
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>
);
};
5. Другие крючки
1. useBrowserContextCommunication
: та же страница отличаетсяtab
Синхронизация открытого состояния
использовать
Broadcast Channel API
для разных контекстов браузера (вкладки,iframe
, windows) обеспечивает простое решение.
адрес официального сайта useBrowserContextCommunication
нпм скачать:
cnpm install --save react-window-communication-hoo
Конкретный пример кода:
import React ,{ useState } from 'react'
import useBrowserContextCommunication from 'react-window-communication-hook';
const App = ()=>{
// communicationState 是一个 {lastMessage, messages} 对象,用于从其它的浏览器上下文接收数据
const [communicationState, postMessage] = useBrowserContextCommunication('channel');
const [status, setStatus] = useState('login');
// 切换事件
const logout=()=> {
setStatus('logout');
postMessage('logout');
}
const isLogout = [communicationState.lastMessage, status].includes('logout');
return (
<div>
<h1>状态:{isLogout ? '已退出' : '已登录'}</h1>
<button onClick={logout}>退出</button>
</div>
);
}
export default App;
Далее, пожалуйста, используйте вышеуказанную страницу с двумяtab
Откройте, после работы первой страницы посмотрите изменение состояния другой страницы.
2. react-use-idb: хранить данные для indexdb
параметр:
const [value, setValue] = useIdb(key, initialValue)
---
value:获取对应key 的value 值
setValue:给对应的key 设置value值
key: key键值
initialValue:默认存储的value值
нпм скачать:
cnpm install --save react-use-idb
Конкретный пример кода:
import { useIdb } from 'react-use-idb';
export default () => {
const [value, setValue] = useIdb('key', 'ccc');
return (
<div>
<div>Value: {value}</div>
<button onClick={() => setValue('aaa')}>aaa</button>
<button onClick={() => setValue('bbb')}>bbb</button>
</div>
);
};
3. @rehooks/online-status: используется для получения текущего статуса сети.
useOnlineStatus
Используется для получения текущего состояния сети, возвратаtrue / false
нпм скачать:
cnpm install --save @rehooks/online-status
Конкретный пример кода:
import { React } from 'react'
import useOnlineStatus from '@rehooks/online-status';
const App =()=>{
const onlineStatus = useOnlineStatus();
return (
<div>
<h1>当前网络状态 {onlineStatus ? '在线' : '离线'}</h1>
</div>
);
}
export default App;
4. Отдача: используется дляReact
библиотека управления состоянием
Recoil
при условии оReact
обработка состояния, упрощающая унификацию состояния родительских и дочерних компонентов, подобноredux
Сценарии использования (цитируя объяснение Руан Да):
某个组件的状态,需要共享
某个状态需要在其他组件可以拿到
一个组件需要改变全局状态
一个组件需要改变另一个组件的状态
Однако у них есть общая предпосылка, то есть они должны быть обернуты общим корневым компонентом, и все компоненты под корневым компонентом могут совместно использовать состояние.Без лишних слов, вот код:
нпм скачать:
cnpm install recoil
- RecoilRoot
Использование компонентов
Recoil
Состояние должно быть обернуто вокруг него доRecoilRoot
компоненты. Его можно разместить непосредственно вне корневого компонента коротким и плавным образом:
import React from 'react';
import { Card } from 'antd';
import { RecoilRoot } from 'recoil';
import Test from './test';
import Test2 from './test2';
import Test3 from './test3';
const App = () => {
return (
<RecoilRoot>
<Test />
<Test2 />
<Test3 />
</RecoilRoot>
);
};
export default App;
2.atom
atom
Представляет собой небольшую часть состояния.atom
Может быть прочитан и записан в любом компоненте. чтение компонентаatom
Данные будут неявно подписаны на него, и любое обновление приведет к повторному рендерингу подписанного на него компонента.
import { atom } from 'recoil';
export const atomTermId = atom({
key: 'termId', // 键
default: null, // 默认值
});
- useRecoilState
может читать
atom
определенное состояние, возвращая кортеж, где первый элементatom
значение, второй элементsetter
функция, которую можно вызвать с помощьюatom
Обновить до заданного значения.
import React from 'react';
import { Button, Card } from 'antd';
import { useRecoilState } from 'recoil';
const atomAuthId = atom({
key: 'accountWechatId',
default: null,
});
const Test = () => {
const [stateAuthId, setStateAuthId] = useRecoilState(atomAuthId);
const addCount = () => {
const date = new Date().getMilliseconds();
setStateAuthId(date);
};
return (
<Card>
<div style={{ marginBottom: 20 }}>Test-AuthId:{stateAuthId}</div>
<Button type="primary" onClick={addCount}>
改变-AuthId
</Button>
</Card>
);
};
export default Test;
- selector
Возвращает состояние обратной очистки с возможностью записи или только для чтения, в зависимости от параметров, переданных функции. имеют
get
а такжеset
Две функции, соответствующие get и set соответственно, поддерживают асинхронный режим.
import React from 'react';
import { Button, Card } from 'antd';
import { atom, selector, useRecoilState } from 'recoil';
const tempFahrenheit = atom({
key: 'tempFahrenheit',
default: 32,
});
// 通过 selector 的get 和 set 的执行来处理数据
const tempCelcius = selector({
key: 'tempCelcdius',
// get:手动获取或者设置后的回显都会走这里
get: ({ get }) => {
return get(tempFahrenheit) + 10; // 默认value 是 32,获取时 +10,初始默认是42
},
// set:如果不设置set ,就不能使用 useRecoilState 第二个参数来设置值
set: ({ set }, newValue) => {
return set(tempFahrenheit, newValue * 2); // 设置时value * 2
},
});
const Test = () => {
const [tempF, setTempF] = useRecoilState(tempFahrenheit);
const [tempC, setTempC] = useRecoilState(tempCelcius);
const addTenCelcius = () => setTempC(tempC);
const addTenFahrenheit = () => setTempF(tempF + 10);
return (
<>
<Card>
Temp (Celcius): {tempC}
<br />
<Button onClick={addTenCelcius}>Add 10 Celcius</Button>
<br />
</Card>
<Card>
Temp (Fahrenheit): {tempF}
<br />
<Button onClick={addTenFahrenheit}>Add 10 Fahrenheit</Button>
</Card>
</>
);
};
export default Test;
- useRecoilValue
Может использоваться, когда компонент намеревается прочитать состояние без записи в него, возвращая заданный
recoil
Ценность государства.
import React from 'react'
import {atom, selector, useRecoilValue} from 'recoil';
const App = ()=>{
//atom 状态
const namesState = atom({
key: 'namesState',
default: ['', 'Ella', 'Chris', '', 'Paul'],
});
// selector 选择器处理
const filteredNamesState = selector({
key: 'filteredNamesState',
get: ({get}) => get(namesState).filter((str) => str !== ''),
});
// 获取值
const names = useRecoilValue(namesState);
const filteredNames = useRecoilValue(filteredNamesState);
return (
<>
Original names: {names.join(',')}
<br />
Filtered names: {filteredNames.join(',')}
</>
);
}
export default App;
- useResetRecoilState
сброс настроек
recoil
Функция, значение которой является начальным значением, принимает один параметр и возвращаетrecoil
сбрасывается до значения на момент определенияdefault
стоимость
import React from 'react';
import { Button, Card } from 'antd';
import { atom, useRecoilState, useResetRecoilState } from 'recoil';
const tempFahrenheit = atom({
key: 'tempFahrenheit',
default: 32,
});
const Test = () => {
const [tempF, setTempF] = useRecoilState(tempFahrenheit);
const addTenCelcius = () => setTempC(tempC);
const addTenFahrenheit = () => setTempF(tempF + 10);
// 重置为定义时的default值
const resetList = useResetRecoilState(tempFahrenheit);
return (
<>
<Card>
Temp (Fahrenheit): {tempF}
<br />
<Button onClick={addTenFahrenheit}>Add 10 Fahrenheit</Button>
</Card>
<br />
<Button onClick={resetList}>重置tempFahrenheit</Button>
</>
);
};
export default Test;
Ниже приведен конкретный код (сокращенная версия), используемый в общем состоянии нескольких компонентов:
Структура каталога:
mods {
index.ts
可以把共用的状态放在统一的一个文件,这样方便管理,当然也可以和上面的示例一样,把recoil 值的定义放在当前页面
}
index.tsx
根目录,把RecoilRoot放到这里
test.tsx
共用状态的组件1
test2.tsx
共用状态的组件2
mods-index.ts:
import { atom } from 'recoil';
export const atomTermId = atom({
key: 'termId',
default: null,
});
export const atomAuthId = atom({
key: 'accountWechatId',
default: null,
});
корневой каталог index.tsx
import React, { useEffect } from 'react';
import { Card, } from 'antd';
import Test from './test';
import Test2 from './test2';
import { RecoilRoot, useRecoilState } from 'recoil';
import { atomAuthId, atomTermId } from './mods/index';
const State = () => {
const [stateAuthId, setStateAuthId] = useRecoilState(atomAuthId);
const [stateTermId, setStateTermId] = useRecoilState(atomTermId);
useEffect(() => {
setStateAuthId(1112);
setStateTermId(1113);
}, []);
return (
<Card>
<Card>
<p>index页面-- 初始值:</p>
<p>stateAuthId:{stateAuthId}</p>
<p>stateTermId:{stateTermId}</p>{' '}
</Card>
<Test />
<Test2 />
</Card>
);
};
// 如果想在这里也能获取或设置recoil的值,那就像下面一样,把组件包一层,如果不需要,那就把RecoilRoot 提到上面包裹在最外层即可
const App = () => {
return (
<RecoilRoot>
<State />
</RecoilRoot>
);
};
export default App;
test.tsx:
import React from 'react';
import { Button, Card } from 'antd';
import { atomAuthId } from './mods/index';
import { useRecoilState } from 'recoil';
const Test = () => {
const [stateAuthId, setStateAuthId] = useRecoilState(atomAuthId);
const addCount = () => {
const date = new Date().getMilliseconds();
setStateAuthId(date);
};
return (
<Card>
<div style={{ marginBottom: 20 }}>Test-AuthId:{stateAuthId}</div>
<Button type="primary" onClick={addCount}>
改变-AuthId
</Button>
</Card>
);
};
export default Test;
test2.tsx:
import React from 'react';
import { Card, Button } from 'antd';
import { atomTermId } from './mods/index';
import { useRecoilState } from 'recoil';
const Test = () => {
const [stateTermId, setStateTermId] = useRecoilState(atomTermId);
const addCount = () => {
const date = new Date().getMilliseconds();
setStateTermId(date);
};
return (
<Card>
<div style={{ marginBottom: 20 }}>Test2-TermId:{stateTermId}</div>
<Button type="primary" onClick={addCount}>
更新-TermId
</Button>
</Card>
);
};
export default Test;
Отображение страницы:
Примечание:
recoil
Документация еще не очень полная.Я рекомендую вам те, которыми я пользовался в первую очередь.В дальнейшем, когда документация будет обновлена, я продолжу ее обновлять!
Далее я буду продолжать обновлять все больше и больше полезных крючков!