Как подключить маршрутизатор vue к компоненту vue? - PullRequest
1 голос
/ 04 апреля 2020

Я очень плохо знаком с фреймворком Vue, а также Javascript, но в настоящее время я создаю сайт с использованием Vue, и я хочу, чтобы в верхней части моего сайта были ссылки, по которым пользователь мог бы перейти , Я пытался использовать Vue Router (https://router.vuejs.org/guide/#javascript) для создания этих ссылок. На данный момент я просто хочу сделать небольшой раздел «О нас», к которому пользователь может перейти. Но, несмотря на то, что URL-адрес изменился соответственно на «localhost: 8080 / # / about_us», компонент Vue, который я связал со ссылкой, не будет отображаться.

Я структурировал свой код в основном. js как таковой:

import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './App.vue'

Vue.config.productionTip = false

export const eventBus = new Vue();
Vue.use(VueRouter);

const AboutUs = {template: '<div>about_us</div>'};

const route = [{path:'/about_us', component: AboutUs}];
const router= new VueRouter({route});

new Vue({
  render: h => h(App),
  router
}).$mount('#app')

И затем у меня есть мое приложение. vue, спроектированное как (примечание: я сократил большую часть кода до его основных для краткости):

import AboutUs from './components/AboutUs.vue'
import { eventBus } from './main.js'

export default {
  data(){
    return {
      films: []
    }
  },
  components: {
  "about-us": AboutUs
  },
  mounted(){
    fetch('https://ghibliapi.herokuapp.com/films')
    .then(res => res.json())
    .then(films => this.films = films)
    .catch(error=> console.log(error))
    }

}
</script>
body {
  background-color: deepskyblue;
}
<h1>Ghibli Fandom Extravaganza</h1>
  <nav>
      <li><router-link to="/about_us">About us </router-link></li>
      <router-view></router-view>
  </nav>
  <p>List of Ghibli Movies: <films-list :films="films"/></p>
  <film-detail />

На данный момент мой компонент AboutUs является лишь очень базовым c Vue, который показывает некоторую информацию о сайте в некотором простом HTML

меток. Но хотя ссылка активна и работает, информация из Vue не отображается, в то время как другие компоненты Vue продолжают отображаться, что указывает на то, что, возможно, они не подключены? Я пытался следовать учебному руководству на сайте Vue Router, но я не думаю, что понимаю механизм работы кода на самом деле. Кто-нибудь может порекомендовать мне какие-либо исправления?

ОБНОВЛЕНИЕ: Вот код для моих AboutUs. vue

<template>
<div>
    <h1>This site is for examining the movies of Studio Ghibli</h1>
</div>

</template>

<script>
export default {
    name: 'about-us'

}
</script>

<style scoped>

</style>

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Представленные вами примеры кода немного сбивают с толку, вы просто должны передать представление imported прямо в свойство component записи router.

Где вы сделали:

const AboutUs = {template: '<div>about_us</div>'};

Замените эту строку на:

import AboutUs from './components/AboutUs.vue'

Я не могу понять из вашей выборки, когда и какова актуальность components: {"about-us": AboutUs }, это не нужно.

Вот пример моей настройки:

маршрутизатор. js

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'index',
    component: () => import('../components/views/welcome')
  },
  {
    path: '/about-us',
    name: 'about-us',
    component: () => import('../components/views/about-us')
  }
]

const router = new VueRouter({
  mode: 'history',
  routes
})

export default router

main. js

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

Приложение. vue

<template>

  <v-app v-cloak>

      <router-link :to="{ name: 'index' }">Welcome</router-link>
      <router-link :to="{ name: 'about-us' }">About Us</router-link>

      <router-view></router-view>

  </v-app>
</template>

<script>

export default {
  name: 'App'
}

</script>

компонентов / просмотров / о нас. vue

<template>

  <div>This is the About Us page!</div>

</template>

<script>
  export default {
   name: 'about-us'
  }
</script>

В этом примере используется Режим истории

Другие примечания

При маршрутизации mounted ненадежен, вместо этого вы должны помещать любые логи извлечения c в собственные method при вызове любого:

methods: {
  fetch () {
    // https://github.com/axios/axios
    axios.get('https://ghibliapi.herokuapp.com/films').then( ... )
  }
}

Вызовите метод this.fetch в обоих beforeRouteUpdate и beforeRouteEnter вместо mounted, вы даже не можете полагаться на created, когда дело доходит до представлений, обрабатываемых vue-router.

Ax ios предлагается вместо собственного fetch , потому что ax ios обеспечивает больше функциональности, возможностей и совместимости с браузером.

В about-us. vue Вы добавляете эти Навигационные гвардии примерно так:


<template>

  <div>This is the About Us page!</div>

</template>

<script>
  export default {
   name: 'about-us'

  methods: {
    fetch () {
      axios.get('https://ghibliapi.herokuapp.com/films').then( ... )
    }
  }

  // Will fire if you are already on the view but a parameter changes (dynamic routing)
  beforeRouteUpdate(to, from, next) {
     this.fetch()
     next()
  },

  // Will fire when you enter the view
  beforeRouteEnter(to, from, next) {
    this.fetch()
    next()
  },

}
</script>

Оба должны быть добавлены, понимайте, что они не будут стрелять в в то же время только один из них при необходимости выполнит fetch один раз.

Это разрешит все проблемы, с которыми вы могли бы столкнуться при Dynami c Маршрутизация , если вы когда-либо используйте их.

Структура папок

 src/
 + App.vue
 + main.js
 + router.js
 + vue.config.js
 + assets/
    + logo.png
 + components/
    + views/
       + welcome.vue
       + about-us.vue

Надеюсь, это прояснит для вас требования к настройке.

0 голосов
/ 04 апреля 2020

Я думаю, что нет необходимости импортировать компонент aboutus. Вы можете просто написать так <router-link to="about_us">About us </router-link> и в основном. js объявить маршрут следующим образом const route = [{path:'/about_us',name:'about_us', component: () => import("path to about us file")}];

...