React select 下拉列表未在获取时更新
React select dropdown not updating on fetch
我在使用 React 时遇到了这个问题,我试图呈现一个 select 下拉列表,其中包含存储在我的数据库中的日期。数据被成功获取并且状态也被更新,它可以被控制台记录。但是,select 下拉菜单没有按应有的方式呈现:
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} height="50px" alt="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} height="50px" style={{borderRadius:"50%"}} alt="user img"/>
<p>{userdata.name}</p>
</div>
</header>
<Toptracks userdata={userdata}/>
</React.Fragment>
)
}
}
export default Home;
使用我的代码,下拉列表在不呈现 historyLogs 列表的情况下呈现,因此它只显示以下内容:
这应该显示在里面(控制台记录):
(2) ["2021-7-25", "2022-7-25"]
我有趣地发现,如果我对我的本地服务器的代码进行任何更改 运行,它就会更新,因为它应该放在第一位:
非常感谢任何帮助:)
解决方案感谢 Reactiflux Discord 服务器上的@click2install 和@NickServe:
Your once code is in an asyncronous event listener, which means it's running after you set your state to [ ]. You should call setHistoryLogs inside of once instead.
最终解决方案:
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();
}, [])
我在使用 React 时遇到了这个问题,我试图呈现一个 select 下拉列表,其中包含存储在我的数据库中的日期。数据被成功获取并且状态也被更新,它可以被控制台记录。但是,select 下拉菜单没有按应有的方式呈现:
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} height="50px" alt="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} height="50px" style={{borderRadius:"50%"}} alt="user img"/>
<p>{userdata.name}</p>
</div>
</header>
<Toptracks userdata={userdata}/>
</React.Fragment>
)
}
}
export default Home;
使用我的代码,下拉列表在不呈现 historyLogs 列表的情况下呈现,因此它只显示以下内容:
这应该显示在里面(控制台记录):
(2) ["2021-7-25", "2022-7-25"]
我有趣地发现,如果我对我的本地服务器的代码进行任何更改 运行,它就会更新,因为它应该放在第一位:
非常感谢任何帮助:)
解决方案感谢 Reactiflux Discord 服务器上的@click2install 和@NickServe:
Your once code is in an asyncronous event listener, which means it's running after you set your state to [ ]. You should call setHistoryLogs inside of once instead.
最终解决方案:
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();
}, [])