使用 setState 作为异步函数保存数据
use setState as asynchronous function to save data
我正在尝试更新我的 React 本机组件中的状态,我需要将此状态保存到存储中。
由于 setState 是异步的,我尝试像这样将回调传递给 setState :
setData(
{
...data,
visible: true,
color: Theme.COLORS.SUCCESS,
message: 'Vous êtes connecter avec succès.',
loading: false,
person: response,
token: response.data.token,
refreshToken: response.data.refreshToken,
},
() => {
console.log(token);
},
);
我收到了这个警告:
来自 usestate() 和 usereducer() 挂钩的状态更新不支持第二个回调参数..
如何将 setState 用作同步函数?如果不可能,还有什么选择?
你不能。但是每当你更新组件的状态时,组件将[最终]重新渲染。
如果您的目标是将组件状态持久保存到存储中,您可以采用如下方式:
class SomeComp extends React.Component {
componentDidMount() {
this.setState(localstorage.getItem('somekey'))
}
componentDidUpdate(_prevProps, _prevState, _snapshot) {
localstorage.setItem('somekey', JSON.stringify(this.state))
}
}
如果个人出于相同目的使用此挂钩:
import ls from 'local-storage'
import { useState } from 'react'
// useState, but value is retrieved from local storage first time,
// and stored in local storage when updated
const useLSBackedState = (defaultValue, localStorageKey) => {
const lsValue = ls.get(localStorageKey)
const [value, doSetValue] = useState(
lsValue === undefined ? defaultValue : lsValue
)
const setValue = value => {
if (typeof value === 'function') {
doSetValue(v => {
const newValue = value(v)
ls.set(localStorageKey, newValue)
return newValue
})
} else {
doSetValue(value)
ls.set(localStorageKey, value)
}
}
return [value, setValue]
}
// SomeComponent.js
const SomeComponent = _props => {
const [sidebarOpen, setSidebarOpen] = useLSBackedState(false, 'sidebarOpen')
// ...
}
我正在尝试更新我的 React 本机组件中的状态,我需要将此状态保存到存储中。 由于 setState 是异步的,我尝试像这样将回调传递给 setState :
setData(
{
...data,
visible: true,
color: Theme.COLORS.SUCCESS,
message: 'Vous êtes connecter avec succès.',
loading: false,
person: response,
token: response.data.token,
refreshToken: response.data.refreshToken,
},
() => {
console.log(token);
},
);
我收到了这个警告: 来自 usestate() 和 usereducer() 挂钩的状态更新不支持第二个回调参数..
如何将 setState 用作同步函数?如果不可能,还有什么选择?
你不能。但是每当你更新组件的状态时,组件将[最终]重新渲染。
如果您的目标是将组件状态持久保存到存储中,您可以采用如下方式:
class SomeComp extends React.Component {
componentDidMount() {
this.setState(localstorage.getItem('somekey'))
}
componentDidUpdate(_prevProps, _prevState, _snapshot) {
localstorage.setItem('somekey', JSON.stringify(this.state))
}
}
如果个人出于相同目的使用此挂钩:
import ls from 'local-storage'
import { useState } from 'react'
// useState, but value is retrieved from local storage first time,
// and stored in local storage when updated
const useLSBackedState = (defaultValue, localStorageKey) => {
const lsValue = ls.get(localStorageKey)
const [value, doSetValue] = useState(
lsValue === undefined ? defaultValue : lsValue
)
const setValue = value => {
if (typeof value === 'function') {
doSetValue(v => {
const newValue = value(v)
ls.set(localStorageKey, newValue)
return newValue
})
} else {
doSetValue(value)
ls.set(localStorageKey, value)
}
}
return [value, setValue]
}
// SomeComponent.js
const SomeComponent = _props => {
const [sidebarOpen, setSidebarOpen] = useLSBackedState(false, 'sidebarOpen')
// ...
}