首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在useState中设置状态

在useState中设置状态
EN

Stack Overflow用户
提问于 2020-12-07 23:23:08
回答 1查看 891关注 0票数 1

如何使用来设置我的react应用程序的初始状态?

据我理解,chrome.storage.sync.get()是基于回调的,没有返回值。

我试过:

代码语言:javascript
运行
复制
chrome.storage.sync.get("tabs", (result) => {
  const [tabs, setTabs] = useState(result.tabs);
});

但这会产生一个错误,即useState声明不能嵌套在函数中。

我也试过:

代码语言:javascript
运行
复制
var init_tabs = null;
chrome.storage.sync.get("tabs", (result) => {
  init_tabs = result.tabs
});
const [tabs, setTabs] = useState(init_tabs);

但这似乎也没有影响。

我想做的事有可能吗?

编辑

您可以使用new Promise()来保证响应。

代码语言:javascript
运行
复制
const [tabs, setTabs] = useState(async () => {
  var promise = new Promise((resolve) => {
    chrome.storage.sync.get("tabs", (result) => {
      resolve(result.tabs);
    });
  });

  return await promise;
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-08 01:38:14

问题

代码语言:javascript
运行
复制
var init_tabs = null;
chrome.storage.sync.get("tabs", (result) => {
  init_tabs = result.tabs
});
const [tabs, setTabs] = useState(init_tabs);

这不起作用的原因有几个:

来自once.

  • init_tabs react钩子的
  1. 状态只在初始化后才会被重置,每个呈现周期都会被重置,而chrome.storage.sync.get则会调用每个循环,但是init_tabs = result.tabs将是无效的,因为它会在以后的呈现周期中发生。

解决方案

我不太清楚您的tabs状态对象形状是什么,而且您的基于承诺的状态初始化器看起来也可以工作,但是加载状态的一种更标准的反应方式(即习语)是在组件挂载时在useEffect钩子中执行数据“提取/加载”。它从编辑中使用了很多相同的逻辑,但更传统,不需要在承诺中进行包装。

代码语言:javascript
运行
复制
const [tabs, setTabs] = useState(/* ... some initial state ... */);

useEffect(() => {
  chrome.storage.sync.get("tabs", (result) => {
    setTabs(result.tabs);
  });
}, []); // <-- empty dependency array to run effect callback once "onMount"

从这里开始,如何在填充tabs状态时最好地处理UI呈现,这取决于您自己。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65190897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档