2021-11-27 vue移动端卖座电影项目(二) 封装选项卡,引入iconfont,nowPlaying获取数据后写样式

本文档介绍了在Vue移动端卖座电影项目中如何封装选项卡组件,设置Iconfont图标,并通过nowPlaying获取后台数据来展示电影的海报、标题、评分和演职员表。详细步骤包括在App和tabbar组件中封装选项卡,main.js中配置Iconfont,以及利用全局过滤器处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.封装选项卡

App.vue

<template>
  <div>
    <!-- 把选项卡中的电影,个人中心等封装到单独组件tabbar中 -->
    <tabbar></tabbar>
    <router-view></router-view>
  </div>
</template>

<script>
  // 导入组件tabbar
  import tabbar from "./components/tabbar"

  export default {
      name: "App",
      components: {
          tabbar,

      },
  }; 
</script>

src/components/tabbar.vue

<template>
<footer>
    <ul>
      <router-link to="/Film" custom v-slot="{navigate,isActive}">
        <li @click="navigate" :class="isActive?'myactive':''">
           <i class="iconfont icon-dianying">热映电影</i>
        </li>
      </router-link>
      <router-link to="/Cinema" custom v-slot="{navigate,isActive}">
        <li @click="navigate" :class="isActive?'myactive':''">
           <i class="iconfont icon-yingyuan">附近影院</i>
        </li>
      </router-link>
      <router-link to="/Center" custom v-slot="{navigate,isActive}">
        <li @click="navigate" :class="isActive?'myactive':''">
           <i class="iconfont icon-icon_pc">个人中心</i>
        </li>
      </router-link>
  </ul>
</footer>
</template>

<script>
export default {

};
</script>
<style lang="scss" scoped>
  footer{
    position: fixed;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 2.722222rem;
    background: white;
    ul{
      display: flex;//父元素设置弹性盒
      li{
        //子元素都设置flex: 1:子元素平分并占满父盒子
        flex:1;
        line-height: 2.722222rem;
        text-align: center;
      }
    }
  }
</style>
2.设置iconfont

main.js

import '@/assets/iconfont/iconfont.css'

tabbar.vue

  <i class="iconfont icon-dianying">热映电影</i>
  <i class="iconfont icon-yingyuan">附近影院</i>
  <i class="iconfont icon-yingyuan">个人中心</i>
3.nowPlaying获取数据后写样式
3.1.获取后台数据

详见:2022-11-17 vue移动端卖座电影项目(一) 获取后台数据

3.2.从data对象获取电影海报,标题,评分
  <!-- 获取电影海报 -->
  <img :src="data.poster" alt="">
  <!-- 获取电影标题 -->
  <h3>{{data.name}}</h3>
  <!-- 获取观众评分 -->
  <p>观众评分{{data.grade}}</p>
3.3.过滤data.actor,获取演职员表

使用全局过滤器:actorfilter

<p>{{data.actors | actorfilter}}</p>

注册全局过滤器:actorfilter

import Vue from "vue"
Vue.filter('actorfilter',function(data){
    //回顾map的用法:
    // console.log([0,1,2].map(item=>`我是第${item+1}名`));
    // 处理data.name数组
    var newList=data.map(item=>item.name);
    // console.log(newList);
    return newList.join(' ');
});
3.4.nowPlaying.vue
  <template>
  <div>nowPlaying...
      <ul>
        <li v-for="data in datalist" :key="data.filmId" @click="handleChangePage(data)">
          <!-- {{data.name}} -->
          <!-- 获取电影海报 -->
          <img :src="data.poster" alt="">
          <!-- 获取电影标题 -->
          <h3>{{data.name}}</h3>
          <!-- 获取观众评分 -->
          <p>观众评分{{data.grade}}</p>
          <!-- 获取导演和主演信息:此处要处理一下数组data.actors(过滤) -->
          <p>{{data.actors | actorfilter}}</p>
        </li>
  </ul>
  </div>

</template>
<script>
import axios from "axios"
// 注册过滤器需要用到Vue,所以引入vue:在哪使用就在哪引入
import Vue from "vue"
Vue.filter('actorfilter',function(data){
    //回顾map的用法:
    // console.log([0,1,2].map(item=>`我是第${item+1}名`));
    // 处理data.name数组
    var newList=data.map(item=>item.name);
    // console.log(newList);
    return newList.join(' ');
});
export default {
  data(){
    return{
      // datalist:["1111","2222","3333"]
      datalist:[]
    }
  },
  methods:{
    handleChangePage(id){
      console.log(id);
      this.$router.push({name:'renameDetail',params:{id:id}});
    }
  },
  mounted(){
    // 网络>复制>复制链接地址
    // axios.get("https://m.maizuo.com/gateway?cityId=310100&pageNum=1&pageSize=10&type=1&k=2318535")
    // 使用axios的完整写法配置字段
    /*字段获取:网络>标头>请求标头>
        X-Client-Info: {"a":"3000","ch":"1002","v":"5.2.1","e":"16662641254110824868151297"}
        X-Host: mall.film-ticket.film.list */
        axios({
          url:"https://m.maizuo.com/gateway?cityId=310100&pageNum=1&pageSize=10&type=1&k=2318535",
          headers:{
              'X-Client-Info': '{"a":"3000","ch":"1002","v":"5.2.1","e":"16662641254110824868151297"}',
             ' X-Host': 'mall.film-ticket.film.list'
          }
        }).then(res=>{
          console.log("获取数据data:",res.data);
          // console.log("获取数据data:",res.data.data.films);
          this.datalist=res.data.data.films;
        })
  }
}
</script>
<style lang="scss" scoped>
  ul{
    li{
      padding:10px;
      overflow:hidden;
      img{
        float: left;
        width: 100px;
      }
    }
  }
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值