• nuxt.js 进行项目重构-首页


    nuxt.js 也是基于vue 的 那么就离不开组件化开发  我们按照组件结构来进行分析

     navTop

    页面的头部 通用组件 分隔了三个位置  适用于大多数头部  且预留插槽

    1. <template>
    2. <div class="nav-top">
    3. <div class="left">
    4. <slot name="left">slot>
    5. div>
    6. <div class="center">
    7. <slot name="center">slot>
    8. div>
    9. <div class="right">
    10. <slot name="right">slot>
    11. div>
    12. div>
    13. template>
    14. <script>
    15. export default {
    16. name: "Navtop"
    17. }
    18. script>
    19. <style scoped>
    20. .nav-top{
    21. display: flex;
    22. line-height: 52px;
    23. height: 52px;
    24. overflow: hidden;
    25. }
    26. .left,.right{
    27. display: flex;
    28. width: 16%;
    29. align-items: center;
    30. justify-content: center;
    31. }
    32. .center{flex: 1}
    33. style>

     在首页使用

    引入:

    import navTop from '../components/common/navtop/Navtop'

    注册

    components:{
      navTop,
    },

    使用 左边放logo 中间搜索框 右边放 标识

    1. <navTop class="navtop">
    2. <div slot="left">
    3. <img src="~assets/img/common/logo-bai.png" alt="" class="img1" @click="GoHome">
    4. div>
    5. <div slot="center">
    6. <input type="text" class="input" placeholder="二建优学班" @click="GoSearch">
    7. div>
    8. <div slot="right">
    9. <img src="~assets/img/tabbar/class-bai.svg" alt="" class="img2 svg" @click="GoClass">
    10. div>
    11. navTop>

    对应的回调 分别跳转到 不同的位置

    1. methods:{
    2. GoHome(){
    3. this.$router.push('/home')
    4. },
    5. GoSearch(){
    6. this.$router.push('/search')
    7. },
    8. GoClass(){
    9. this.$router.push('/class')
    10. }
    11. }

    Swiper 轮播组件

    首先要安装 对应的依赖包

    npm i swiper@4.5.1

    npm i vue-awesome-swiper@3.1.3

    创建对应的组件:

    swiper 的相关配置 v-swiper:mySwiper 绑定到下方 swiperOption当中

    轮播图的数据 由外部 组件 props 传进来

    图片加载完成后 @onload 发射自定义事件 通知首页 计算图片加载完成后的首页页面长度

    1. <template>
    2. <div v-swiper:mySwiper="swiperOption" v-if="csbanner.length">
    3. <div class="swiper-wrapper">
    4. <div class="swiper-slide" v-for="banner in csbanner">
    5. <img :src="banner" @load="homeswiperload()">
    6. div>
    7. div>
    8. <div class="swiper-pagination swiper-pagination-bullets">div>
    9. div>
    10. template>
    11. <script>
    12. export default {
    13. name: "swiper",
    14. props:{
    15. csbanner:{
    16. type:Array,
    17. default(){
    18. return[]
    19. }
    20. }
    21. },
    22. data(){
    23. return{
    24. swiperOption:{
    25. spaceBetween: 0,
    26. autoplay: {
    27. delay: 3000,
    28. disableOnInteraction: false,
    29. },
    30. pagination: {
    31. el: '.swiper-pagination',
    32. clickable: true,
    33. },
    34. speed:700,//切换速度
    35. loop:true//前后循环
    36. },
    37. isload:false,
    38. }
    39. },
    40. methods:{
    41. homeswiperload(){
    42. if(!this.isload){
    43. console.log('首页swiper轮播图加载完成');
    44. this.$emit('homeswiperload')
    45. this.isload = true
    46. }
    47. }
    48. }
    49. }
    50. script>
    51. <style scoped>
    52. .swiper-pagination{
    53. width: 100%;
    54. bottom: 10px;
    55. }
    56. style>

     plugin/swiper.js

    在这里编辑相关配置  挂载到nuxt.confin.js 的 plugin模块当中

    这样写 还有一个作用就是 在ssr渲染中 没有全局this 导致 swiper的相关报错

    1. import Vue from 'vue'
    2. if (process.browser) {
    3. const VueAwesomeSwiper = require("vue-awesome-swiper/dist/ssr");
    4. Vue.use(VueAwesomeSwiper);
    5. }

    在首页 引入及使用 

    import homeSwiper from '../components/common/swiper/swiper'
    
    components:{
      homeSwiper,
    },

    homeIcon 和 homeRecommend 都是基础布局+数据渲染 没什么难度

    
    
    

     主要就是网络请求相关的 流程 梳理一下:

    在nuxt.js 中 asyncData 属于一个生命周期 在此生命周期中请求数据  返回数据不用再赋值到组件的data 中 课直接供模板使用

    1. async asyncData({$axios}){
    2. const {data} = await $axios.get('http://www.wsg3096.com/ass/home-data.txt')
    3. return {homeData:data}
    4. },

    homeIcon

    1. <template>
    2. <div class="homeicon">
    3. <div v-for="n in cicons">
    4. <a :href="n.url">
    5. <img :src="n.img" alt="">
    6. <div>{{n.title}}div>
    7. a>
    8. div>
    9. div>
    10. template>
    11. <script>
    12. export default {
    13. name: "Home-icon",
    14. props:{
    15. cicons:{
    16. type:Array,
    17. default(){
    18. return[]
    19. }
    20. }
    21. }
    22. }
    23. script>
    24. <style scoped>
    25. .homeicon{
    26. display: flex;
    27. justify-items: center;
    28. text-align: center;
    29. padding: 10px 0px;
    30. background: #fff;
    31. box-shadow: 1px 8px 8px rgba(155,155,155,0);
    32. }
    33. .homeicon img{
    34. width: 48px
    35. }
    36. .homeicon div{
    37. width: 100%;
    38. text-align: center;
    39. cursor: pointer;
    40. font-size: 14px}
    41. style>

    homeRecommend

    1. <template>
    2. <div class="recommend">
    3. <div class="tuijian-bt">
    4. {{caws.boxBy1}}
    5. <a href="https://m.zhongxin5.cn/Live/Index?classId=0&teacherId=0&isback=2" target="_blank">
    6. <span>更多>span>
    7. a>
    8. div>
    9. <div class="tuijian" v-for="w in chotclass.slice(0,4)">
    10. <a :href="w.link">
    11. <img :src="w.img" alt="">
    12. <div class="right">
    13. <span class="tuijian-name">{{caws.erjian}} - {{w.tit2}}<br>{{w.tit3}}span>
    14. <span class="tuijian-price">
    15. <i>i>{{w.price}}<i class="line-c">¥{{w.lastprice}}i>
    16. span>
    17. div>
    18. a>
    19. <div class="clear-fix">div>
    20. div>
    21. div>
    22. template>
    23. <script>
    24. export default {
    25. name: "Home-recommend",
    26. props:{
    27. caws:{
    28. type:Object,
    29. default() {
    30. return {}
    31. }
    32. },
    33. chotclass:{
    34. type:Array,
    35. default() {
    36. return []
    37. }
    38. }
    39. },
    40. methods:{
    41. }
    42. }
    43. script>
    44. <style scoped>
    45. .tuijian{
    46. padding: 12px 10px;
    47. background: #fff;
    48. margin: 0px 16px;
    49. border-bottom: 1px solid #f8e8e8;
    50. }
    51. .tuijian-bt{
    52. font-size: 20px;
    53. font-weight: bold;
    54. line-height: 3;
    55. margin: 0px 18px;
    56. display: flex;
    57. justify-content: space-between;
    58. align-items: center;
    59. color: #f35;
    60. }
    61. .tuijian-bt span{
    62. font-size: 15px;
    63. font-weight: 400;
    64. color: #666;
    65. }
    66. .tuijian img{
    67. width: 45%;
    68. float: left;
    69. border-radius: 10px;
    70. }
    71. .tuijian-price i{
    72. font-style: normal;
    73. font-size: 16px;
    74. font-weight: 400;
    75. }
    76. .tuijian-price{
    77. font-size: 20px;
    78. font-weight: 600;
    79. color: #fc3f1d;
    80. margin-top: 8px;
    81. }
    82. .right{
    83. width: 55%;
    84. padding-left: 8px;
    85. }
    86. .tuijian-name{
    87. font-size: 16px;
    88. line-height: 1.6;
    89. white-space: nowrap;
    90. }
    91. .line-c{
    92. text-decoration: line-through;
    93. margin-left: 8px;
    94. color: #666;
    95. }
    96. .right span{
    97. display: block;
    98. }
    99. style>

  • 相关阅读:
    互联网公司员工职级、研发效能度量、OKR与绩效考核
    Rsync远程同步
    数据结构Python版(三)——栈
    【Buildroot】工具包使用
    首个828 B2B企业节:华为携手生态伙伴,赋能中小企业数字化转型
    温度信号测量K型热电偶信号采集器rs485/232远程IO转换模块
    Java的数据类型
    【Spark 实战系列】Spark 使用 BulkLoad 同步数据到 hbase 排序优化
    基于分时电价策略的家庭能量系统优化附Matlab代码
    待看12313132
  • 原文地址:https://blog.csdn.net/benlalagang/article/details/127450730