Как обновить свойства компонента для динамического роутера-ссылки в vuejs - PullRequest
0 голосов
/ 01 ноября 2019

Новичок в Vue, и я не нашел ничего, что конкретно касалось бы моей проблемы.

У меня есть простое приложение Vue, использующее VueRouter, где я пытаюсь создать спортивный турнир в стиле скобок, в котором записываются результатыразличные игры в турнире.

Мне нужно сделать асинхронный осевой вызов сервера, чтобы получить информацию о конкретной игре. Я не знаю, как правильно обновить мой компонент, чтобы получить эту информацию.

App.vue очень прост. Домашняя страница - это просто обзор скобки

<template>
  <div id="app">
    <div id="nav">
      <router-link :to="{ name: 'bracket'}">Bracket</router-link>
    </div>
    <router-view />
  </div>
</template>

У меня есть компонент вида Bracket.vue, и на данный момент все, что мне нужно, это представление, это предоставление ссылок на различные матчи в турнире. .

Я сделал эту работу довольно динамично следующим образом:

<template>
  <div class="home">
    <div id="nav">
      <div v-for="round in rounds" :key="round">
        <router-link v-for="game in gamesPerRound" :key="matchupKey(round, game)" :to="{ name: 'matchup', params: {round: round, game: game} }">Matchup {{ round }} {{ game }}</router-link>
      </div>
    </div>
  </div>
</template>

Когда нажата ссылка, я открываю другой компонент представления, Matchup.vue, который я хотел бы отобразить определенным образом. Данные о матче. (MatchupService является экземпляром Axios API)

Я передаю раунд # и игру # как реквизиты через роутер-линк. Они прекрасно загружаются в Matchup.vue.

Однако, когда я пытаюсь сделать асинхронный вызов для получения данных соответствия, ничего не происходит. свойство matchup никогда не обновляется, ни по ссылке, ни когда-либо. Поэтому я либо ничего не получаю (когда использую троичную систему, как показано ниже), либо ошибку, если я просто пытаюсь использовать matchup значение

Matchup.vue

<template>
      <div class="matchup">
        <h1>Round {{ round }}</h1>
        <h2>Game {{ game }}</h2>
        <h6>Team 1: {{matchup.teams ? matchup.teams[0]: 0}}</h6>
        <h6>Team 2: {{matchup.teams ? matchup.teams[1] : 0}}</h6>
      </div>
    </template>

    <script>
    import MatchupService from '@/services/MatchupService.js'

    export default {
      props: ["round", "game"],
      data() {
        return {
          matchup: {},
        }
      },
      async updated() {
          let matchups = await MatchupService.getMatchups()
          this.matchup = matchups.data.rounds[this.round].games[this.game]
      },
    }
    </script>

Я пыталсяЕсть много разных подходов к этому: обновленные и созданные против других ловушек, я пытался обновить свойство после загрузки и привязывать его к v-if и т. д.

Я просто совершенно забит этим,надеясь на помощь.

1 Ответ

1 голос
/ 01 ноября 2019

Похоже, вам нужно использовать навигационный хук beforeEnter в файле router.js или вы можете использовать beforeRouteEnter хук непосредственно в своем файле compoennt. (ВНИМАНИЕ! Используя beforeRouteEnter в файле компонента, вы не можете получить доступ к 'this', поэтому, возможно, есть причина использовать Vuex, если вы хотите сохранить некоторые данные в рамках серфинга вашего приложения). Там вы можете определить / получить / установить любые данные, прежде чем перенаправить пользователя на определенную страницу. Таким образом, вы делаете любые действия, которые хотите, и настраиваете их перед перенаправлением.

Подробнее об этом вы можете узнать здесь:

https://router.vuejs.org/guide/advanced/navigation-guards.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...