vue路由小demo练习

路由知识详解地址
接着前面的demo地址继续练习路由知识.
主要完成首页和电影无刷新跳转切换以及动态路由.实际就是组件之间的切换
先上效果图
首页:(简单表示一下)
在这里插入图片描述
电影页:
在这里插入图片描述
假设有一个电影详情页,详情页需要根据电影的id来获取电影对象,然后渲染组件
那么电影详情页的地址中就需要包含电影的id

这里就涉及到三个问题:
如何把动态地址(地址某一部分会变化)匹配到组件
如何在组件中获取到动态部分的内容
路由跳转时,如何优雅的告知动态内容
解决方案见地址

在这里插入图片描述
项目目录:
在这里插入图片描述
在前面基础上增加了以下几个组件:
Home.js 主页组件
Movie.js 电影页组件
router.js 路由规则配置组件
MovieDetail.js 电影详情页组件

index.js

// 入口模块

// 负责新创建一个vue实例
import App from "./App.js";
import router from "./router.js"
new Vue({
  components: {
    App
  },
  router,   //将路由的功能嵌入到了vue实例中
  el: "#app",
  template: `<App/>`
});

App.js

// 新建一个组件
//路由规则配置:当你遇到什么样的路径的时候,你要去渲染什么样的组件
var template = `
  <div>
    <header>
        <router-link :to = "{ name:'home' }">首页</router-link>
        <router-link :to = "{ name:'movie-list' }">电影页</router-link>
    </header>

    <router-view />
  </div>
`;

// 导出一个组件配置对象
export default {
  template,
  methods: {
    back(){
      this.$router.back();
    }
  },
};

Home.js

export default {
  template:`
  <h1>首页</h1>`
}

Movie.js

import MovieDetail from "../components/MovieDetail.js"
import movieService from "../service/movieService.js";
var template = `
    <div class = "data-container">
    <button @click = "$router.back()">回到列表页</button>
        <h1>电影详情页</h1>
        <MovieDetail :movie = "movie"/>
    </div>    

`;
export default {
  template,
  components:{
    MovieDetail
  },
  data(){
    return{
      movie:null
    }
  },
  async created() {
    var movieId =this.$route.params.id;  //得到电影的id
    var resp = await movieService.getMovie(movieId);  //获取电影对象
    console.log(resp.data);
    this.movie = resp.data;
  },
}

router.js

import Home from "./pages/Home.js"
import MovieList from "./pages/MovieList.js"
import Movie from "./pages/Movie.js"
export default new VueRouter({
      routes: [
        //配置多条路由规则
        {
          //规则1
          name: "home",   //规则名称
          path: "/",  //当匹配到路径  / 时
          component: Home  //在router-view位置渲染Home组件
        },
        {
          //规则2
          name: "movie-list",  //规则名称
          path: "/movie",  //当匹配到路径 /movie时
          component: MovieList  //在router-view位置渲染Movie组件
        },
        {
          name: "movie-detail",
          path:"/movie/:id",
          component:Movie

        }
      ]
})

MovieDetail.js

var template = `
  <div v-if="movie" class="data-container">
    
    <h1>{{movie.name}}:电影详情</h1>
    <p>
      <strong>英文名:</strong>
      <span>{{movie.ename}}</span>
    </p>
    <p>
      <strong>票房:</strong>
      <span>{{movie.count}}</span>
    </p>
    <strong>导演</strong>
    <ul>
      <li v-for="item in movie.director" :key="item._id">
        <img :src="item.image" alt=""/>
        <strong>{{item.name}}</strong>
      </li>
    </ul>
    <p><strong>详情介绍:</strong>{{ movie.intro }}</p>
  </div>
`;

export default {
  template,
  props: ["movie"] //给我一个完整的电影对象
}

MovieItem.js

// 一条电影

var template = `
<div class="data">
  <div class="poster">
    <router-link :to="{name:'movie-detail', params:{id:movie._id}}">
    <img :src="movie.poster" alt=""> 
    </router-link>
  </div> 
  <div class="words">
    <router-link :to="{name:'movie-detail', params:{id:movie._id}}"><h2 class="title">{{movie.name}}</h2> </router-link>
    <div class="attach">
      <span>英文名:{{movie.ename}}</span> 
      <span>类型:{{movie.type}}</span> 
      <br> 
      <span>上映地区:{{movie.area}}</span> 
      <span>上映时间:{{movie.upDate}}</span> 
      <span>时长:{{movie.time}}</span>
    </div> 
    <div class="desc">
        {{movie.intro}}
    </div>
  </div>
</div>
`;

export default {
  props: ["movie"],
  template
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值