Передача идентификатора страницы из меню

#vue.js #vuejs2 #nuxt.js

Вопрос:

Я очень новичок в vue/nuxt и столкнулся с этой проблемой при реализации интерфейса для безголовой cms.

У меня есть два маршрута как таковые

Страницы

 -StandardPage
    ->_standardPage.vue
-InfoPage
    ->_InfoPage.vue
 

У моих _standardPage.vue и _infoPage.vue есть этот код (пока тот же, но изменится) В основном им нужен идентификатор guid для получения информации о странице из Api. Информация о странице содержит различные блоки, которые затем являются динамически сгенерированными компонентами:

 <template>
 <div>
  <Menu />
   <div v-for="block in site.blocks" :key="block.id">
    <component :is="block.blockName" :blockData="block"/>
   </div>
 </div>
</template>

<script>
export default{
  data(){
  return {
    site: Object
  }},
  methods: {
    this.site = result from async method, calling api to get page info by guid id (how do i get a hold of this guid)
  }
}
 

теперь проблема в том, что в моем компоненте меню я выполняю выборку, чтобы получить отображаемое имя меню и соответствующий идентификатор страницы (пункты меню могут быть добавлены/удалены по прихоти, поэтому у меня нет возможности заранее узнать эти идентификаторы), Когда я нажимаю пункт меню, я хочу передать идентификатор страницы на свою стандартную или информационную страницу, чтобы они могли получить соответствующие данные, но безуспешно.

Я пытался передать $от ребенка к родителю, но у меня не получилось сделать это по всем маршрутам. Если я сделаю $router.push с помощью пути и запроса, я получу неприятный идентификатор guid в URL-адресе, и это выглядит не очень дружелюбно.

Как лучше всего передать мой идентификатор guid из компонента меню на мои маршрутизируемые страницы?

Комментарии:

1. Итак, это работает с некоторыми параметрами запроса, верно? router.vuejs.org/guide/essentials/…

2. Если im использует push-сообщение маршрутизатора с именем вместо пути, я могу отправить первый идентификатор guid, который я щелкну в меню, но он остается статичным и отправляет тот же идентификатор guid после этого, независимо от того, какой пункт меню я щелкну. Может быть, я как-то неправильно все подстроил?

3. Обычно вы должны предпочитать использовать name чем path и, конечно, называть свои компоненты в этом случае.

Ответ №1:

Если у вас есть кнопка в вашем родителе, которая выглядит так

 <button @click="$router.push({ name: 'details-page', params: { guid: '123' } })">
  test
</button>
 

и это в ребенке по имени /pages/details-page.vue

 <script>
export default {
  name: 'DetailsPage',
  async fetch() {
    console.log('route', this.$route.params.guid)
    await axios...
  },
}
</script>
 

Вы сможете загружать некоторые данные в детей, в зависимости от вашего guid и без уродливого пути.

Комментарии:

1. Привет и спасибо, почти приехали! однако, если у меня теперь есть 2 или более «подробных страницы» и я перемещаюсь между ними, они указывают на один и тот же маршрут и отправляют один и тот же идентификатор. например,у меня есть страницы a,b, c (все подробные страницы), я нажимаю страницу a, и идентификатор guid 1 регистрируется, теперь я нажимаю страницу b, и идентификатор guid 1 все еще регистрируется

2. 1. у вас должно быть уникальное имя для ваших страниц. 2. если у вас нет уникального файла, в котором были бы все ваши дела, вы действительно можете разделить их на несколько страниц. 3. если вы хотите отправлять на разные страницы, вам нужно будет отправить некоторые динамические .push({ name: dynamicName }) данные и, возможно, также обновить guid значение в зависимости от того, на какой элемент вы нажимаете. 4. Я не могу больше помочь без какого-либо кода в этой части. Возможно, попробуйте посмотреть с помощью devtools или что-то console.log еще, что вы на самом деле передаете со своим маршрутизатором, но это должно работать нормально, как показано в моем примере.

3. Спасибо, может быть, я плохо объяснил проблему, однако вы направили меня в правильном направлении, и в конце концов я решил использовать vuex, чтобы просто обновить/сохранить текущий идентификатор guid страницы для легкого доступа.