问题
我有一个自定义钩子,用于在 'react-router-dom' 的位置和历史记录的帮助下更新url中的查询字符串。所以在组件中,每当我想添加一个新查询时,我都会使用这个钩子。在这个自定义钩子中,我使用了 useRef来避免更新自定义钩子,这样使用该钩子的组件就不会呈现,但是使用这个钩子的组件会在每次更改位置时呈现。
自定义挂钩以更新 url 中的查询字符串
import { useRef } from 'react'
import { useHistory, useLocation } from 'react-router-dom'
export const useUpdateQueryString = () => {
const history = useHistory()
const location = useLocation()
const routerRef = useRef({ search: '', pathname: '' })
useEffect(() => {
routerRef.current = { pathname: location.pathname || '', search: location.search || '' }
}, [location.pathname, location.search])
const onUpdateQueryString = useCallback((newQueryObj) => {
const newQueryParamString = setQueryStringValue(newQueryObj, routerRef.current.search)
history.push(`${routerRef.current.pathname}${newQueryParamString}`)
}, [])
return {
onUpdateQueryString
}
}
使用这个钩子的组件
import React, { useCallback } from 'react'
import { getTestQueryObj, useTestQueryString } from 'utils/query-string'
const TestComponent: React.FC = () => {
const { onUpdateQueryString } = useTestQueryString()
const handleClick = useCallback(() => {
onUpdateQueryString(getTestQueryObj())
}, [])
console.log('TestComponent rendered')
return <div onClick={handleClick}>{'Hello Component'}</div>
}
export default React.memo(TestComponent)
注意:getQueryObj是获取查询 obj 的函数,而setQueryObj是另一个获取查询 obj 并返回字符串的函数