反应选择下拉菜单未在获取时更新

Posted

技术标签:

【中文标题】反应选择下拉菜单未在获取时更新【英文标题】:React select dropdown not updating on fetch 【发布时间】:2021-10-25 04:59:31 【问题描述】:

我在使用 React 时遇到了这个问题,我正在尝试使用存储在我的数据库中的日期呈现一个选择下拉列表。数据被成功获取并且状态也被更新,它可以被控制台记录。但是,选择下拉菜单并未按应有的方式呈现:


 function Home()
  const [userdata, setUserdata] = useState();
  const [historyLogs, setHistoryLogs] = useState();

  useEffect(() => 
    async function firstRun() 
      var userdata = await (await fetch("/me")).json();
      var historyLogs = []
      firebase.database().ref(userdata.id).once("value", function(snapshot)
        snapshot.forEach(child => 
          historyLogs.push(child.key);
      ));

      setHistoryLogs(historyLogs);
      setUserdata(userdata);
    
    firstRun();
  , [])

  function aver()
    console.log(historyLogs);
  

  if(!userdata || !historyLogs)
    return null
  
  else

    return (
      <React.Fragment>
        <button onClick=aver>aver</button>
        <header>
              <img src=logo  />

              <select id="cars" name="carlist" form="carform">
                  <option value="volvo" selected>volvo</option>
                  
                  historyLogs.map(log => 
                      return <option>log</option>
                    )
                  
              </select>

              <div className="user-info">
                  <img src=userdata.img  style=borderRadius:"50%" />
                  <p>userdata.name</p>
              </div>
        </header>
        <Toptracks userdata=userdata/>
      </React.Fragment>
    )
  



export default Home;

使用我拥有的代码,下拉菜单会在不渲染 historyLogs 列表的情况下呈现,因此它只显示以下内容:

这应该显示在里面(控制台记录):

(2) ["2021-7-25", "2022-7-25"]

我有趣地发现,如果我在本地服务器运行的情况下对代码进行任何更改,它会首先更新:

非常感谢任何帮助:)

【问题讨论】:

【参考方案1】:

感谢 @click2install 和 @NickServe 在 Reactiflux Discord 服务器上的解决方案:

您的 once 代码位于异步事件侦听器中,这意味着它在您将状态设置为 [ ] 后运行。您应该改为在一次内调用 setHistoryLogs。

最终解决方案:

useEffect(() => 
    async function firstRun() 
      var userdata = await (await fetch("/me")).json();

      firebase.database().ref(userdata.id).once("value", 
        function(snapshot)
          var historyLogs = []
          snapshot.forEach(child => 
            historyLogs.push(child.key)
          );
          setHistoryLogs(historyLogs);
        
      );

      setUserdata(userdata);
    
    firstRun();
  , [])

【讨论】:

以上是关于反应选择下拉菜单未在获取时更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应选择下拉菜单中的选项下添加子选项?

在下拉菜单中进行选择时更新数据库

从rails的下拉菜单中选择项目时如何更新数据库字段?

级联选择/下拉菜单

允许用户从下拉菜单或地图中选择位置?

当未选择下拉菜单时,使用 jquery 获取默认值