vue/max-template-complexity
Limit a component's own template complexity (cyclomatic and cognitive)
Default severity: warning
Presets: none
Automatic fix: None; review the suggested change
Applies to: Vue SFC templates and blocks, with script context where the rule requires it
Options: No rule-specific options. Severity and preset selection are configurable.
Bad has cyclomatic complexity 13 and cognitive complexity 25 (limits: 11 and 16). Each component is measured separately; only inline HTML templates are supported.
See complexity scoring and component boundaries for the contributions behind the example's two scores.
Configuration (Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
lint: {
vize: {
"preset": "incremental",
"rules": {
"vue/max-template-complexity": "warn"
}
},
},
});
vp run lint
Bad
The parent-authored branches, loop, slot content, and expression decisions produce scores of 13 and 25, above the default limits 11 and 16.
<script setup lang="ts">
defineProps<{ rows: Row[] }>();
</script>
<template>
<section>
<h1>{{ user ? user.name : 'Guest' }}</h1>
<DataTable :rows="rows">
<template #cell="{ row, column }">
<span v-if="column.key === 'status'" :class="row.active ? 'on' : 'off'">{{ row.status ?? 'unknown' }}</span>
<a v-else-if="column.key === 'link' && row.url" :href="row.url">{{ row.label }}</a>
<template v-else>
<em v-for="tag in row.tags" :key="tag">
<b v-if="tag.pinned || tag.starred">{{ tag.hot ? '!' : '' }}</b>
</em>
</template>
</template>
</DataTable>
<p v-if="!rows.length && !loading">No data</p>
</section>
</template>
Good
The parent template delegates rendering to RowList and keeps one v-if; its own scores are 2 and 1.
<template>
<RowList v-if="ready" :rows="rows" />
</template>
Good avoids this rule's finding under the configuration above; other rules may still report diagnostics.