Maison > Questions et réponses > le corps du texte
J'ai une page ProjectPage.vue qui affiche les problèmes dans v-data-table. Les éléments sont récupérés à partir des appels d'API du serveur dans la barre latérale et y sont affichés. Après avoir sélectionné un projet, je souhaite obtenir ses problèmes du serveur en utilisant l'identifiant du projet. Est-il possible de faire cela en utilisant Vuex.
Est-il possible d'utiliser Vuex pour que chaque projet puisse utiliser le même fichier .js pour récupérer son problème, car il peut y avoir n'importe quel nombre de projets.
Ce que je veux faire, c'est transmettre l'identifiant et l'élément en tant qu'accessoires de VerticalNavMenu.vue à ProjectPage afin que je puisse transmettre l'identifiant en tant que paramètre à mapAction à l'intérieur de ProjectPage pour récupérer son problème.
La méthode que j’utilise actuellement ne fonctionne pas. Lorsque j'ouvre la table du projet, la table ne contient aucune donnée disponible
J'espère que Peoject_Pages.js aidera à comprendre mon problème.
VerticalNavMenu.vue (comportement du modèle associé 38 -> 48)
<template> <v-navigation-drawer :value="isDrawerOpen" app expand-on-hover mini-variant-width="60px" floating width="260" class="app-navigation-menu" :right="$vuetify.rtl" @input="val => $emit('update:is-drawer-open', val)" > <!-- Navigation Header --> <div class="vertical-nav-header d-flex items-center ps-6 pe-5 pt-5 pb-2"> <router-link to="/" class="d-flex align-center text-decoration-none"> <v-slide-x-transition> <h2 class="app-title text--primary">ITrackerHub</h2> </v-slide-x-transition> </router-link> </div> <!-- Navigation Items --> <v-list expand shaped class="vertical-nav-menu-items pr-5"> <nav-menu-link title="Dashboard" :to="{ name: 'dashboard' }" :icon="icons.mdiHomeOutline" ></nav-menu-link> <v-list> <v-list-group :prepend-icon="icons.mdiTelevisionGuide"> <template v-slot:activator> <v-list-item-content> <v-list-item-title v-text="'My Projects'"></v-list-item-title> </v-list-item-content> </template> <v-list-item v-for="(project, index) in ProjectList" :key="index"> <v-icon class="mx-2">{{ icons.mdiAccountGroup }}</v-icon> <v-list-item-content> <router-link class="d-flex align-center text-decoration-none black--text" :to="{ name: 'ProjectPage', params: { id: project.id, project} }" > {{ project.title }} </router-link> </v-list-item-content> </v-list-item> </v-list-group> </v-list> <nav-menu-link title="My Issues" :to="{ name: 'MyIssues' }" :icon="icons.mdiBookEditOutline"></nav-menu-link> <nav-menu-link style="position:relative; top:70px;" title="Account Settings" :to="{ name: 'pages-account-settings' }" :icon="icons.mdiAccountCogOutline" ></nav-menu-link> <nav-menu-link style="position: relative; top: 200px" title="Create Project" :to="{ name: 'CreateProject' }" :icon="icons.mdiPlusMinus" ></nav-menu-link> </v-list> </v-navigation-drawer> </template> <script> // eslint-disable-next-line object-curly-newline import { mdiHomeOutline, mdiAlphaTBoxOutline, mdiEyeOutline, mdiCreditCardOutline, mdiTable, mdiFileOutline, mdiFormSelect, mdiAccountCogOutline, mdiAccountGroup, mdiAccountMultiple, mdiTelevisionGuide, mdiBookEditOutline, mdiPlusMinus, } from '@mdi/js' // import NavMenuSectionTitle from './components/NavMenuSectionTitle.vue' import NavMenuGroup from './components/NavMenuGroup.vue' import NavMenuLink from './components/NavMenuLink.vue' import { mapGetters, mapActions } from 'vuex' export default { components: { // NavMenuSectionTitle, NavMenuGroup, NavMenuLink, }, computed: { ...mapGetters(['ProjectList']) }, methods: { ...mapActions(['fetchProjects']) }, created() { // this.getProjectList() this.fetchProjects() }, props: { isDrawerOpen: { type: Boolean, default: null, }, }, setup() { return { icons: { mdiHomeOutline, mdiAlphaTBoxOutline, mdiEyeOutline, mdiCreditCardOutline, mdiTable, mdiFileOutline, mdiFormSelect, mdiAccountCogOutline, mdiAccountGroup, mdiAccountMultiple, mdiTelevisionGuide, mdiBookEditOutline, mdiPlusMinus, }, } }, } </script> <style lang="scss" scoped> .app-title { font-size: 1.25rem; font-weight: 700; font-stretch: normal; font-style: normal; line-height: normal; letter-spacing: 0.3px; } // ? Adjust this `translateX` value to keep logo in center when vertical nav menu is collapsed (Value depends on your logo) .app-logo { transition: all 0.18s ease-in-out; .v-navigation-drawer--mini-variant & { transform: translateX(-10px); } } @include theme(app-navigation-menu) using ($material) { background-color: map-deep-get($material, 'background'); } .app-navigation-menu { .v-list-item { &.vertical-nav-menu-link { ::v-deep .v-list-item__icon { .v-icon { transition: none !important; } } } } } </style>
NavBar.js
import axios from 'axios' const state = { Projects: [], } const getters = { ProjectList: (state) => state.Projects } const actions = { async fetchProjects({ commit }) { const response = await axios.get('https://fadiserver.herokuapp.com/api/v1/my-projects/') commit('setProjects', response.data) } } const mutations = { setProjects: (state, Projects) => (state.Projects = Projects) } export default { state, getters, actions, mutations }
ProjectPage.vue
<template> <v-card> <v-card-title class="text-center justify-center py-6"> <h1 class="font-weight-bold text-h2 basil--text"> {{ project.title }} </h1> </v-card-title> <v-tabs v-model="tab" background-color="primary" dark centered> <v-tab v-for="item in items" :key="item.tab">{{ item.tab }}</v-tab> </v-tabs> <v-tabs-items v-model="tab"> <v-tab-item v-for="item in items" :key="item.tab"> <v-card flat> <v-card v-if="item.tab == 'Issues'"> <template> <div class="text-center"> <v-dialog v-model="dialog" width="500"> <template v-slot:activator="{ on }"> <v-btn class="success" dark v-on="on"> <v-icon align-self: left> mdi-plus-thick </v-icon> Add Issue </v-btn> </template> <v-card> <v-card-title> <h2>Add Issue</h2> </v-card-title> <v-card-text> <v-form class="px-3"> <v-text-field v-model="title" label="Title"></v-text-field> <v-textarea v-model="description" label="Description"></v-textarea> <v-select item-text="text" item-value="value" :items="time_est" v-model="time_estimate" label="Time Estimate" ></v-select> <v-select item-text="title" item-value="id" :items="issueType" v-model="issue_type" label="Issue Type" ></v-select> <v-select item-text="title" item-value="id" v-model="issue_status" label="Issue Status" :items="issueStatus" ></v-select> <v-select item-text="title" item-value="id" :items="issueSeverity" v-model="issue_severity" label="Issue Severity" ></v-select> <v-spacer></v-spacer> <v-btn flat @click=" postIssue() reloadPage() " class="success mx-0 mt-3" > <v-icon align-self:left>mdi-content-save-check-outline</v-icon> Save</v-btn > </v-form> </v-card-text> </v-card> </v-dialog> </div> </template> <v-card> <v-data-table :headers="headers" :items="Project_Issues" item-key="full_name" class="table-rounded" hide-default-footer enable-sort @click:row="handleClick" > </v-data-table> </v-card> </v-card> </v-card> </v-tab-item> </v-tabs-items> </v-card> </template> <script> import axios from 'axios' import { mapGetters, mapActions } from 'vuex' export default { props: ['id', 'project'], computed: { ...mapGetters(['Project_Issues']), }, data() { return { tab: null, items: [{ tab: 'Issues' }, { tab: 'Calender' }, { tab: 'About' }], title: '', description: '', time_estimate: '', issue_type: '', issue_status: '', issue_severity: '', time_est: [ { value: '1', text: '1' }, { value: '2', text: '2' }, { value: '3', text: '3' }, { value: '4', text: '4' }, { value: '5', text: '5' }, { value: '6', text: '6' }, { value: '7', text: '7' }, { value: '8', text: '8' }, ], } }, setup() { return { headers: [ { text: 'Title', value: 'title' }, { text: 'Description', value: 'description' }, { text: 'Estimate', value: 'time_estimate' }, { text: 'Assignees', value: 'user' }, { text: 'Type', value: 'issueType' }, { text: 'Status', value: 'issueStatus' }, { text: 'Severity', value: 'issueSeverity' }, ], } }, methods: { ...mapActions(['fetchProjectIssueList']), handleClick(issue) { this.$router.push({ name: 'IssuePage', params: { id: issue.id, issue }, }) }, postIssue() { axios .post('https://fadiserver.herokuapp.com/api/v1/my-issues/', { title: this.title, description: this.description, time_estimate: this.time_estimate, userid: 'f3260d22-8b5b-4c40-be1e-d93ba732c576', projectid: this.id, issueTypeId: this.issue_type, issueStatusId: this.issue_status, issueSeverityId: this.issue_severity, }) .then(response => { console.log(response) }) .catch(error => { console.log(error) }) }, reloadPage() { window.location.reload() }, }, mounted() { this.fetchProjectIssueList(this.id) }, } </script> <style scoped> .v-btn { left: 43%; } </style>
Project_Page.js
import axios from 'axios' const state = { issuesList: [], } const getters = { Project_Issues: (state) => state.issuesList } const actions = { async fetchProjectIssueList({ commit }, {projectid}) { const response = await axios.get('https://fadiserver.herokuapp.com/api/v1/my-issues-titles/?projectid=' + projectid) commit('setProjectIssues', response.data) }, } const mutations = { setProjectIssues: (state, issuesList) => (state.issuesList = issuesList) } export default { state, getters, actions, mutations }
P粉6271364502024-02-22 12:13:23
Il existe deux façons de résoudre votre problème.
fetchProjectIssueList
方法中传递一个带有键 projectid
fetchProjectIssueList
méthodethis.fetchProjectIssueList({ projectid: this.id }) ... async fetchProjectIssueList({ commit }, {projectid}) { ... }
ou
this.fetchProjectIssueList(this.id) ... async fetchProjectIssueList({ commit }, projectid) { ... }