Как передать данные приложения в компонент VueRouter

Я использую VueRouter для загрузки шаблонов в зависимости от URL-адреса. Когда я пытаюсь использовать свойство, определенное в app.data в компонентах, я получаю [VueWarn] Property or method "role" is not defined.

Как передать каждое свойство данных дочерним компонентам?

Это мой сценарий:

const Home = { template: '<p>home page, {{role}}</p>' }
const NotFound = { template: '<p>Page not found</p>' }

const routes = [
    {path: '/', component: Home}
    {path: '*', component: NotFound}
]

Vue.use(VueRouter)
var app = new Vue({
    el: '#app',
    data: {
        role: 0,
        cookiesAlert: true
    },
    router: new VueRouter({routes})
})

Взгляните на vuex, если вы хотите совместно использовать глобальные данные в своем приложении.

Psidom 18.12.2018 23:00

Используйте vuex, как сказал @Psidom. Дочерние компоненты не имеют того же общего, что и родительские компоненты.

Trevor V 18.12.2018 23:16

В этом случае вы должны использовать Vuex, как это было предложено в двух приведенных выше комментариях.

Ru Chern Chong 19.12.2018 15:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
980
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что параметры конструкции вашего роутера настроены неправильно. Обычно я предпочитаю использовать «именованные маршруты», поэтому я установлю следующее:

const router = new VueRouter({
   routes: [
        { name: 'role', path: '/:role', component: User },
        { path: '*', component: Home }
   ]
})

И если я не понимаю ваш вопрос неправильно, что вы хотите сделать, это передать «данные» в родительских компонентах дочерним компонентам через URL-адрес и прочитать данные в дочернем компоненте?

const User = {
  template: '<div><br/>Role read from url is {{ $route.params.role }}</div>'
}

const Home = {
  template: '<div><br/>Welcome</div>'
}

const router = new VueRouter({
  routes: [
    { name: 'role', path: '/:role', component: User },
    { path: '*', component: Home }
  ]
})


new Vue({
  router,
  el: '#app',
  data: {
       role: 'default role'
  }
})
<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue-router/3.0.2/vue-router.min.js"></script>


<div id = "app">

  
  The role is (Please change the 'role' value and click on '/User' link): <input v-model = "role" type = "text" /> <br/>
  
  <router-link :to = "{ name: 'role', params: { role: role  }}">User</router-link>
   
 
  <router-link to = "/">Home</router-link>
  
  <router-view></router-view>
  
</div>

Или, если вы не хотите использовать $route.params.role, я сделаю так, чтобы «props» в параметрах конфигурации маршрутизатора было истинным.

When props is set to true, the route.params will be set as the component props.

const router = new VueRouter({
   routes: [
      { name: 'role', path: '/:role', component: User, props: true },
      { path: '*', component: Home }
   ]
})

И привяжите к «реквизитам» внутри дочерних компонентов.

const User = {
   props: ['role'],
   template: '<div><br/>Role read from url is {{ role }}</div>'
}

Другие вопросы по теме