diff --git "a/\346\226\275\345\277\227\345\274\272/2021-6-2(\345\210\227\350\241\250\346\270\262\346\237\223).md" "b/\346\226\275\345\277\227\345\274\272/2021-6-2(\345\210\227\350\241\250\346\270\262\346\237\223).md" new file mode 100644 index 0000000000000000000000000000000000000000..7df4cab4c0d5dbd7a3926fae4aaf7913fc61f0b7 --- /dev/null +++ "b/\346\226\275\345\277\227\345\274\272/2021-6-2(\345\210\227\350\241\250\346\270\262\346\237\223).md" @@ -0,0 +1,240 @@ +# 列表渲染 +# 一个数组对应一组元素 +1. 用 v-for 指令基于一个数组来渲染一个列表 +``` + + + +``` +2. 在 v-for 块中,我们可以访问所有父级作用域的 property ,v-for 还支持第二个可选参数,也就是当前索引 +``` +
+ +
+ + +``` + 你可以用 of 来代替 in 作为分隔符,它也更接近 JavaScript 迭代器的语法 +# 在 v-for 里使用对象 +1. 可以用 v-for 来遍历一个对象 property +``` +
+ +
+ + +``` +2. 你也可以提供第二个参数名称(也就是键名) +``` +
+ +
+``` +3. 还可以用到第三个参数名称(也就是索引) +``` +
+ +
+``` + 在遍历对象时,会按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下都一致 +# 维护状态 +1. 为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key attribute +``` +
+ +
+``` +建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升 +# 数组更新检测 +# 变更方法 +1. Vue 将被侦听的数组的变更方法进行了包裹,它们也将会触发视图更新 +``` + push() //在数组的最后添加一个 + pop() //删除数组的最后一个 + shift() //在数组的第一个添加一个 + unshift() //删除数组的第一个 + splice() // + sort() //数组的第一和第二调换 + reverse() // +``` +# 替换数组 +1. 变更方法,顾名思义,会变更调用了这些方法的原始数组。相比之下,也有非变更方法,例如 filter()、concat() 和 slice()。它们不会变更原始数组,而总是返回一个新数组。当使用非变更方法时,可以用新数组替换旧数组 +``` +example1.items = example1.items.filter(function (item) { + return item.message.match(/Foo/) +}) +``` +# 注意事项 +1. 由于 JavaScript 的限制,Vue 不能检测数组和对象的变化 +# 显示过滤/排序后的结果 +1. 有时,我们想要显示一个数组经过过滤或排序后的版本,而不实际变更或重置原始数据。在这种情况下,可以创建一个计算属性,来返回过滤或排序后的数组 +``` +
  • {{ n }}
  • +data: { +numbers: [ 1, 2, 3, 4, 5 ] +}, +computed: { +evenNumbers: function () { + return this.numbers.filter(function (number) { + return number % 2 === 0 + }) +} +} +``` +在计算属性不适用的情况下 (例如,在嵌套 v-for 循环中) 你可以使用一个方法: +``` + +data: { + sets: [[ 1, 2, 3, 4, 5 ], [6, 7, 8, 9, 10]] +}, +methods: { + even: function (numbers) { + return numbers.filter(function (number) { + return number % 2 === 0 + }) + } +} +``` +# 在 v-for 里使用值的范围 +1. v-for 也可以接受整数。在这种情况下,它会把模板重复对应次数 +``` +
    + {{ n }} +
    +``` +# 在 template 上使用 v-for +1. 类似于 v-if,你也可以利用带有 v-for 的 template 来循环渲染一段包含多个元素的内容 +``` + +``` +# v-if 与 v-for 一同使用 +1. 不推荐在同一元素里 v-if 和 v-for 一起使用,因为在同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中,只想为部分项渲染节点时,这种优先级的机制会十分有用 +``` +
  • + {{ todo }} +
  • +``` +2. 如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或 template) 上 +``` + +

    No todos left!

    +``` +# 在组件上使用 v-for +1. 2.2.0+ 的版本里,当在组件上使用 v-for 时,key 现在是必须的 +``` +
    + + + +
    + +``` \ No newline at end of file