Comments (4)
Ah I didn't realize that setGlobalState
was globally accessible, I was looking for that. Thanks!
from react-hooks-global-state.
In case anyone sees this, I came up with a wrapper, useInitialStateFromAsyncStorage
, which I use anywhere to store / get state from local storage.
const initialState = {
query: ''
}
const { useGlobalState, setGlobalState } = createGlobalState(initialState)
const useQueryState = () => {
const [query, setQuery] = useGlobalState('query')
return useInitialStateFromAsyncStorage([query, setQuery], { asyncStorageKey: 'query' })
}
I then use it like this:
const [query, setQuery] = useQueryState()
The code for useInitialStateFromAsyncStorage
is as follows:
import type { SetStateAction } from 'react'
import { useRef, useEffect } from 'react'
import AsyncStorage from '@react-native-community/async-storage'
import { useDebounce } from '@beatgig/hooks/use-debouce'
type Props<State> = [state: State, setState: (u: SetStateAction<State>) => void]
type Options = {
asyncStorageKey: string
debounce?: number
}
export default function useInitialStateFromAsyncStorage<State>(
[state, setState]: Props<State>,
{ asyncStorageKey, debounce = 200 }: Options
) {
const hasStateBeenUpdated = useRef(false)
const mounted = useRef(false)
useEffect(() => {
if (mounted.current) {
hasStateBeenUpdated.current = true
} else {
mounted.current = true
}
}, [state])
useEffect(() => {
const getFromAsyncStorage = async () => {
const fromStorage: null | string = await AsyncStorage.getItem(
asyncStorageKey
)
console.log('[use-initial-state-from-async-storage] get item', {
asyncStorageKey,
fromStorage,
})
// only set it from local storage if we haven't changed the state yet, meaning it's equal to its initial state
if (fromStorage && !hasStateBeenUpdated.current) {
let newState: { value: State } | null = null
try {
newState = JSON.parse(fromStorage)
if (newState?.value) {
hasStateBeenUpdated.current = true // not necessary but whatever
setState(newState?.value)
}
} catch (e) {
console.error(
`[use-initial-state-from-async-storage] error getting from local storage ${e}`,
{ newState }
)
}
}
}
getFromAsyncStorage()
// these will never change
}, [asyncStorageKey, setState])
const debouncedState = useDebounce(state, debounce)
const debouncedStateString = JSON.stringify({ value: debouncedState })
useEffect(() => {
if (debouncedStateString) {
console.log('[use-initial-state-from-async-storage] set item', {
asyncStorageKey,
debouncedStateString,
})
AsyncStorage.setItem(asyncStorageKey, debouncedStateString)
}
}, [asyncStorageKey, debouncedStateString])
return [state, setState] as const
}
I assume you could achieve the same with localStorage
in place of AsyncStorage
.
from react-hooks-global-state.
Hi, thanks for coming.
The first one won't work. The second one looks good.
Another option is to do it outside React. For example:
const initialState = {
query: ''
}
const { useGlobalState, setGlobalState } = createGlobalState(initialState)
(async () => {
const cachedQuery = await AsyncStorate.get('query')
if (cachedQuery) {
setGlobalState('query', cachedQuery)
}
})()
Hope it helps!
from react-hooks-global-state.
Actually, we have wiki https://github.com/dai-shi/react-hooks-global-state/wiki
Feel free to add new pages.
from react-hooks-global-state.
Related Issues (20)
- getGlobalState should not be used in render HOT 5
- Error calling createStore (Typescript 3.6.4) HOT 2
- Question: how do developers use this library? HOT 1
- Please add CHANGELOG for 0.17.0 HOT 1
- getGlobalState loses sync with useGlobalState after 0.17 HOT 8
- How to use Redux Devtools Extension HOT 3
- comparison to react-tracked and initial values for a state HOT 9
- Error: You cannot use <GlobalStateProvider> more than once. HOT 5
- How to separate reducer and Action Type then call it to combineReducers (Ex: 07_middleware) HOT 3
- Offline saved data for React Native HOT 11
- Be able to access multiple state keys with a single hook HOT 3
- Mocking useGlobalState with jest? HOT 8
- Restoring initial state from localStorage, if any? HOT 10
- global state not preserved with Fast Refresh HOT 2
- Argument of type '"cart"' is not assignable to parameter of type 'never' HOT 5
- Is it possible to change a value outside a component? HOT 2
- Persistence with createGlobalState HOT 6
- How to easily reset state? HOT 1
- How to update the state in Bulk ? HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from react-hooks-global-state.