Я создаю веб-сайт курса, и у каждого курса есть собственная страница. Допустим, я открываю курс №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 (поскольку для API требуется идентификатор), а затем установить его в качестве параметров маршрута. Или действительно так нельзя? @Дэн



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте объект для поиска идентификатора каждого курса по имени. Передайте параметр 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?
Пожалуйста. Однако поиск должен быть где-то, не обязательно в приложении. Возможно, ваш API предоставляет список, который вы могли бы преобразовать в этот формат. Вы даже можете сохранить его в файле JSON, если хотите.
Ооо, я вижу. Не уверен, что я соглашусь с этим, потому что на моем веб-сайте также есть функция, позволяющая пользователям публиковать курсы. Я ни за что не запрограммирую все курсы. Но, большое спасибо за ваше объяснение. Очень признателен!
Это должно быть хорошо. Ваша система будет генерировать идентификатор, когда они публикуют курс, и вы вводите как название, так и идентификатор в базу данных / файл JSON и т. д. Это не должно быть жестко закодировано. Но где-то приложение должно иметь возможность получить идентификатор из имени, иначе просто невозможно передать идентификатор в API.
Похоже, API нужен параметр
id, так как он будет работать, если вы перестанете его передавать?