Преобразование заголовка параметра маршрута Vue в идентификатор

Я создаю веб-сайт курса, и у каждого курса есть собственная страница. Допустим, я открываю курс №1, тогда ссылка http://localhost:8080/course/1. Я хочу изменить его на http://localhost:8080/course/course-name-here. Моя проблема в том, что когда я меняю параметр, данные не извлекаются из API.

index.js

{
    path: '/courses',
    name: 'Courses',
    component: () => import(/* webpackChunkName: "about" */ '../views/Courses.vue')
},
{
    path: '/course/:id',
    name: 'CourseDetail',
    props: true,
    component: () => import(/* webpackChunkName: "about" */ '../views/CourseDetail.vue')
}

CourseList.vue

<v-row>
   <v-col sm = "6" md = "4" v-for = "course in courses" v-bind:key = "course.courseId">
      <router-link v-bind:to = "{name: 'CourseDetail', params: {id: course.courseTitle}}" class = "text-decoration-none">
         <VerticalCard v-bind:course = "course"/>
      </router-link>
   </v-col>
</v-row>

CourseDetail.vue (скрипт)

import axios from 'axios'
export default {
  props:['id'],
  data: function(){
    return {
      singleCourse: null,
      selectedIndex: null,
      showPage: false
    }
  },
  methods: {
    getData() {
      var that = this
      axios.get('http://my-api-here.amazonaws.com/v1/api/course?id=' + this.id,
            {
              headers: {
                'Authorization' : 'Bearer ' + this.$store.state.authKey 
              }
            })
            .then(function(response) {
              that.singleCourse = response.data.body
            })
      },
      show() {
        if (this.$store.state.isLogin == true){
          this.showPage = true
        }
        else {
          this.$router.replace('/login')
        }
      }
  },
  mounted: function() {
    this.getData()
    this.show()
  }
}

пример одиночного курса

{ "_id": { "$oid": "5fc63dab36d8491476999831" }, 
"courseTitle": "Python For Everybody", 
"createdDate": { "$date": 1606852635135 }, 
"creator": "Admin", 
"courseId": 1, 
"courseDesc": "Description Lorem Ipsum is simply dummy text of the printing", 
"courseCategory": "Programming", 
"courseImage": "https://cwpwp2.betterthanpaper.com/wp-content/uploads/2019/06/2-1-1.jpg", 
"syllabus": [ { "chapterName": "Introduction to Python 3 Programming Tutorial", "chapterVideo": "eXBD2bB9-RA" }] }

Похоже, API нужен параметр id, так как он будет работать, если вы перестанете его передавать?

Dan 12.12.2020 03:03

Да, я знаю это. Вот почему я не понимаю, как получить заголовок из API (поскольку для API требуется идентификатор), а затем установить его в качестве параметров маршрута. Или действительно так нельзя? @Дэн

ella 12.12.2020 03:13
Поведение ключевого слова "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
2
173
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Используйте объект для поиска идентификатора каждого курса по имени. Передайте параметр title вместо id (измените на title в маршруте, ссылке и реквизите). В компоненте:

data() {
  return {
    courseIds: {
      'course-name-here': 1,
      'other-course': 2,
      'one-more': 3
    }
  }
}

Используйте это в getData():

getData() {
   ...
   const url = 'http://my-api-here.amazonaws.com/v1/api/course?id=';
   axios.get(url + this.courseIds[this.title])
   ...
}

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

Спасибо за Ваш ответ! Но значит ли это, что я должен хардкодить все courseIds?

ella 12.12.2020 03:49

Пожалуйста. Однако поиск должен быть где-то, не обязательно в приложении. Возможно, ваш API предоставляет список, который вы могли бы преобразовать в этот формат. Вы даже можете сохранить его в файле JSON, если хотите.

Dan 12.12.2020 03:50

Ооо, я вижу. Не уверен, что я соглашусь с этим, потому что на моем веб-сайте также есть функция, позволяющая пользователям публиковать курсы. Я ни за что не запрограммирую все курсы. Но, большое спасибо за ваше объяснение. Очень признателен!

ella 12.12.2020 03:54

Это должно быть хорошо. Ваша система будет генерировать идентификатор, когда они публикуют курс, и вы вводите как название, так и идентификатор в базу данных / файл JSON и т. д. Это не должно быть жестко закодировано. Но где-то приложение должно иметь возможность получить идентификатор из имени, иначе просто невозможно передать идентификатор в API.

Dan 12.12.2020 03:55

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