Я немного удивлен, что вы видите эту ошибку, поскольку Vue обычно не жалуется, если вы используете v-if
/ v-else-if
/ v-else
таким образом. Шаблон гарантированно выводит отдельный элемент при запуске, поэтому обычно Vue это позволяет. Это может пролить больше света на то, что происходит, если вы включите в вопрос точное сообщение об ошибке.
Я предлагаю проверить, не сталкиваетесь ли вы с проблемой, описанной ниже, вызванной несовместимыми версиями библиотеки, которая неправильно сообщает об этом ошибка:
https://github.com/vuejs/eslint-plugin-vue/issues/986
Я действительно не думаю, что с вашим кодом что-то не так, поэтому я предлагаю изучить версии библиотеки, прежде чем вносить какие-либо изменения в код.
Далее, если жалуется только линтер, вы можете рассмотреть возможность подавления этого правила. Шаблонный компилятор Vue выкрикнет достаточно быстро, если возникнет реальная проблема с несколькими root узлами.
Тем не менее, если вы действительно не можете сделать сообщение об ошибке go прочь ...
Самое простое решение - просто обернуть все в дополнительный элемент в root.
Если вы не хотите использовать элемент-обертку (возможно, потому что он мешает вашему макету), вы можете используйте is
, чтобы уменьшить ваш шаблон:
<template>
<component
:class="classes"
v-bind="childProps"
v-on="$listeners"
>
<slot />
</component>
</template>
<script>
export default {
// ... other stuff ...
computed: {
childProps () {
const childProps = {...this.inheritedProps}
if (this.to) {
childProps.is = 'nuxt-link'
childProps.to = this.to
} else if (this.href) {
childProps.is = 'a'
childProps.href = this.href
} else {
childProps.is = 'button'
childProps.type = this.type
}
return childProps
}
}
}
</script>
Тем не менее, вы почти на render
функциональной территории, делая это таким образом.