蘑菇街购物商城

P148-P151

  • 项目创建

  1.  项目我用脚手架3创建:vue creat supermall (这个项目名字是supermall)后面配置直接选Babel
  2.  运行项目:npm run serve(因为我们观察创建好的项目的初始文件目录,没有config,说明这个使用脚手架3创建的,可以去查看package.json里的 "serve": "vue-cli-service serve",然后点击Local: 链接)
  • GitHub托管(无语,还是用码云吧)

  1. Sign in 登录
  2. 右上角 new repository
  • 划分项目目录:

  1.   src/assets 放img ,css资源
  2.  src/component 放公共组件,且分为两类,common(不同的项目可以公用的) 和 content(业务组件,当前的项目组件可以公用的)
  3. src/views 放当前项目的主要视图的组件
  4. scr/router 路由相关、src/store状态管理、src/network网络请求相关,src/common公共的JS文件(例如scr/common/const.js公共的常量需要抽取时放到里面,scr/common/utils.js存放一些公共的方法如后续用到的混入)
  • CSS文件的引进

  1. 从github上把normalize.css放进src/assets/css/normalize.css ,对css做初始化
  2. src/assets/css/base.css 这是我们自己设置的css(注意,这个文件开头要引用normalize.css,
    @import "./normalize.css",而App.vue里要引用@import "assets/css/base.css")
  3. 配置别名:在项目下建一个vue.config
  4. module.exports = {configureWebpack: {resolve: {// extension:[], 这个不用配置,官方默认配置好的,作用是.vue .js .css都不用写了alias: {// '@':src  在脚手架3里这个别名已经配好的'assets': '@/assets','common': '@/common','components': '@/components','network': '@/network',}}}
    }
    
  5. 在脚手架3里要配置.editorconfig 文件,里面是对项目的风格进行统一,以便于多人开发

P155 首页开发-请求首页的多个数据

小技巧:网络请求src/network/request.js,这里我们用src/network/home.js封装首页home的网络请求,而一般情况下我们把这个数据请求放到Home.vue 组件里,那会特别混乱,这里相当于我们多封装了一层,不再面向request.js而是面向home.js(中介),所以我们可以在home.js里更改URL即可。(经验----多去看优秀的代码)

import {request} from "./request";export function getHomeMultidata() {return request({url: '/home/multidata'})
}export function getHomeGoods(type, page) {return request({url: '/home/data',params: {type,page}})
}

P165 Better-Scorll的安装和使用

大型翻车:

//这里翻车的原因;created()是组件创建完成后调用,而当前组件创建完并没有挂载模板,所以此时还不算创建完,created()这个函数并没有起作用,此时在这里获取的任何东西都是空,拿不到.// 相当于this.scroll = new BScroll(undefined/null, {})// created() {// // console.log(document.querySelector('.wrapper'));// //   new BScroll(document.querySelector('.content'))// //   this.scroll = new BScroll('.wrapper', {})// },mounted() {// console.log(this.$refs.aaaa)// 最好用上面这种获取元素的方式// console.log(document.querySelector('.wrapper'));//wrapper只能有一个儿子,但可以有多个孙子this.scroll = new BScroll(document.querySelector('.wrapper'), {probeType: 3,pullUpLoad:true,click: true,})

分析原因:

created()是组件创建完成后调用,而当前组件创建完并没有挂载模板,所以此时还不算创建完,created()这个函数并没有起作用,此时在这里获取的任何东西都是空,拿不到。

解决办法:放到mounted()声明周期函数里,this.$nextTick(()={})

这里还要注意在Vue里最好使用vue的方法去操作Dom,例如this.$refs.aaaa


P168 首页开发-Better-Scorll的封装和使用

问题:之前有个iScorll滚动很好用,但是后期不维护了, 然后我们转而用Better-Scorll,所以这里为了防止以后Better-Scorll不维护,我们要封装然后使用,避免以后要全部重构。

解决办法:src/components/common/scorll/Scroll.vue

<template><!--  之前(子传父)有说过ref/children用在子组件中,ref如果是绑定在组件中,那么通过this.$refs.refname获取到的是一个组件对象;ref绑定在普通div元素上也行,,那么通过this.$refs.refname获取到的是一个元素对象--><div class="wrapper" ref="wrapper"><div class="content"><slot></slot></div></div>
</template><script>
import BScroll from "better-scroll"

ref如果是绑定在组件中的, 那么通过**this.$refs.refname**获取到的是一个组件对象.

ref如果是绑定在普通的元素中, 那么通过**this.$refs.refname**获取到的是一个元素对象.

修饰.native修饰什么时候使用?(Vue3.0移除了.native修饰符,不需要这个功能, 因为可以直接监听到组件对象)

* 在我们需要监听一个组件的原生事件时, 必须给对应的事件加上.native修饰符, 才能进行监听.

6.2. 如何监听组件的点击

* 直接监听back-top的点击, 但是可以直接监听?
  * 不可以, 必须添加修饰.native
* 回到顶部
  * scroll对象, scroll.scrollTo(x, y, time)
  * this.$refs.scroll.scrollTo(0, 0, 500)


P173和P174的两个Bug可以引入插件ObserveDOM和ObserveImage和Pullup,配置里都设置为true

P173 滚动区域的Bug区域分析和解决   

七. 解决首页中可滚动区域的问题

* Better-Scroll在决定有多少区域可以滚动时, 是根据scrollerHeight属性决定
  * scrollerHeight属性是根据放Better-Scroll的content中的子组件的高度
  * 但是我们的首页中, 刚开始在计算scrollerHeight属性时, 是没有将图片计算在内的
  * 所以, 计算出来的告诉是错误的(1300+)
  * 后来图片加载进来之后有了新的高度, 但是scrollerHeight属性并没有进行更新.
  * 所以滚动出现了问题
* 如何解决这个问题了?
  * 监听每一张图片是否加载完成, 只要有一张图片加载完成了, 执行一次refresh()
  * 如何监听图片加载完成了?
    * 原生的js监听图片: img.onload = function() {}
    * Vue中监听: @load='方法'
  * 调用scroll的refresh()
* 如何将GoodsListItem.vue中的事件传入到Home.vue中
  * 因为涉及到非父子组件的通信, 所以这里我们选择了**事件总线**
    * bus ->总线
    * Vue.prototype.$bus = new Vue()
    * this.$bus.$emit('事件名称', 参数)
    * this.$bus.$on('事件名称', 回调函数(参数))



P174 refresh函数找不到的Bug处理


* 问题一: refresh找不到的问题
  * 第一: 在Scroll.vue中, 调用this.scroll的方法之前, 判断this.scroll对象是否有值
  * 第二: 在mounted生命周期函数中使用 this.$refs.scroll而不是created中


P175 刷新频繁的防抖函数处理


* 问题二: 对于refresh非常频繁的问题, 进行防抖操作
  * 防抖debounce/节流throttle(课下研究一下)
  * 防抖函数起作用的过程:
    * 如果我们直接执行refresh, 那么refresh函数会被执行30次.
    * 可以将refresh函数传入到debounce函数中, 生成一个新的函数.
    * 之后在调用非常频繁的时候, 就使用新生成的函数.
    * 而新生成的函数, 并不会非常频繁的调用, 如果下一次执行来的非常快, 那么会将上一次取消掉

```js
      debounce(func, delay) {
        let timer = null
        return function (...args) {
          if (timer) clearTimeout(timer)
          timer = setTimeout(() => {
            func.apply(this, args)
          }, delay)
        }
      },
```


P178 TabControl的吸顶效果完成

九. tabControl的吸顶效果

#### 9.1. 获取到tabControl的offsetTop

* 必须知道滚动到多少时, 开始有吸顶效果, 这个时候就需要获取tabControl的offsetTop
* 但是, 如果直接在mounted中获取tabControl的offsetTop, 那么值是不正确.
* 如何获取正确的值了?
  * 监听HomeSwiper中img的加载完成.
  * 加载完成后, 发出事件, 在Home.vue中, 获取正确的值.
  * 补充:
    * 为了不让HomeSwiper多次发出事件,
    * 可以使用isLoad的变量进行状态的记录.
  * 注意: 这里不进行多次调用和debounce的区别

#### 9.2. 监听滚动, 动态的改变tabControl的样式

* 问题:动态的改变tabControl的样式时, 会出现两个问题:
  * 问题一: 下面的商品内容, 会突然上移
  * 问题二: tabControl虽然设置了fixed, 但是也随着Better-Scroll一起滚出去了.
* 其他方案来解决停留问题.
  * 在最上面, 多复制了一份PlaceHolderTabControl组件对象, 利用它来实现停留效果.
  * 当用户滚动到一定位置时, PlaceHolderTabControl显示出来.
  * 当用户滚动没有达到一定位置时, PlaceHolderTabControl隐藏起来.


P179 Home离开时记录zhu跳转到详情页并且携带iid

十. 让Home保持原来的状态

#### 10.1. 让Home不要随意销毁掉

* keep-alive

#### 10.2. 让Home中的内容保持原来的位置

* 离开时, 保存一个位置信息saveY.
* 进来时, 将位置设置为原来保存的位置saveY信息即可.
  * 注意: 最好回来时, 进行一次refresh()


P182 详情页-数据请求以及轮播图的展示

问题: 点进详情页图片,再退出, 换一个图片点进去,仍然是刚刚上一个图片,并没有改变。

<template><div id="app"><keep-alive exclude="Detail"><router-view></router-view></keep-alive><main-tab-bar></main-tab-bar></div>
</template>

分析问题:在App.vue这里用了keep-alive,为了保持Home组件的原来的状态,而这里keep-alive对所有组件都使用了, 所以这里可以单独把Detail组件排除在外; 这里还出现了一个意外Bug,引用swiper组件起了一个类名class="swiper"和封装的swiper组件的类名class="swiper"冲突(因为封装时用原生JS获取了Dom节点),所以要更改。


P186 详情页-商品详情数据展示

滚动不流畅,可以用防抖


P206 详情页-点击标题滚动到对应内容

  • 在detail中监听标题的点击,获取index
  • 滚动到对应的主题
  •                 获取所有主题的offsetTop
  •                 问题:在哪里才能获取到正确的offsetTop
  1.                         created肯定不行,压根不能获取元素
  2.                         mounted也不行,数据还没有获取到
  3.                        获取到数据的回调中也不行,Dom还没有渲染完
  4.                        $nextTick也不行,因为图片的高度没有呗计算在内
  5.                        在图片加载完成后,获取的高度才是正确的

问题1:用这个方法取位置拿不到数据

 原因1:应该是$el为空, 因为在这里我们用了一个v-if,这时候没有数据的话,div不会渲染,所以$el取到的根元素为空,offsetTop当然也为空,拿不到我们想要的位置数据

 解决1:我们把这个取位置数据的操作放在Detail.vue的请求数据里面, 且放在最后。

 问题2:这样仍然是undefined,因为此时v-if的数据成立,但是要等一会才能把div渲染出来

解决2:把这个方法放到updated(),但是updated()只要有数据变化,就会执行一次(相当把第2次的offsetTop 直接push进去),所以我们要在前面赋空一次。  

解决3:用$nextTick(),是可以保证Dom元素渲染之后取offsetTop,但是没考虑到图片尚未加载完,所以取到的位置仍然不对。

 解决4:

 methods: {imageLoad() {this.$refs.scroll.refresh()this.themeTopYs = []this.themeTopYs.push(0);this.themeTopYs.push(this.$refs.params.$el.offsetTop);this.themeTopYs.push(this.$refs.comment.$el.offsetTop);this.themeTopYs.push(this.$refs.recommend.$el.offsetTop);this.themeTopYs.push(Number.MAX_VALUE);//这里只调用一次的原因是 在DetailGoodsInfo.vue里的imageLoad()里进行过判断,所以只会在所有图片加载完之后进行一次调用;如果没有这步操作,那么为了防止频繁调用,要进行防抖操作P206节最后面有介绍防抖写法// console.log(this.themeTopYs)},

解决5:用debounce()把这个封装一下


P207-P208  滚动内容显示对应标题


P213 详情页-Vuex中代码的重构

这个重构方法值得学习,符合设计模式中的单一职责原则


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352230.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

蘑菇街服务器信息,蘑菇街开放平台

一、授权方式 为保证用户数据的安全性&#xff0c;若您的应用已完成与蘑菇街开放平台对接&#xff0c;需要获取一些与用户紧密相关的信息(如订单、商品、促销等)&#xff0c;需要征得用户的同意&#xff0c;获得用户的授权许可。蘑菇街开放平台采用国际通用的OAuth2.0标准协议&…

仿蘑菇街界面(2)

上一篇博客&#xff0c;博客地址http://blog.csdn.net/itbailei/article/details/38561297把基本的主界面框架已经搭建完毕&#xff0c;我们采用的基本框架为fragment进行页面之间的切换&#xff0c;底部菜单采用的是RadioButton。今天我们来重点来仿照一下第一个底部菜单“爱逛…

仿蘑菇街界面应用(1)

看到郭霖大神仿微信主界面的博客&#xff0c;在佩服大神文笔犀利、讲解详尽、代码风骚之余&#xff0c;也想在上班无所事事时&#xff0c;找点有意思的东西玩玩&#xff0c;蘑菇街作为中国最大女性购物社区&#xff0c;其APP的设计水平也毋庸置疑的&#xff0c;最近博客将连续来…

实现蘑菇街首页效果

打算出一个系列&#xff0c;专治现在市面上各种app的各种滑动不服系列&#xff0c;解决各种滑动冲突问题&#xff0c;现在已经发现了9种样式&#xff0c;打算一个一个一一破解&#xff0c;这是第一篇。 今天给大家带来的是高仿蘑菇街的首页&#xff0c;现在这种页面的格式很流…

设备指纹系列--基础篇

基础概念 618还没开始&#xff0c;但是又好像已经结束了…在这种电商大促的大节日前&#xff0c;电商行业客户一般会提前找到合适的设备指纹产品&#xff0c;去防止被“薅秃”。因为&#xff0c;黑灰产拥有专业的设备牧场&#xff0c;通过使用模拟器、刷机改机等手段&#xff…

仿蘑菇街个人主页

效果图&#xff1a; 看到效果图&#xff0c;第一想到的大致布局是一个scrollview嵌套一个viewpage&#xff0c;viewpage里面有一两个fragment或者写成一个fragment。但是fragment肯定包含两个布局&#xff0c;一个是含有图片(gridview)的listview&#xff0c;另一个布局是只含有…

App竞品分析报告:美丽说VS蘑菇街

1.产品概况 iOS App Store中国区iPhone免费-生活类排名&#xff08;最近3个月&#xff09; 数据来源&#xff1a;ann9.com 蘑菇街排名基本稳定在Top 10至20之间&#xff0c;美丽说在8月下旬后基本游离在Top 30外。 2015年6月活跃用户数比对-iOS端 数据说明&#xff1a;MAU为月…

社会化购物:Pinterest,Fancy还是美丽说,蘑菇街?

转自&#xff1a;网站分析在中国 原文地址&#xff1a;http://www.chinawebanalytics.cn/social-shopping-pinterest-or-fancy/ 【每期一句】越强烈的网络效应&#xff0c;越接近成功。 【前言】这篇文章是应 的邀请所做。很高兴能有机会与几年前一样&#xff0c;分析一个细分行…

仿蘑菇街项目

引言 仿蘑菇街的Vue.js项目是我学习vue.js做的第一个项目&#xff0c;今天来重温一下项目实现的功能&#xff0c;记录一下&#xff0c;方便以后查看。首先需要创建项目&#xff0c;本项目采用cli-3脚手架创建项目&#xff0c;采用默认安装模式&#xff0c;没有安装vue-router和…

高仿蘑菇街欢迎页

####蘑菇街欢迎页 ####高仿效果 这里这里…Demo下载地址 #####前言 本文将介绍如何对蘑菇街欢迎页效果进行分析&#xff0c;拆分&#xff0c;并一步步实现1个高仿版本&#xff0c;最重要的设计思路包括以下2点&#xff1a; 1.ViewPager切换时&#xff0c;通过offset偏移量动…

美丽说蘑菇街首页效果(UITableView和UIScrollerView联动)

作为一名菜鸟iOS开发程序员&#xff0c;第一次写文章&#xff0c;有点小激动&#xff01;进入正题&#xff0c;最近项目中有个需求&#xff0c;类似美丽说蘑菇街首页效果&#xff0c;在网上找了一些资料后自己研究了下终于搞定了&#xff01; 先看效果&#xff1a; 接下来详细…

【Linux】Nginx 优化与防盗链

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Nginx 优化与防盗链 一、隐藏版本号方法一&#xff1a;修改配置文件方式方法二&#xff1a;修改源码文件&#xff0c;重新编译安装 二、修改用户与组三、缓存时间四、日志切割…

操作系统的最强入门科普(Unix/Linux篇)

今天这篇文章&#xff0c;我们来聊聊操作系统&#xff08;Operating System&#xff09;。 说到操作系统&#xff0c;大家都不会陌生。我们天天都在接触操作系统——用台式机或笔记本电脑&#xff0c;使用的是windows和macOS系统&#xff1b;用手机、平板电脑&#xff0c;则是a…

PDF文件无法编辑怎么办

PDF文件无法编辑是因为设置了编辑限制&#xff0c;只要在设置密码的地方输入密码把密码取消就可以自由编辑文件了。如果不知道密码或者忘记了密码&#xff0c;只能使用第三方的解密软件把密码解除掉&#xff0c;现在有很多PDF的辅助软件&#xff0c;可以在网上搜到很多&#xf…

SpringBoot实现服务器PDF文件的下载和预览功能

&#x1f345;程序员小王的博客&#xff1a;程序员小王的博客 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 如有编辑错误联系作者&#xff0c;如果有比较好的文章欢迎分享给我&#xff0c;我会取其精华去其糟粕 &#x1f345;java自学的学习…

PDF文件不能编辑,有什么办法能够解决?

PDF文件打开之后发现不能编辑&#xff0c;很有可能是因为PDF文件设置了限制编辑。一般来说&#xff0c;想要解决问题&#xff0c;我们只需要将PDF编辑限制解除就可以了 但是大家有时候可能是不知道PDF密码的&#xff0c;那么在不知道PDF密码的情况下&#xff0c;如何解决不能编…

java利用itext编辑pdf

最近项目需要,在调研如何在pdf中增加标识字样,用来区分版本.最后确定用itext来实现 . itext的官网是:http://www.itextpdf.com/ 代码如下: Java代码 /** * authory kingviker * time : 2012-12-12 */ import java.io.FileOutputStream; import java.io.IOExcepti…

java设置pdf不可编辑_禁止编辑,但允许在Java iText / PDF中进行页面提取

我正在使用iText生成PDF文件 . 我想禁止编辑PDF&#xff0c;但允许读者提取页面 . 这是我设置加密的代码&#xff1a; writer.setEncryption(null, null, 0xffffffff, PdfWriter.STANDARD_ENCRYPTION_128); 第三个参数指定权限 . 我正在使用0xffffffff而不是单独的iText标志ALL…

HTML5 PDF 编辑,pdf.js的使用与改造

一、前期准备 1.1 需求描述 1.想让各个浏览器能显示服务器存放的PDF文件(主要是手机的浏览器) 2.想让项目结构如下:lib目录存放pdf.js等依赖文件,src存放要显示的pdf文件 想要的项目结构 3.这样我就可以将这个项目放到我网站的任何目录下,比如放到PDF或者别的文件夹下 PDF目…

如何免费编辑PDF文档?

我们都知道PDF文档不像Word文档一样可以直接编辑修改&#xff0c;想要编辑PDF文档&#xff0c;我们就需要借助专业的PDF编辑器。今天小编就给大家推荐一款可以免费编辑PDF文档的工具“金闪PDF编辑器”。 金闪PDF编辑器是一款功能齐全的强大的PDF工具&#xff0c;目前有移动端安…