JS实现动态渲染列表 | 豆包MarsCode AI刷题

104 阅读4分钟

动态渲染列表与JavaScript数组遍历技巧深入笔记

在现代Web开发中,动态渲染列表是一项基本而频繁的任务。这不仅涉及到JavaScript中的数组遍历技巧,还包括ES6引入的模板字符串的使用。以下是这些知识点的综合笔记,包括一些额外的实用技巧和最佳实践。

数组遍历方法

JavaScript提供了多种数组遍历方法,每种方法都有其特定的用例和优势。

forEach 方法

forEach 方法对数组中的每个元素执行一次提供的函数,是最常用的遍历方法之一。它适用于执行副作用的操作,如DOM操作或日志记录。

people.forEach((item) => {
    console.log(item);
});

for 循环

传统的 for 循环可以根据需要进行更复杂的操作,如跳过某些元素或中断循环。它提供了对循环流程的完全控制。

for (let i = 0; i < people.length; i++) {
    console.log(people[i]);
}

for...of 循环

for...of 循环提供了一种简洁的方式来遍历数组,使代码更易读。它特别适用于遍历可迭代对象,如数组、字符串等。

for (const item of people) {
    console.log(item);
}

map 方法

map 方法创建一个新数组,其结果是该数组中的每个元素都调用一次提供的函数后的返回值。它不修改原数组,而是返回一个新数组,这使得它在函数式编程中非常有用。

const names = people.map(person => person.name);

filter 方法

filter 方法创建一个新数组,包含通过所提供函数实现的测试的所有元素。它常用于从数组中提取满足特定条件的元素。

const adults = people.filter(person => person.age >= 18);

reduce 方法

reduce 方法对数组中的值进行汇总,将其减少到单一的返回值。它可以用于计算数组元素的总和、平均值等。

const totalAge = people.reduce((sum, person) => sum + person.age, 0);
  1. people 数组中的每个对象(每个人)都有一个 age 属性。
  2. reduce 方法遍历 people 数组,累加每个人的 age
  3. 箭头函数 (sum, person) => sum + person.age 定义了如何累加:将当前的累积和 sum 与当前人的 age 相加。
  4. 0 是累加的初始值,表示累加从0开始。

最终,totalAge 将包含 people 数组中所有人年龄的总和。简单来说,reduce 就是用来计算数组中所有元素的累积结果,比如总和、平均值等。

模板字符串

ES6引入的模板字符串是创建字符串的有力工具,它们允许字符串跨越多行,并且可以嵌入表达式。

多行字符串

模板字符串可以包含换行符,非常适合创建多行字符串,使得代码更加清晰和易于维护。

const personInfo = `
  Name: ${person.name}
  Age: ${person.age}
`;

表达式嵌入

模板字符串中可以直接嵌入变量和表达式,这使得动态构建字符串变得非常简单和直观。

const greeting = `Hello, ${name}! You are ${age} years old.`;

标签模板

模板字符串可以与函数一起使用,创建更复杂的字符串处理逻辑。这在需要对字符串进行格式化或处理时非常有用。

function highlight(text) {
  return `**${text}**`;
}
const highlightedInfo = highlight`Name: ${name}`;

动态渲染列表的实践

结合以上知识点,我们可以优化动态渲染列表的过程,使其更加高效和安全。

<script>
    var people = [
        { name: '牛油1号', id: 1, age: 20 },
        { name: '牛油2号', id: 2, age: 21 },
        { name: '牛油3号', id: 3, age: 19 },
    ];
    var ul = document.querySelector('ul');
    var fragment = document.createDocumentFragment();
    people.forEach((item) => {
        var li = document.createElement('li');
        li.textContent = `${item.name}  ${item.age}岁`; // 使用模板字符串
        fragment.appendChild(li);
    });
    ul.appendChild(fragment);
</script>

性能优化

使用 DocumentFragment

使用 DocumentFragment 可以减少浏览器的重绘和重排次数,因为所有的DOM操作都是在一个脱离文档的上下文中完成的,最后才一次性添加到文档中。

避免不必要的DOM操作

尽量减少直接操作 innerHTML 的次数,因为这会导致浏览器重新解析HTML字符串,特别是在处理大量数据时,这可能会成为性能瓶颈。

安全性考虑

防止XSS攻击

当渲染用户输入或不可信数据时,确保对数据进行适当的转义,以防止跨站脚本攻击(XSS)。

li.textContent = `${item.name}  ${item.age}岁`.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');

错误处理

在处理数据时,考虑到数据可能为空或不完整,应添加适当的错误处理逻辑,以避免运行时错误。

if (!Array.isArray(people) || people.length === 0) {
    console.warn('people数组为空或不是数组');
    return;
}

总结

通过掌握JavaScript的数组遍历方法和模板字符串的使用,我们可以更高效、安全地实现动态渲染列表的功能。这些技巧不仅提升了开发效率,也增强了代码的可读性和维护性。此外,通过使用 DocumentFragment 和避免不必要的DOM操作,我们可以进一步提高性能。安全性也是不容忽视的一环,特别是在处理用户输入时,应始终警惕XSS攻击。通过这些实践,我们可以构建更加健壮和用户友好的Web应用。