vue+vue-loader v-for当数据为空数组时显示为 undefined

本文探讨了Vue中使用v-for指令时遇到的一个常见问题:当数据为空数组时,为何渲染结果会出现“undefined”。通过具体示例展示了如何避免此问题,并深入分析了Vue内部的渲染机制。
<template lang="pug">
    div
        span 测试 //-- 这里不能少
        div(v-for="idx in []") {{idx}} 
</template>

当组件渲染后 显示的结果为按理说应该时 “测试”
但是实际显示结果为 “测试undefined”

解决方法

在v-for 外面套一个div 如:

<template lang="pug">
    div
        span 测试 //-- 这里不能少
        div
            div(v-for="idx in []") {{idx}} 
</template>

原因分析

1、他生成的render函数如下:

var render = function() {
  var _vm = this
  var _h = _vm.$createElement
  var _c = _vm._self._c || _h
  return _c(
    "div",
    [
      _c("span", [_vm._v("测试")]),
   ① _vm._l([], function(idx) { 
        return _c("div")
      })
    ],
    2
  )
}

① 这个位置 会渲染为一个undefined textNode
_c 这个函数的第二个参数这里表示的是div的子元素
div 的子元素为:span和一个空素组。vue会把这个空素组渲染成一个undefined

如果我加一个的div 在v-for外面 生成的代码是

var render = function() {
  var _vm = this
  var _h = _vm.$createElement
  var _c = _vm._self._c || _h
  return _c("div", [
    _c("span", [_vm._v("测试")]),
    _c(
      "div",
      _vm._l([], function(idx) {
        return _c("div")
      })
    )
  ])
}

c 这个函数的第二个参数这里表示的是div的子元素
第一个div的子元素是:span 和 div
地二个子元素是:其实是一个空数组所以代表没有子元素那么当然不会渲染任何东西

这点代会返回一个空数组
vm._l 是vue的renderList函数

_vm._l([], function(idx) {
    return _c("div")
})
PS D:\code\pingan_fk> npm list vue-loader webpack vue-template-compiler pingan_fk@1.0.0 D:\code\pingan_fk +-- @vue/cli-plugin-babel@5.0.9 | +-- babel-loader@8.4.1 | | `-- webpack@5.76.0 deduped | +-- thread-loader@3.0.4 | | `-- webpack@5.76.0 deduped | `-- webpack@5.76.0 deduped +-- @vue/cli-plugin-eslint@5.0.9 | +-- eslint-webpack-plugin@3.2.0 | | `-- webpack@5.76.0 deduped | `-- webpack@5.76.0 deduped +-- @vue/cli-service@5.0.9 | +-- @soda/friendly-errors-webpack-plugin@1.8.1 | | `-- webpack@5.76.0 deduped | +-- @vue/vue-loader-v15@npm:vue-loader@15.11.1 | | `-- webpack@5.76.0 deduped | +-- copy-webpack-plugin@9.1.0 | | `-- webpack@5.76.0 deduped | +-- css-loader@6.11.0 | | `-- webpack@5.76.0 deduped | +-- css-minimizer-webpack-plugin@3.4.1 | | `-- webpack@5.76.0 deduped | +-- html-webpack-plugin@5.6.4 | | `-- webpack@5.76.0 deduped | +-- mini-css-extract-plugin@2.9.4 | | `-- webpack@5.76.0 deduped | +-- postcss-loader@6.2.1 | | `-- webpack@5.76.0 deduped | +-- progress-webpack-plugin@1.0.16 | | `-- webpack@5.76.0 deduped | +-- terser-webpack-plugin@5.3.14 | | `-- webpack@5.76.0 deduped | +-- vue-loader@17.4.2 | | `-- webpack@5.76.0 deduped | +-- vue-template-compiler@2.7.16 deduped | +-- webpack-dev-server@4.15.2 | | +-- webpack-dev-middleware@5.3.4 | | | `-- webpack@5.76.0 deduped | | `-- webpack@5.76.0 deduped | `-- webpack@5.76.0 deduped +-- css-loader@3.6.0 | `-- webpack@5.76.0 deduped +-- vue-loader@16.8.3 | `-- webpack@5.76.0 deduped +-- vue-template-compiler@2.7.16 `-- webpack@5.76.0 正确了吗
最新发布
09-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值