Невозможно использовать v-for для элемента root компонента stateful, потому что он отображает несколько элементов?

app.js

var Users = {
    template: '
        <tr v-for="list in UsersData">
            <th>{{ list.idx }}</th>
            <td>{{ list.id }}</td>
        </tr>
    ',
    data: function () {
        return {
            UsersData //get data from query
        }
    }
}

var mainview = new Vue({
    el: "#mainview",
    components: {
        'users': Users
    },
    method: {}
})

layout.blade.php

<body>
    <div class="container">
        <aside>...</aside>
        <main id="mainview">
            @section('content')
            @show
        </mainview>
    </div>
</body>

index.blade.php

@extends('layout')
@section('content')
<table>
    <thead>
        <tr>
            <th>IDX</th>
            <th>ID</th>
        </tr>
    </thead>
    <tbody>
        <users></users>
    </tbody>
</table>
@endsection

ERROR LOG из хромированной консоли

[Vue warn]: Невозможно использовать v-for для элемента root компонента stateful, поскольку он отображает несколько элементов:

<tr v-for="list in UsersData">
    <th>{{ list.idx }}</th>
    <td>{{ list.id }}</td>
</tr> 

vue.js: 525 [Vue warn]: Несколько корневых узлов, возвращаемых из функции рендеринга. Функция Render должна возвращать один корневой узел. (найдено в компоненте)

Как мне исправить код?

Ответ 1

Ваш шаблон должен иметь один корневой элемент. Это просто одно правило, которое вы не можете сломать. Поскольку вы создаете таблицу, имеет смысл сделать tbody корневым элементом.

var Users = {
    template: '
        <tbody>
            <tr v-for="list in UsersData">
                <th>{{ list.idx }}</th>
                <td>{{ list.id }}</td>
            </tr>
        </tbody>
    ',
    data: function () {
        return {
            UsersData //get data from query
        }
    }
}

index.blade.php

@extends('layout')
@section('content')
<table>
    <thead>
        <tr>
            <th>IDX</th>
            <th>ID</th>
        </tr>
    </thead>
    <users></users>
</table>
@endsection

Ответ 2

Для ленивых: Vue интерпретирует корневой элемент, имеющий цикл v-for на нем, как создающий несколько элементов корневого уровня (nono в современных JS-инфраструктурах).

Просто оберните свой шаблон в лишний пустой <div>. 👌