更新时间:2023-11-02 14:10:10
您必须关闭 img
标记(这是主要问题),然后 join
映射数组以获取字符串:
You have to close that img
tag (which is the main problem), and join
the mapped array to get a string:
${project.skillIconImages.map((x) => '<img src="' + x +'">').join("")}
// ^ ^^^^^^^^
此外,您应尽量减少分配给 innerHTML
的次数,而不是使用 + =
并不断对其进行更改(这对性能不利),而应累积HTML到一个字符串中,然后只使用一次 innerHTML = thatAccumulatedString
:
Also you should minimize the number of assignments to innerHTML
, instead of using +=
and constantly alter it (which is bad for performance), you should accumulate the HTML into a string and then use innerHTML = thatAccumulatedString
only once:
var htmlString = "";
htmlString += "... generated HTML for a portfolio ...";
.innerHTML = htmlString;
或使用 reduce
在内部进行累加(也为什么不继续在 map
内部使用模板文字),例如:
Or use reduce
which does the accumulation internally (also why not go ahead and use a template literal inside map
too) like:
let portfolioItemsDiv = document.getElementById('portfolio-items');
portfolioItemsDiv.innerHTML = projects.reduce((htmlString, project) => {
return htmlString + `
<div class="portfolio-item">
<img src="${project.image}" alt="${project.title}" />
<h3 class="project-title">${project.title}</h3>
<div class="skills-used">
${
project.skillIconImages.map(x => `<img src="${x}">`).join("")
}
</div>
<div class="project-description">
<p>${project.description}</p>
</div>
</div>
`;
}, "");
无CSS演示
const projects = [{"image":"http://via.placeholder.com/360x180","title":"Project 1","skillIconImages":["http://via.placeholder.com/50x50","http://via.placeholder.com/55x50","http://via.placeholder.com/50x55","http://via.placeholder.com/60x50"],"description":"Ex rationibus deterruisset eos, ius tale nullam officiis an. Duo propriae mentitum salutandi id, nulla nobis persequeris ut eam, ex dicta libris laboramus duo. Amet errem voluptatibus an vix, eum ut nulla scriptorem. Ea etiam noluisse perfecto eum. Nec ad consul ubique, his id reque nonumy percipit."},{"image":"http://via.placeholder.com/360x180","title":"Project 2","skillIconImages":["http://via.placeholder.com/50x50","http://via.placeholder.com/55x50","http://via.placeholder.com/50x55","http://via.placeholder.com/60x50"],"description":"Ex rationibus deterruisset eos, ius tale nullam officiis an. Duo propriae mentitum salutandi id, nulla nobis persequeris ut eam, ex dicta libris laboramus duo. Amet errem voluptatibus an vix, eum ut nulla scriptorem. Ea etiam noluisse perfecto eum. Nec ad consul ubique, his id reque nonumy percipit."},{"image":"http://via.placeholder.com/360x180","title":"Project 3","skillIconImages":["http://via.placeholder.com/50x50","http://via.placeholder.com/55x50","http://via.placeholder.com/50x55","http://via.placeholder.com/60x50"],"description":"Ex rationibus deterruisset eos, ius tale nullam officiis an. Duo propriae mentitum salutandi id, nulla nobis persequeris ut eam, ex dicta libris laboramus duo. Amet errem voluptatibus an vix, eum ut nulla scriptorem. Ea etiam noluisse perfecto eum. Nec ad consul ubique, his id reque nonumy percipit."}];
let portfolioItemsDiv = document.getElementById('portfolio-items');
portfolioItemsDiv.innerHTML = projects.reduce((htmlString, project) => {
return htmlString + `
<div class="portfolio-item">
<img src="${project.image}" alt="${project.title}" />
<h3 class="project-title">${project.title}</h3>
<div class="skills-used">
${
project.skillIconImages.map(x => `<img src="${x}">`).join("")
}
</div>
<div class="project-description">
<p>${project.description}</p>
</div>
</div>
`;
}, "");
<div id="portfolio-items"></div>