实战课-仿JD商城

2020-09-28  本文已影响0人  zzyo96
1.瀑布流
image.png
核心概念
2.倒计时(仅限于整点数) 计算距离开场时间的时分秒
methods: {
        /**
         * 计算展示内容
         *  1、当前时间未到开始时间的时候 : 展示倒计时
        * 2、当前时间到了开始时间的时候:活动进行中
        * 3、当前时间超过开始时间的时候:活动已结束
         */
        computedSurplusTime: function () {
            if (this.interval) {
                clearInterval(this.interval);
            }
            // 当前时间
            const date = new Date();
            /**
             * 当前时间超过开始时间的时候:活动已结束
             */
            if (date.getHours() > this.endHours) {
                this.surplus = '活动已结束';
                return;
            }
            /**
             * 当前时间到了开始时间的时候:活动进行中
             */
            if (date.getHours() === this.endHours) {
                this.surplus = '活动进行中';
                return;
            }
            /**
             * 当前时间未到开始时间的时候 : 展示倒计时
             * 1、获取当前时间与活动开始时间的秒数差距
             * 2、根据秒数来转化为对应的 -> 时:分:秒
             */
            // 开始时间 16 , 当前时间 12。 3小时59分59秒
            const diffHours = this.endHours - date.getHours() - 1;
            // 差距分钟数
            const diffMinutes = 60 - date.getMinutes() - 1;
            // 差距秒数
            const diffSeconds = 60 - date.getSeconds();
            // 转化为对应的秒数 -> 1小时 === 3600 
            this.diffSeconds = diffHours * 3600 + diffMinutes * 60 + diffSeconds;
            // 当前时间每过1秒,秒数差距应该 - 1
            this.interval = setInterval(() => {
                this.diffSeconds -= 1;
            }, 1000);
        }
    },
    watch: {
        /**
         * 当 diffSeconds 值发生变化的时候,就会回调当前的方法
         * 根据秒数来转化为对应的 -> 时:分:秒  (3600秒 展示 1:0:0)
         */
        diffSeconds: function (newV) {
            // 当前的秒数  / 3600 ,向下取整,获取到转化的小时数
            const hours = Math.floor(newV / 3600);
            // 当前的秒数 / 60,向下取整,
            // 获取到所有的分钟数 3600 / 60 = 60分钟
            // 对60取模,超过小时数的分钟数
            const minutes = Math.floor(newV / 60) % 60;
            // 当前的秒数 % 60 , 获取到 超过小时数、分钟数的秒数(秒数)
            const seconds = newV % 60;
            // 拼装数据
            this.surplus = hours + ':' + minutes + ":" + seconds;

            /**
             * 在当前秒数 变为 0 ,需要修改展示数据
             */
            if (newV === 0) {
                this.computedSurplusTime();
            }
        },
        /**
         * 监听 活动开始时间的变化
         */
        endHours: function () {
            this.computedSurplusTime();
        }
    }
3.clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop

参考这个不错的博客↓
https://blog.csdn.net/qq_35430000/article/details/80277587

4.瀑布流实现的逻辑

1.创建一个整个数据源的样式高度 imgStyles
2.遍历数据源, 对每个数据源动态生成相对整个商品div一个相对随机高度,然后再push到imgStyles中, 展示列表的时候,将每个商品列表通过v-for循环渲染刚才生成的高度(imgStyles[index])
3.声明两个变量leftHeightTotal,rightHeightTotal, 左半部分整体距离顶部的距离, 及右半部分,声明goodsItemStyle=[ ], 用来防止所有item的样式的集合
4.比较leftHeightTotal、rightHeightTotal, 若eftHeightTotal<=rightHeightTotal 则下一个Item放置左侧,反之右侧,设置好样式后再push到goodsItemStyle中,设置好后并更新leftHeightTotal、rightHeightTotal

if (leftHeightTotal <= rightHeightTotal) {
            // item 就应该放置到左侧。此时 item 距离左侧为0,距离顶部为当前的 leftHeightTotal
            goodsItemStyle = {
              left: '0px',
              top: leftHeightTotal + 'px'
            };
            // 更新左侧距离顶部的高度
            leftHeightTotal += elHeight;
          } else {
            // item 距离右侧为 0, 距离顶部为当前的 rightHeightTotal。
            goodsItemStyle = {
              right: '0px',
              top: rightHeightTotal + 'px'
            };
            // 更新右侧距离顶部的高度
            rightHeightTotal += elHeight;
5.created/mounted

当html结构布局初始化绑定数据时, 要在created中将这个数据源赋值,而不是再mounted中,否则会报错
htm结构是这样的

<template v-slot:nav-center>
        <search :bgColor="navBarCurrentSlotStyle.search.bgColor"
                :hintColor="navBarCurrentSlotStyle.search.hintColor"
                :icon="navBarCurrentSlotStyle.search.icon">
        </search>
      </template>

vue data数据

image.png

数据赋值

image.png
6.使用懒加载

当使用懒加载的时候npm run build打包出的代码会单独生成一个相应文件的js文件, 若不用懒加载, 不会单独生成一个文件, 而是会放入其他打包好的js代码中

7.关于商品展示的逻辑

首先设置好三种样式,用css写好, 绑定在容器组件和item中,然后动态控制数据 进而实现对布局的切换

image.png

当点击排序方式按钮时的逻辑

image.png image.png
8. 深拷贝数据源不改变原数据

this.xxx = this.yyy.dataSource.slice(0) (dataSource是数组

上一篇下一篇

猜你喜欢

热点阅读