Эта проблема сдерживает меня уже несколько дней, но, что еще хуже, я чувствую себя глупо. "Mayday, ТАК, мы его теряем".
ЗАДАЧА 1: Создать приложение, получающее данные из REST API REST API . Отображать данные в виде сетки ...
Easy. Эшафот с использованием vue-cli 3
. Дайте App.vue
функцию, выбирающую объект данных и отправляющую массив вниз по Grid.vue
, который распределяет его среди Tile.vue
s.
this.isLoading = true;
let self = this;
fetch(self.url)
.then(function(response) {
return response.json();
})
.then(function(myJson) {
self.fetchedBeers.push.apply(self.fetchedBeers, myJson);
self.isLoading = false;
});
}
...
GRID has:
<beer-tile
:beer="beer"
:key="beer.id"
v-for="beer in beers"
:displayDetails="beer.id===beerOpen"
@clicked="handleTileClick"
@closed="handleTileClose"
>
</beer-tile>
ЗАДАЧА 2: При щелчке должно появиться всплывающее окно, отображающее некоторые дополнительные сведения об элементе, по которому щелкнули
Конечно, давайте подадим данные Tile.vue
this.$emit
событие при клике, Grid.vue
прослушивают его, проверяют идентификатор и, в случае совпадения, отправляют соответствующую подпорку на плитку, заставляя ее показать, что это v-if
детали в модале.
Вот идет стена:
ЗАДАЧА 3: У страницы «Детали» есть отдельный адрес, чтобы сделать его доступным и совместно используемым, что означает, что к первому элементу извлекаемого массива можно получить доступ через whatever.com/1
Хорошо, это моя остановка. Я уже:
Отделено Details.vue
от Tile.vue
, поэтому оно может служить компонентом для router.js:
export default new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/',
name: 'home',
component: Home
},
{
path: '/:id',
component: Details
}
]
})
ПРИМЕЧАНИЕ - возможно ранняя ошибка, пожалуйста, исправьте меня: так как я хочу, чтобы Grid.vue
был виден на заднем плане модала, я решил поместить <router-view>
под ним в App.vue
, и иметь компонент home
( переходя к "./") в основном ничего - и получим Detials.vue
, когда идентификатор совпадает.
Обернутый v-for
'ed компонент плитки в <router-link>
:
...
now GRID has:
<router-link
:to="`${beer.id}`"
:key="beer.id"
v-for="beer in beers"
class="tile-wrapper"
>
<beer-tile :beer="beer">
</beer-tile>
Чтобы закрыть ее, нажмите кнопку "Назад", чтобы закрыть ее:
<router-link to="/">
<button class="return">BACK</button></router-link>
Последовал дружеский совет по динамически создаваемым маршрутам как здесь
ОТКАЗ
Это почти работает! Нажатие на плитку вызывает Details.vue
с правильными реквизитами, URL-адреса также могут быть возвращены.
ПРОБЛЕМА
Я чувствую, что с моим пониманием того, что должно происходить, что-то не так. Когда я нажимаю на плитку, она действительно вызывает Details.vue
с соответствующими реквизитами, но как только я на самом деле редактирую адресную строку браузера и вводю номер элемента как /:id
, скажем, localhost:8080/3
(или обновляю браузер с помощью этот URL, в этом отношении), он показывает мне компонент Details.vue
без реквизита, пустой.
ВОПРОС:
-При поступлении запроса на whateverappname.com/2
как передать соответствующий извлеченный объект компоненту? Должен ли я получить снова из Details.vue
? Звучит как пустая трата, если массив, содержащий все объекты (и, следовательно, маршруты), уже находится в App.vue
. Должен ли я как-то передать реквизиты <route-link>
с? Или, может быть, я должен сопоставить извлеченный массив объектов с маршрутами с помощью некоторых хитростей? Или, возможно, расширение оригинального извлеченного массива является способом? Пожалуйста, говорите со мной, как будто я 3.
Я был бы рад предоставить еще немного кода, если необходимо, постарался сделать его кратким (и все равно потерпел неудачу).