Vue.js重构有赞商城(I)

1. 首页index.html

  • 迁移静态页面

index.html的头部

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <!-- DNS 预解析 -->
  <link rel="dns-prefetch" href="https://dn-kdt-img.qbox.me/">
  <link rel="dns-prefetch" href="https://img.yzcdn.cn/">
  <link rel="dns-prefetch" href="https://b.yzcdn.cn/">
  <link rel="dns-prefetch" href="https://su.yzcdn.cn/">
  <link rel="dns-prefetch" href="https://h5.youzan.com/v2/">
  <link rel="dns-prefetch" href="https://h5.youzan.com/">
  <meta name="keywords" content="有赞,移动电商服务平台">
  <meta name="description" content="有赞是帮助商家在微信上搭建微信商城的平台,提供店铺、商品、订单、物流、消息和客户的管理模块,同时还提供丰富的营销应用和活动插件。">
  <!-- 是否为手持设备优化 -->
  <meta name="HandheldFriendly" content="True">
  <!-- 为某个宽度特殊优化 -->
  <meta name="MobileOptimized" content="320">
  <!-- 电话号码和邮箱识别 -->
  <meta name="format-detection" content="telephone=no">
  <!-- 针对LCD液晶显示器设计,可提高文字的清晰度 -->
  <meta http-equiv="cleartype" content="on">
  <link rel="shortcut icon" href="https://b.yzcdn.cn/v2/image/yz_fc.ico">
  <title>发现朋友圈的推荐</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  <!--<link rel="stylesheet" href="./css/common.css">-->
  <!--<link rel="stylesheet" href="./css/index.css">-->
</head>

(1). DNS 预读取

DNS 预读取是一项使浏览器主动去执行域名解析的功能,其范围包括文档的所有链接,无论是图片的,CSS 的,还是 JavaScript 等其他用户能够点击的 URL。
因为预读取会在后台执行,所以 DNS 很可能在链接对应的东西出现之前就已经解析完毕。这能够减少用户点击链接时的延迟。

MDN-dns文档

dns.png

(2). 移动端适配
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

  • 修改webpack配置 路径简化
修改路径配置.png
  • 创建vue实例

vue实例挂载点不能是htmlbody

添加挂载点.png

  • 后台获取数据

第三方插件:axiosaxios中文文档

rap-lists.png

yarn add axios

api.png

数据渲染.png
  • 数据滚动加载

常用的UI库:
weui 微信小程序的UI库
mint-ui
YDUI vue官网推荐的移动端UI库

安装mint.png

安装mint插件.png

官网文档
mint按需引入.png

修改.babelrc文件.png

找到自己需要的组件,复制粘贴到index.js中,此项目引入Infinite scroll无限滚动指令:

引入组件.png

为 HTML 元素添加 v-infinite-scroll 指令即可使用无限滚动。滚动该元素,当其底部与被滚动元素底部的距离小于给定的阈值(通过 infinite-scroll-distance 设置)时,绑定到 v-infinite-scroll 指令的方法就会被触发。

<ul class="js-list js-lazy" data-src=""  
    v-infinite-scroll="getLists"
    infinite-scroll-disabled="loading"
    infinite-scroll-distance="10" 
>

!!!别忘记index.js中引入啊!!!

import 'css/common.css'  //webpack.base.conf.js中的alias配置了路径
import './index.css'
import Vue from 'vue'
import axios from 'axios'
import url from 'js/api.js'
import { InfiniteScroll } from 'mint-ui';
Vue.use(InfiniteScroll);
  • 底部导航组件

单vue组件 template必需(根节点只能有一个),style可以有多个

Foot.vue: 
<template>
    <div class="bottom-nav"> //根节点只能有一个
    ……
    </div>
</template>

<script>
</script>

<style>
  // src/pages/index/index.css中的.bottom-nav样式
</style>
html部分:
<foot></foot>

!!!别忘记index.js中引入啊!!!
import Foot from 'components/Foot.vue'

  • 轮播组件

第三方插件:swiper

rap-banner.png

安装swiper.png

Swipe.vue: 
<template>
    <div class="swiper-container">
        <div class="swiper-wrapper">
            <div class="swp-page swiper-slide" v-for="list in lists">
                <a class="js-no-follow" v-bind:href="list.clickUrl">
                  <img class="goods-main-photo fadeIn" v-bind:src="list.img">
                </a>
            </div>
        </div>
        <div class="swiper-pagination"></div>
    </div>
</template>
<script>
    import Swiper from 'swiper'
    import 'swiper/dist/css/swiper.css'
    export default {
        name: 'swipe',
        props: {
            lists: {
                type: Array, 
                required: true
            },
            name: {}
        },
        mounted(){
            this.init()
        },
        methods: {
            init(){
               // Swiper文档
            }
        }
    }
</script>
<style>
  // 调整图片的样式
</style>
分页.png
自动轮播.png
index.html:
<!--<div class="js-image-swiper custom-image-swiper  custom-image-swiper-single" data-images="1">--> 
  <swipe v-bind:lists="bannerLists" name="swipe.vue" v-if="bannerLists"></swipe>
<!--</div> -->   

父类传递,其中v-bind:lists="bannerLists" name="swipe.vue"是动态绑定,对应index.js中的props

index.js: 
components: {
        Foot, //ES6语法 等价于Foot: Foot
        Swipe
}

!!!别忘记index.js中引入啊!!!
import Swipe from 'components/Swipe.vue'

2. 分类页category.html

caregory.html,过程与首页类似。page目录下新建category文件夹,迁移静态文件,category.js文件中引入css样式文件、引入各种需要的插件。api.js文件中加

    topList: '/category/topList', //分类页面的一级分类
    subList: '/category/subList',  //分类页面的二级分类
    rank: '/category/rank'  //分类页面的综合排行

category.html文件中删掉li标签的内容,留一个模板渲染
:侧边栏菜单即二级菜单,事件绑定官网文档v-on:click简写成@click
:绑定class,语法:<div v-bind:class="{ active: isActive }"></div>
改:原网站bug,热词排行榜无法下拉到最底,最后一行的词条无法完全显示

category.css文件中加入:
  .main-content {
    overflow-y: scroll;
  }

  .inner-content {
    margin-bottom: 50px;
  }
一级分类.png

二级分类.png

综合排行.png

综合排行详细.png

补充:过滤器filters
官网文档

filters: {
    number: function(price){
        var priceStr= ' ' + price
        if(priceStr.indexOf('.') > -1){  //检索的字符串值没有出现,则该方法返回 -1。
          var priceArr = PriceStr.split('.')
          return priceArr[0] + '.' + (priceArr[1] + '0').substr(0,2) //11.2 >> 11.20    
       }else{
          return priceStr + '.00'
       }
    }
}
html部分:
 <div class="price">¥{{list.price|number}}</div>

3. 列表页search.html

  • 迁移静态页面:


    页面目录结构.png
  • 优化Foot.vue
    querystring模块 :qs官方文档
    yarn add qs

eg:
var obj = qs.parse('a=c');
assert.deepEqual(obj, { a: 'c' });

逻辑:

  1. 通过脚本给a标签渲染``href```属性
changeNav( list,index ){
    location.href = `${list.href}&index=${index}` 
}

2.获取该导航选项所对应的index

{index} = qs.parse( location.search.substr('1') )  //index: number
// 加{ }标签是对象的结构赋值

3.当前索引值即:通过href获取到的index值(string类型需转换为整型)
curIndex: parseInt(index) || 0 //初始值为0

  • js部分
    大致和前面的步骤类似,引入各种插件、文件,获取数据,渲染到HTML
    注:input标签上绑定value值,```:value='keyword'
    search-热门分类页.png
  • mixin(混入)(对过滤器filterFoot.vue的优化)
    参考官方文档
    个人理解:mixins就是定义一部分公共的方法或者计算属性,然后混入到各个组件中使用,方便管理与统一修改
    1.modules文件夹下的js文件夹,新建mixin.js文件
import Foot from 'components/Foot.vue'
var mixin: {
  filter: {
    currency: function(price){
      ...
    }
  },
  components: {
    Foot
  }
}
export default mixin

2.对应需要这些组件的文件中(index.jscategory.jssearch.js)等引入mixin

import mixin from 'js/mixin'

new Vue({
  mixins: [mixin]
})
  • 回到顶部的动画效果动画库velocity
    参考文档:velocity-github官方文档npm velocity-animateVelocity.js中文文档
    yarn add velocity-animate
    安装velocity.png

    Velocity(document.body, 'scroll', {duration: 1000})
    html部分的<div class="container" ...>上绑定@touchmove="move"事件,<div class="go-to-top"...>上绑定@click="toTop"事件;删掉css部分对应.go-to-topdisplay: none
遇到的问题document.body.scrollTop一直是0

解决:

  • 页面指定了DTD,即指定了DOCTYPE时,使用document.documentElement
  • 页面没有DTD,即没指定DOCTYPE时,使用document.body
注意:实现列表页触底加载功能,一定要注意需要滚动的是哪个DOM节点!!!首页是<ul class="js-list js-lazy" ...>;列表页是<div class="container with-top-search" ...>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容