javascript - 如何使用纯 Javascript 函数呈现多个 HTML 部分
问题描述
这是一个拥有数百个页面的静态网站。我需要从 JS 渲染诸如 topnav 或时事通讯或内容带之类的元素,并定期更改这些内容。
这是我尝试过的:
const components = {
compartirEnFlex: `<h4>Newsletter</h4>`,
newsletterEs: `<h4>Compartir</h4>`,
}
const ids = ['newsletterEs', 'compartirEnFlex', 'infoArticulo', 'infoDeLaWebEnFlexIzq']
function renderComponents(objWithComp, idsArr){
return idsArr.map(function(id){
for(let component in objWithComp){
let arrOfIds = Object.keys(objWithComp);
arrOfIds.map(key => key)
if(id === key){
document.getElementById(id).insertAdjacentHTML('afterbegin', objWithComp[id])
}
}
})
}
renderComponents(components, ids);
每个 id 在 HTML 结构中都有对应的。当我单独执行此操作时,它会起作用。但是,我必须以一种优雅的方式来处理这个问题(并且在这个项目中没有像 React 这样的 JS 框架的可能性)。
谢谢您的帮助!
解决方案
运行代码时,您会Uncaught ReferenceError: key is not defined
在控制台中看到错误。
那是因为key
inif(id === key)
没有定义。该行arrOfIds.map(key => key)
返回完全相同的数组,arrOfIds
因为Array.prototype.map
“返回一个新数组,其中填充了在调用数组中的每个元素上调用提供的函数的结果。”
在这里,您没有将该新数组分配给变量,因此没有任何反应。即使是这样,该新数组也将是一个副本,arrOfIds
因为您的映射函数会为每个(key) => key
返回- 这意味着输出与输入相同。key
key
但是,这不是问题。如果我正确理解了您的问题,那么此演示应该显示您正在尝试完成的示例。如果这是您想要实现的目标,那么这里有一个解决方案:
首先,你不需要component
在objWithComponent
里面迭代idArr
——你已经在idArr
. 您也不需要ids
数组,因为您可以components
使用Object.keys()
.
假设您的 HTML 看起来像这样:
<div>
<div id="newsletterEs"></div>
<div id="compartirEnFlex"></div>
<div id="infoArticulo"></div>
<div id="infoDeLaWebEnFlexIzq"></div>
</div>
然后,使用Object.keys(components)
获取您拥有的组件的 id 数组,您可以将它们映射到 HTML 标记。实际上,map
这里没有必要,因为map
返回一个新数组,除非您以后需要该数组,否则没有理由使用map
. 相反,您可以使用Object.prototype.forEach
.
这就是它的样子:
const components = {
compartirEnFlex: `<h4>Newsletter</h4>`,
newsletterEs: `<h4>Compartir</h4>`,
}
function renderComponents(objWithComp) {
Object
.keys(components)
.forEach((id) => {
const element = document.getElementById(id)
const component = objWithComp[id]
if (component && element) {
element.insertAdjacentHTML('afterbegin', component)
}
})
}
renderComponents(components)
然后,当您调用 时renderComponents
,您可以只传递参数,并且仅使用语句components
呈现具有相应 id 的 div 存在的组件。if
推荐阅读
- c++ - C ++ stoi:2个重载都不能转换所有参数类型
- java - 如何使用 Stream API 返回 null?
- node.js - Mongoose - 无法根据需要设置子文档(嵌套对象)
- firebase - VUEJS + Firestore 如何输出数据?
- python - 从索引中一一打印多个输出
- python - 将字典转换为表以在 Orangewidget 中输出
- javascript - 使用 gapi 将文件上传到 Google Drive
- python - 无法腌制大型 Pandas 数据框
- amqp - 具有多个客户端的 AMQ 地址到多播队列
- processwire - 在 processwire 中更改页面的 url 链接