热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么<ul>渲染两次?

所以我正在从firebasefirestore收集一些数据,我想显示它。我设法通过.get()方法获取数据。但由于某种原因,数据被显示了两次。这是ReactJS应用

所以我正在从 firebase firestore 收集一些数据,我想显示它。我设法通过 .get() 方法获取数据。但由于某种原因,数据被显示了两次。这是 React JS 应用

JS

function renderList(doc) {
let li = document.createElement('li')
let name = document.createElement('span')
let bloodGroup = document.createElement('span')
let district = document.createElement('span')
let phOneNumber= document.createElement('span')
let vaccineDays = document.createElement('span')
li.setAttribute('data-id', doc.id)
name.textCOntent= doc.data().name;
bloodGroup.textCOntent= doc.data().bloodGroup;
district.textCOntent= doc.data().district;
phoneNumber.textCOntent= doc.data().phoneNumber
vaccineDays.textCOntent= doc.data().vaccineDays
li.appendChild(name);
li.appendChild(bloodGroup);
li.appendChild(district);
li.appendChild(vaccineDays);
document.getElementById("donator-list").appendChild(li)
}
db.collection("donators").get().then((snapshot) => {
snapshot.docs.forEach(doc => {
renderList(doc)
})
})
return (





)

回答

这里发生的事情很可能是:React 渲染多次(这是预期的),但在每次渲染时,您都手动添加到 DOM。

执行此操作的正常 React 方法是:


  • 拨打电话(可能在Effect 内)

  • 在React State 中存储你需要的数据

  • 在返回的 JSX 中,构建您想要显示的结构。

由于您的示例没有整个组件,因此很难准确显示,但这大致是我期望的样子:

const [docs, setDocs] = useState([])
/*
* I would expect this call to be made inside an effect,
* so you don't do it every render, but I don't know what you
* would want to trigger it, so it's running on first load.
*/
useEffect(() => {
db.collection("donators").get().then((snapshot) => {
setDocs(snapshot.docs)
})
}, [])
return (



    { docs.map(doc =>

  • { doc.data().name }
    { /* Add your other spans here */ }

  • )}


)






推荐阅读
author-avatar
手浪用户2602901267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有