reactjs - 我无法在回调 axios 中更改状态(我使用了 useEffect、useState、axios)
问题描述
function User() {
const [user, setUser] = useState({})
useEffect(() => {
const user-token = window.localStorage.getItem('user-token');
const getUser = async () => {
if (user-token !== null) {
const user = await axios.get('http://localhost:5000/api/index/info')
setUser(user.data.info)
console.log(user.data.info) // server return result is what I expected: {name: "hanh", age: 20}
console.log(user) // but this is not change, it still {}
}
getUser()
}, []
}
解决方案
那是因为setUser
异步运行,并且console.log(user)
在状态更新之前被执行。
您可以useEffect
用来检查状态是否已更新。
例如:
useEffect(() => {
console.log(user)
}, [user])
每次用户更改时都会执行效果
如果您想在每次状态更改时都有一个回调,那么您可以编写 customHook 如下
function useStateWithCallBack(initlaValue, callBack) {
const [state, setState] = useState(initlaValue);
useEffect(() => callBack(state), [state]);
return [state, setState];
}
customHook
你可以在这个沙箱中找到一个这样的工作示例:
推荐阅读
- elasticsearch - Elasticsearch 主分片丢失 - 如何恢复?
- javascript - 在类中声明对象类型
- sql - 出现错误:无法将“System.Int64”类型的对象转换为“System.String”类型
- r - 仅第一次使用 for 循环进行地理编码,并放入数据帧(在 R 中)
- php - 在每个函数中使用 foreach 雄辩
- javascript - 提交包含多个事件的 AJAX 表单
- jsonschema - SpringFox 为 HATEOAS 链接生成的 JSON Schema 中 xml 键的作用是什么?
- java - 按日期属性排序对象列表
- python - 如何在 tkinter python 中动态添加多行文本?
- swift - 观看操作系统:BatteryState 的 Swift KVO 不起作用