VueJS如何使用<router-view>在两个组件之间传递道具

时间:2017-12-17 11:49:07

标签: javascript vue.js vuejs2

我是vue.js的新手,我正在尝试构建一个小应用程序,我在一个案例中需要在两个组件之间传递道具。由于某种原因,它不起作用,我不知道为什么。

这是第一个组件,Playlist.Vue组件:

<template>
 <div class="playlists-con">
   <div class="playlists">
     <h1>Available Playlists for category: {{id}}</h1>
     <ul>
        <router-link v-for="playlist in playlists" :to="`details/${playlist.id}`" tag="li" active-class="active" exact>
            <div class="playlist-wrapper">
                <div class="imgWrap">
                    <img :src="playlist.images[0].url" />    
                </div>
                <a>{{playlist.name}}</a>
            </div>
        </router-link>
    </ul>
  </div>
  <div>
    <router-view category="id"></router-view>
  </div>

 </div>
</template>

<script>

export default {
   data() {
     return {
        id: this.$route.params.id,
        playlists : []
    }
  },
  watch: {
    '$route'(to, from) {
        this.id = to.params.id
    }
  },
  methods: {
    fetchPlaylist() {
        this.$http.get('' + this.id + '/playlists')
        .then(response => {
            return response.json()
        })
        .then(data => {
            const playlist_items = data.playlists.items;

            for (let key in playlist_items) {
              this.playlists.push(playlist_items[key])
            }                
        })
       }
    },
    created() {
       this.fetchPlaylist();
    }
}
</script>
从播放列表组件

,我应该能够获得播放列表的详细信息。我还想将类别道具传递给PlaylistDetails.vue,所以我尝试<router-view category="id"></router-view> - 但这不起作用。

PlaylistDetails.vue组件(我想显示从Playlist.vue组件传递的类别prop):

<template>
  <div class="playlist-details">
    <router-link :to="`/categories/${category}`">Go to playlists</router-link>
    <h1>Playlist Details for Playlist: <span class="playlist-name">{{playlistName}}</span></h1>
    <h1>category: {{ category }}</h1>
    <ul>
      <li v-for="track in tracks">
          <p>{{ track.track.artists[0].name}} - {{ track.track.name }}</p>
      </li>
   </ul>
 </div>
</template>

<script>

export default {
  props: ['category'],
  data() {
    return {
        id: this.$route.params.id,
        tracks : [],
        playlistName: ''
    }
  },
  watch: {
    '$route'(to, from) {
        this.path = from.params.path
    }
  },     
  beforeRouteEnter(to, from, next) {
    if (true) {
        next();
    } else {
        next(false);
    }
  },
  methods: {
    fetchPlaylistDetails() {
        this.$http.get('https://api.spotify.com/v1/users/spotify/playlists/' + this.id)
        .then(response => {
            return response.json()
        })
        .then(data => {
            const playlist_tracks = data.tracks.items;
            for (let key in playlist_tracks) {
                this.tracks.push(playlist_tracks[key])
            }
            this.playlistName = data.name;
        })
    }
  },
  created() {
    this.fetchPlaylistDetails();
  }
 }
</script>

我做错了什么?

更新

这是我的路由器配置:

export const routes = [
   {
     path: '', default: App
   },
   {
     path: '/categories/:id/playlists', props: true, component: Playlists
   },
   { 
     path: '/categories/:id/details/:id', component: PlaylistDetails, props: true, beforeEnter: (to, from, next) => {
    next();
   }},
   {path: '*', redirect: '/'}
]

2 个答案:

答案 0 :(得分:1)

你已经到了一半,你在路线上定义了props:true,这意味着在网址中匹配的每个动态属性都将作为道具传递,所以:

//this will pass 'id' as a prop to the playlist component
{
   path: '/categories/:id/playlists', props: true, component: Playlists
},

所以在播放列表组件中你会有这个:

props: ['id'],
data() {
     return {   
        playlists : []
    }
  },

细节组件也是如此:

 //change the name of the param to distinguish it from the category id
{ 
     path: '/categories/:id/details/:detailsId', component: PlaylistDetails, props: true, beforeEnter: (to, from, next) => {
    next();
   }},

PlaylistDetails.vue:

props: ['detailsId'],
....
methods: {
    fetchPlaylistDetails() {
        this.$http.get('https://api.spotify.com/v1/users/spotify/playlists/' + this.detailsId)
        .then(response => {
            return response.json()
        })
        .then(data => {
            const playlist_tracks = data.tracks.items;
            for (let key in playlist_tracks) {
                this.tracks.push(playlist_tracks[key])
            }
            this.playlistName = data.name;
        })
    }
  },

答案 1 :(得分:0)

有两种方法可以在非父组件之间传递数据。在尝试使用router-view

解决问题之前,我建议您先看看它们