共计 3416 个字符,预计需要花费 9 分钟才能阅读完成。
react-query
这是一个实用于 react hooks
的申请库。
这个库将帮忙你获取、同步、更新和缓存你的近程数据,
提供两个简略的 hooks,就能实现增删改查等操作
react-query
一些配置参数
staleTime
从新获取数据的工夫距离 默认0
cacheTime
数据缓存工夫 默认 1000 60 5 5 分钟retry
失败重试次数 默认 3 次refetchOnWindowFocus
窗口从新取得焦点时从新获取数据 默认 falserefetchOnReconnect
网络从新链接refetchOnMount
实例从新挂载enabled
如果为“false”的化,“useQuery”不会触发,须要应用其返回的“refetch”来触发操作
如何全局配置呢?如下:
import {ReactQueryConfigProvider, ReactQueryProviderConfig} from 'react-query';
const queryConfig: ReactQueryProviderConfig = {
/**
* refetchOnWindowFocus 窗口取得焦点时从新获取数据
* staleTime 过多久从新获取服务端数据
* cacheTime 数据缓存工夫 默认是 5 * 60 * 1000 5 分钟
*/
queries: {
refetchOnWindowFocus: true,
staleTime: 5 * 60 * 1000,
retry: 0
},
};
ReactDOM.render(<ReactQueryConfigProvider config={queryConfig}>
<App />
</ReactQueryConfigProvider>
document.getElementById('root')
);
也能够独自配置,如下:
function Todos() {
// 第三个参数即可传参了
// "enabled" 参数为 false 的化,不会主动发动申请,而是须要调用“refetch”来触发
const {
isIdle,
isLoading,
isError,
data,
error,
refetch,
isFetching,
} = useQuery('todos', fetchTodoList, {enabled: false,})
return (
<>
<button onClick={() => refetch()}>Fetch Todos</button>
{isIdle ? ('Not ready...') : isLoading ? (<span>Loading...</span>) : isError ? (<span>Error: {error.message}</span>
) : (
<>
<ul>
{data.map(todo => (<li key={todo.id}>{todo.title}</li>
))}
</ul>
<div>{isFetching ? 'Fetching...' : null}</div>
</>
)}
</>
)
}
useQuery(查)
详见
根本应用办法
function Todos() {
// useQuery 的第一个参数,作为 useQuery 查问的惟一标识,该值惟一
// 能够是 string、array、object
// string -> useQuery('todos', ...) queryKey === ['todos']
// array -> useQuery(['todo', 5], ...) queryKey === ['todo', 5]
// object -> useQuery(['todo', 5, { preview: true}], ...) queryKey === ['todo', 5, { preview: true}]
const {isLoading, isError, data, error} = useQuery('todos', fetchTodoList)
if (isLoading) {return <span>Loading...</span>}
if (isError) {return <span>Error: {error.message}</span>
}
// also status === 'success', but "else" logic works, too
return (
<ul>
{data.map(todo => (<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
传递参数
function Todos({completed}) {// useQuery(['todo', { status: 1, page: 1}], ...) queryKey === ['todo', { status: 1, page: 1}]
// 传递参数给“fetchTodoList”应用
const queryInfo = useQuery(['todos', { status: 1, page: 1}], fetchTodoList)
}
// 函数参数
// key ->“todos”// status -> 1 page -> 1
function fetchTodoList(key, { status, page}) {return new Promise()
// ...
}
该库实现了罕用的查问操作:
- 分页查问
- 有限滚动
useMutation(增、改、删)操作
// 当“mutate()”被调用时,执行“pingMutation”const PingPong = () => {const [mutate, { status, data, error}] = useMutation(pingMutation)
const onPing = async () => {
try {const data = await mutate()
console.log(data)
} catch {}}
return <button onClick={onPing}>Ping</button>
}
传递参数
// "mutate({title})" 就会将参数“title”传递给“createTodo”函数了
const createTodo = ({title}) => {console.log("title", title)
}
const CreateTodo = () => {const [title, setTitle] = useState('')
const [mutate] = useMutation(createTodo)
const onCreateTodo = async e => {e.preventDefault()
try {await mutate({ title})
// Todo was successfully created
} catch (error) {// Uh oh, something went wrong}
}
return (<form onSubmit={onCreateTodo}>
<input
type="text"
value={title}
onChange={e => setTitle(e.target.value)}
/>
<br />
<button type="submit">Create Todo</button>
</form>
)
}
革除缓存
比方当咱们编辑完一篇文章,返回列表页面,如果不革除缓存,那么数据还是缓存的数据,
所以须要革除缓存,使得“userQuery”生效,回到列表页的时候从新拉取最新数据
queryCache invalidateQueries
import {useMutation, useQueryCache} from 'react-query'
const queryCache = useQueryCache()
const [mutate] = useMutation(addTodo, {onSuccess: () => {
// invalidateQueries 的匹配规定
// eg:
// queryCache.invalidateQueries('todos') 那么如下两个 `query key` 都会被匹配到,匹配到的缓存都会生效
// const todoListQuery = useQuery('todos', fetchTodoList)
// const todoListQuery = useQuery(['todos', { page: 1}], fetchTodoList)
queryCache.invalidateQueries('todos')
queryCache.invalidateQueries('reminders')
},
})
以上就是“react-query”应用的一些基本操作
正文完