Vue.js Как создать страницу для вывода данных об отдельных пользователях
Есть vue.js компонент генерирующий иконки пользователей из json массива,
users.vue
<template>
<div class="users">
<GameCard v-for="(user, index) in users"
:user="user" :key="index" class="user" />
</div>
</template>
<script>
import UserCard from "../components/UserCard";
import Vuex from 'vuex';
import { mapState} from 'vuex';
import firebase from 'firebase';
export default {
name: "All",
components: {
UserCard,
},
computed:{
...mapState([
'users'
]),
},
created: function() {
this.$store.dispatch('initUsers')
},
};
</script>
Задача состоит в следующем. Нажимаем иконку, попадаем на страницу пользователя, подгружаем данные данные по конкретному пользователю.
usercard.vue
<template>`
<div class="user-card">
<div class="user-card__preview">
<img :src='user.logo' class="user-card__image" />
<div class="game-card__title">{{user.name}}</div>
<div class="game-card__text">{{user.description}}</div>
</div>
</div>
</template>
<script>
import Vuex from 'vuex'
export default {
name: "UserCard",
props: {
user: Object,
},
};
</script>
store.js
import Vue from 'vue';
import Vuex from 'vuex';
import firebase from 'firebase';
Vue.use(Vuex);
export const store = new Vuex.Store({
state: {
users: [],
},
getters: {
gamesFilterToVisible: state => {
return state.users.filter(userss => users.settings.visible);
},
},
mutations: {
SET_USER: (state, users) => {
state.users = users;
},
},
actions: {
initUsers: ({commit}) => {
firebase.firestore().collection('users')
.get()
.then(querySnapshot => {
let data = querySnapshot.docs.map(doc => doc.data())
commit('SET_USERS', data);
})
},
}
});
Вопрос как это сделать.
Ответы (2 шт):
<template>
<div class="games">
<GameCard v-for="(game, index) in games"
:game="game" :key="index" class="games__item"
@click="handleClick(index)" />
</div>
</template>
<script>
export default {
data: function() {
return {
selectedItem: null
};
},
methods: {
handleEditClick(index) {
this.selectedItem = index;
}
}
</script>
Спасибо за ответ, но сначала не совсем ясно понимал, что делать. Теперь выяснил, что надо использовать динамическую маршрутизацию. В файле маршрутов добавляем:
{
path: "/user/ :id",
name: "User",
component: User,
props: true,
}
Динамический сегмент содержит параметр id. Назовем маршрут Id, чтобы позже к нему было легче обращаться с помощью компонента router-link. А теперь, создадим компонент User.vue Задача - отобразить информацию о пользователе внутри данного компонента. В шаблоне User у нас будет доступ к значению $route.params.id. Это параметр id, переданный в URL-aдpece. Чтобы убедиться в корректности передачи идентификатора, выведем его в верхней части компонента.
User.vue
<h2 class="user-card__id">{{ $route.params.id}}</h2>
в компоненте
UserCard
<router-link tag="div" :to="{ name : 'User', params: {id: user.id}}" >{{user.name}}</router-link>
Создаем элемент router-link с входным параметром tag. С помощью этого параметра router-link преобразуется в заданный тег. Входной параметр to обозначает целевой маршрут ссылки, который можно описать в виде объекта. Для передачи параметров используется синтаксис params: { id:user. id}, таким образом, значение user.id будет передано в динамический сегмент под именем id. Например, если user.id равно 1005, маршрут будет выглядеть как /user/1005.