Vue 中,使用 v-for 和 v-if 在同一个元素上时,出现报错,怎么解决

直接上报错图:

上图所示,其实就是 因为 v-for 的优先级比 v-if 高,Vue 会先尝试遍历 v-for 里面,然后再检查 v-if 的条件,这可能会导致意外的行为或错误。

解决办法有两种:

1.常见办法,也就是编辑器提醒的,使用 template 包裹 v-for ,优先 v-if

javascript 复制代码
<template>
  <el-table>
    <template v-if="approveInfo">
      <el-table-column v-for="item in plusRatio" :key="item" :prop="item.prop" :label="item.label">
        <!-- 列的内容 -->
      </el-table-column>
    </template>
  </el-table>
</template>

首先判断 approveInfo 的值,只有当 approveInfo 为 true 时,才会渲染 template 内部的元素。

2.使用计算属性来过滤数据

javascript 复制代码
<template>
  <el-table>
     <el-table-column v-for="item in filteredPlusRatio" :key="item" :prop="item.prop" :label="item.label">
       <!-- 列的内容 -->
     </el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      approveInfo: true,
      plusRatio: [
        { prop: 'ratio1', label: '比例 1' },
        { prop: 'ratio2', label: '比例 2' },
        // 其他数据
      ]
    };
  },
  computed: {
    filteredPlusRatio() {
      if (this.approveInfo) {
        return this.plusRatio;
      } else {
        return [];
      }
    }
  }
};
</script>

根据 approveInfo 的值决定是否返回 plusRatio 数组或空数组,确保只有在 approveInfo 为 true 时才渲染 el-table-column。

注意点

  1. 避免在 v-for 内部使用 v-if,因为 v-for 优先级高,会导致不必要的性能开销。
  2. 计算属性会根据依赖的响应式数据自动更新,确保逻辑的正确性。
相关推荐
lemon_yyds11 小时前
《vue 2 升级vue3 父组件 子组件 传值: value 和 v-model
vue.js
simple_lau12 小时前
Cursor配置MasterGo MCP:一键读取设计稿生成高还原度前端代码
前端·javascript·vue.js
睡不着先生12 小时前
如何设计一个真正可扩展的表单生成器?
前端·javascript·vue.js
wuhen_n15 小时前
Pinia状态管理原理:从响应式核心到源码实现
前端·javascript·vue.js
wuhen_n15 小时前
KeepAlive:组件缓存实现深度解析
前端·javascript·vue.js
wuhen_n16 小时前
Vue Router与响应式系统的集成
前端·javascript·vue.js
Ruihong16 小时前
《VuReact:下一代 Vue 3 -> React 智能编译工具,支持 SFC 与增量迁移》
vue.js
lemon_yyds16 小时前
vue 2 升级vue3 : ref 和 v-model 命名为同名
前端·vue.js
前端Hardy19 小时前
告别 !important:现代 CSS 层叠控制指南,90% 的样式冲突其实不用它也能解
前端·vue.js·面试
前端Hardy19 小时前
Vue 3 性能优化的 5 个隐藏技巧,第 4 个连老手都未必知道
前端·vue.js·面试