Почему не рендерятся router-link элементы

200
25 января 2018, 20:59

У меня есть файл app.vue

<template>
    <h1>Hello App!</h1>
    <p>
        <router-link to="/foo">Go to Foo</router-link>
        <router-link to="/bar">Go to Bar</router-link>
    </p>
    <router-view></router-view>
</template>
<script>
    import VueRouter from "vue-router";
    export default {
        name: 'app'
    }
</script>

И запускаемый файл main.js

import Vue from 'vue'
import App from './App.vue'
import VueRouter from "vue-router";
Vue.use(VueRouter);
const Foo = {template: '<div>foo</div>'}
const Bar = {template: '<div>bar</div>'}
const routes = [
    {path: '/foo', component: Foo},
    {path: '/bar', component: Bar}
]
const router = new VueRouter({
    routes // сокращение от `routes: routes`
})
const app = new Vue({
    router,
    render: h => h(App)
}).$mount('#app')

Приложение рендерится, ошибок не выводит, но ссылок router-link нету. Не могу понять в чём дело.

Для сборки использую rollup, не знаю имеет ли это значение.

Я во Vue.js новичок, хочу понять как сделать проект с .vue файлами, роутингом, и основным шаблоном.

Решилось добавлением div

<template>
    <div> /* добавил */
        <h1>Hello App!</h1>
        <p>
            <!-- используйте компонент router-link для создания ссылок -->
            <!-- входной параметр `to` определяет путь для перехода -->
            <!-- `<router-link>` по умолчанию преобразуется в тег `<a>` -->
            <router-link to="/foo">Go to Foo</router-link>
            <router-link to="/bar">Go to Bar</router-link>
        </p>
        <!-- отображение компонента, для которого совпал путь -->
        <router-view/>
    </div>
</template>

Но зачем этот div нужен, не понимаю?

Answer 1

Решилось добавлением div. Но зачем этот div нужен, не понимаю?

В Vue html-шаблон любого компонента не может содержать более одного элемента на верхнем уровне. Сделано это с целью упрощения реализации инжектирования кода компонента.

Вот комментарий разработчика Vue в issue на GitHub'е, в которой запрашивается возможность иметь несколько элементов верхнего уровня в одном компоненте:

While that's something useful in its own right, currently it requires non-trivial changes to the vdom implementation to support it. This is something that falls within "obviously nice to have but not an area of focus for now". We'll revisit this when we are working on substantial improvements to the vdom in the future.

Эта возможность кажется полезной, но чтобы добавить её придётся сделать нетривиальные изменения в текущей реализации виртуального DOM. То есть очевидно было бы здорово иметь её, но это не то, на чём сейчас стоит сосредоточиться. Возможно что-то изменится в следующих релизах.

Насчёт этой части:

Я во Vue.js новичок, хочу понять как сделать проект с .vue файлами, роутингом, и основным шаблоном.

Имхо, наиболее удобный способ — создавать проект, используя vue-cli и один из готовых шаблонов, например webpack.

Не знаю, связанно ли это с webpack, но тогда ошибка наличия нескольких компонент верхнего уровня будет обнаруживаться на этапе сборки.

READ ALSO
Как получить объект из data атрибута?

Как получить объект из data атрибута?

Почему когда вывожу первый раз consolelog();, атрибут возвращает строку, а не объект? А если установить через JS данный атрибут, то возвращает уже...

258
Безопасность куки

Безопасность куки

Объясните пожалуйста почему куки считают не безопасными? Я думаю что это вполне себе безопасная вещь, я просто хочу убедится в этомКуки по подсунутой...

254
Как получить attr img через native js?

Как получить attr img через native js?

Привет есть такой код

196
Как изменить адресную строку в браузере? [требует правки]

Как изменить адресную строку в браузере? [требует правки]

создал сайт а не могу понять как изменить адресную строку

179