Location
处理 window.location
,我们有一些函数来创建原子。
安装
你需要安装 jotai-location
才能使用此功能。
npm i jotai-location
atomWithLocation
atomWithLocation(options): PrimitiveAtom
atomWithLocation
创建一个新的原子,该原子链接到 window.location
。
参数
options(可选):一个选项对象,用于自定义原子的行为
选项
preloaded(可选):预加载的位置值,以避免在初始化时获取位置。
replace(可选):一个布尔值,用于指示是否使用 replaceState
而不是 pushState
。
getLocation(可选):一个自定义函数,用于获取位置值。
applyLocation(可选):一个自定义函数,用于设置位置值。
subscribe(可选):一个自定义函数,用于订阅位置更改。
示例
import { useAtom } from 'jotai'import { atomWithLocation } from 'jotai-location'const locationAtom = atomWithLocation()const App = () => {const [loc, setLoc] = useAtom(locationAtom)return (<ul><li><buttonstyle={{fontWeight: loc.pathname === '/' ? 'bold' : 'normal',}}onClick={() => setLoc((prev) => ({ ...prev, pathname: '/' }))}>Home</button></li><li><buttonstyle={{fontWeight:loc.pathname === '/foo' && !loc.searchParams?.get('bar')? 'bold': 'normal',}}onClick={() =>setLoc((prev) => ({...prev,pathname: '/foo',searchParams: new URLSearchParams(),}))}>Foo</button></li><li><buttonstyle={{fontWeight:loc.pathname === '/foo' && loc.searchParams?.get('bar') === '1'? 'bold': 'normal',}}onClick={() =>setLoc((prev) => ({...prev,pathname: '/foo',searchParams: new URLSearchParams([['bar', '1']]),}))}>Foo?bar=1</button></li></ul>)}
代码沙箱
atomWithHash
atomWithHash(key, initialValue, options): PrimitiveAtom
这将创建一个新的原子,该原子与 URL 哈希连接。 哈希必须是 URLSearchParams 格式。 这是双向绑定:更改原子值将更改哈希,更改哈希将更改原子值。 此函数仅适用于 DOM。
参数
key(必需):在与 localStorage、sessionStorage 或 AsyncStorage 同步状态时用作键的唯一字符串
initialValue(必需):原子的初始值
options(可选):一个选项对象,用于自定义原子的行为
选项
serialize(可选):一个自定义函数,用于将原子值序列化为哈希。默认为 JSON.stringify
。
deserialize(可选):一个自定义函数,用于将哈希反序列化为原子值。默认为 JSON.parse
。
subscribe(可选):自定义哈希更改订阅函数
setHash(可选):replaceState
或一个自定义函数,描述浏览器端如何更新哈希。默认为通过 window.location.hash = searchParams
将新条目推送到历史记录(jotai-location#4)
示例
import { useAtom } from 'jotai'import { atomWithHash } from 'jotai-location'const countAtom = atomWithHash('count', 1)const Counter = () => {const [count, setCount] = useAtom(countAtom)return (<div><div>count: {count}</div><button onClick={() => setCount((c) => c + 1)}>+1</button></div>)}
代码沙箱
删除项目
请参考 atomWithStorage 关于删除项目的使用方法。