• 轮播图
    • 1. 增加路由
    • 2. 增加对应页面
    • 3. 增加轮播图
    • 4. 增加物品分类
    • 看效果
    • 总结

    轮播图

    用户登录到首页之后, 第一个看到的内容,就是轮播图。 (见前面的原型图)

    所以,我们接下来,要为首页增加它。

    1. 增加路由

    路由文件(src/router/index.js),对应位置,增加:

    1. import Index from '@/views/shops/index'
    2. Vue.use(Router)
    3. export default new Router({
    4. routes: [
    5. {
    6. path: '/',
    7. name: 'Home',
    8. component: Index
    9. }
    10. ]

    2. 增加对应页面

    src/views/shops/index.vue

    1. <template>
    2. <div class="background">
    3. <div class="home">
    4. <div class="m_layout">
    5. <!-- 轮播图-->
    6. <HomeBannerView></HomeBannerView>
    7. <!--导航-->
    8. <HomeNavView></HomeNavView>
    9. <span class="divider" style="height: 4px;"></span>
    10. <div class="product_top">
    11. <div class="product_left">
    12. <div>商品列表</div>
    13. </div>
    14. </div>
    15. <span class="divider" style="height: 2px;"></span>
    16. <!-- 特产商品 -->
    17. <SpecialMarket :id="good.id" :name="good.name" :description="good.description" :image_url="good.image_url" v-for="good in goods"></SpecialMarket>
    18. </div>
    19. </div>
    20. <NavBottomView :is_shops_index="is_shops_index"></NavBottomView>
    21. </div>
    22. </template>
    23. <script>
    24. // 轮播图需要的js文件
    25. import {bindEvent,scrollPic} from '../../libs/index.js'
    26. // 轮播图需要的前台文件
    27. import HomeBannerView from '../../components/HomeBanner.vue';
    28. // 商品分类
    29. import HomeNavView from '../../components/HomeNav.vue';
    30. // 特产,商品的列表
    31. import SpecialMarket from '../../components/SpecialMarket.vue';
    32. // 底部4个TAB, 下一节会讲到
    33. import NavBottomView from '../../components/NavBottom.vue';
    34. export default{
    35. data () {
    36. return {
    37. goods: [],
    38. is_shops_index: true,
    39. }
    40. },
    41. components:{
    42. HomeHeaderView,
    43. HomeBannerView,
    44. HomeNavView,
    45. HomeMainView,
    46. SpecialMarket,
    47. NavBottomView
    48. },
    49. mounted () {
    50. //bindEvent();
    51. scrollPic();
    52. this.loadPage ();
    53. },
    54. computed: {
    55. },
    56. methods: {
    57. loadPage () {
    58. this.$http.get(this.$configs.api + 'goods/get_goods').then((response)=>{
    59. console.info(response.body)
    60. this.goods= response.body.goods
    61. },(error) => {
    62. console.error(error)
    63. });
    64. },
    65. }
    66. }
    67. </script>

    上面的代码中,

    • 先是读取了一个API
    • 渲染数据
    • 实现首页的轮播图

    3. 增加轮播图

    我们做开发的核心方法论: 不要造轮子。

    一定要造轮子的话, 先搜索一下是否已经有了现成的轮子。

    轮播图是最最常见的组件, 所以一定会有别人写好的第三方包, 我们拿过来用就好。

    经过一番考察, 我们发现这个项目不错:

    所以, 直接拿过来用。

    3.1 轮播图的组件

    我们需要在src/views/shops/index.vue中,增加:

    1. import {bindEvent,scrollPic} from '../../libs/index.js'

    然后, 增加对应的文件(libs/index.js)

    1. function $id(id) {
    2. return document.getElementById(id);
    3. }
    4. function bindEvent() {
    5. var sea = $id("my_search");
    6. /*banner对象*/
    7. var banner = $id("my_banner");
    8. /*高度*/
    9. var height = banner.offsetHeight;
    10. window.onscroll = function() {
    11. var top = document.body.scrollTop;
    12. /*当滚动高度大于banner的高度时候颜色不变*/
    13. if (top > height) {
    14. sea.style.background = "rgba(201,21,35,0.85)";
    15. } else {
    16. var op = top / height * 0.85;
    17. sea.style.background = "rgba(201,21,35," + op + ")";
    18. }
    19. };
    20. }
    21. function scrollPic() {
    22. var imgBox = document.getElementsByClassName("banner_box")[0];
    23. var width = $id("my_banner").offsetWidth;
    24. var pointBox = document.getElementsByClassName("point_box")[0];
    25. var ols = pointBox.children;
    26. var indexx = 1;
    27. var timer = null;
    28. var moveX = 0;
    29. var endX = 0;
    30. var startX = 0;
    31. var square = 0;
    32. function addTransition() {
    33. imgBox.style.transition = "all .3s ease 0s";
    34. imgBox.style.webkitTransition = "all .3s ease 0s";
    35. }
    36. function removeTransition() {
    37. imgBox.style.transition = "none";
    38. imgBox.style.webkitTransition = "none";
    39. }
    40. function setTransfrom(t) {
    41. imgBox.style.transform = 'translateX(' + t + 'px)';
    42. imgBox.style.webkitTransform = 'translateX(' + t + 'px)';
    43. }
    44. // 开始动画部分
    45. pointBox.children[0].className = "now";
    46. for (var i = 0; i < ols.length; i++) {
    47. ols[i].index = i; // 获得当前第几个小li 的索引号
    48. ols[i].onmouseover = function() {
    49. // 所有的都要清空
    50. for (var j = 0; j < ols.length; j++) {
    51. ols[j].className = "";
    52. }
    53. this.className = "now";
    54. setTransfrom(-indexx * width);
    55. square = indexx;
    56. }
    57. }
    58. timer = setInterval(function() {
    59. indexx++;
    60. addTransition();
    61. setTransfrom(-indexx * width);
    62. // 小方块
    63. square++;
    64. if (square > ols.length - 1) {
    65. square = 0;
    66. }
    67. // 先清除所有的
    68. for (var i = 0; i < ols.length; i++)
    69. {
    70. ols[i].className = "";
    71. }
    72. // 留下当前的
    73. ols[square].className = "now";
    74. }, 3000);
    75. imgBox.addEventListener('transitionEnd', function() {
    76. if (indexx >= 9) {
    77. indexx = 1;
    78. } else if (indexx <= 0) {
    79. indexx = 8;
    80. }
    81. removeTransition();
    82. setTransfrom(-indexx * width);
    83. }, false);
    84. imgBox.addEventListener('webkitTransitionEnd', function() {
    85. if (indexx >= 9) {
    86. indexx = 1;
    87. } else if (indexx <= 0) {
    88. indexx = 8;
    89. }
    90. removeTransition();
    91. setTransfrom(-indexx * width);
    92. }, false);
    93. /**
    94. * 触摸事件开始
    95. */
    96. imgBox.addEventListener("touchstart", function(e) {
    97. console.log("开始");
    98. var event = e || window.event;
    99. //记录开始滑动的位置
    100. startX = event.touches[0].clientX;
    101. }, false);
    102. /**
    103. * 触摸滑动事件
    104. */
    105. imgBox.addEventListener("touchmove", function(e) {
    106. console.log("move");
    107. var event = e || window.event;
    108. event.preventDefault();
    109. //清除定时器
    110. clearInterval(timer);
    111. //记录结束位置
    112. endX = event.touches[0].clientX;
    113. //记录移动的位置
    114. moveX = startX - endX;
    115. removeTransition();
    116. setTransfrom(-indexx * width - moveX);
    117. }, false);
    118. /**
    119. * 触摸结束事件
    120. */
    121. imgBox.addEventListener("touchend", function() {
    122. console.log("end");
    123. //如果移动的位置大于三分之一,并且是移动过的
    124. if (Math.abs(moveX) > (1 / 3 * width) && endX != 0) {
    125. //向左
    126. if (moveX > 0) {
    127. indexx++;
    128. } else {
    129. indexx--;
    130. }
    131. //改变位置
    132. setTransfrom(-indexx * width);
    133. }
    134. //回到原来的位置
    135. addTransition();
    136. setTransfrom(-indexx * width);
    137. //初始化
    138. startX = 0;
    139. endX = 0;
    140. clearInterval(timer);
    141. timer = setInterval(function() {
    142. indexx++;
    143. square++;
    144. if (square > ols.length - 1) {
    145. square = 0;
    146. }
    147. // 先清除所有的
    148. for (var i = 0; i < ols.length; i++)
    149. {
    150. ols[i].className = "";
    151. }
    152. // 留下当前的
    153. ols[square].className = "now";
    154. addTransition();
    155. setTransfrom(-indexx * width);
    156. // 每3秒钟轮播图变化一次。
    157. }, 3000);
    158. }, false);
    159. };
    160. module.exports = {
    161. bindEvent,
    162. scrollPic
    163. }

    3.2 轮播图的视图层

    1. <!-- 轮播图-->
    2. <HomeBannerView></HomeBannerView>

    上面的代码, 会直接生成一个轮播图。

    我们创建这个component, 增加: src/components/HomeBanner.vue,

    1. <template>
    2. <div class="home_ban">
    3. <div class="m_banner clearfix" id="my_banner">
    4. <ul class="banner_box">
    5. <!-- 更改这里就可以替换轮播图的图片了 -->
    6. <li><img src="http://siweitech.b0.upaiyun.com/image/silulegou/2FgHsjCz7qfpSQr0.jpeg" alt="" /></li>
    7. <li><img src="http://siweitech.b0.upaiyun.com/image/silulegou/uJawxX6H3PBRcfMO.jpeg" alt="" /></li>
    8. </ul>
    9. <ul class="point_box" >
    10. <li></li>
    11. <li></li>
    12. </ul>
    13. </div>
    14. </div>
    15. </template>

    这个component的内容非常简单。 它只是一个轮播图组件的View. 我们只需要更换上面代码中的两个图片文件就好了。

    4. 增加物品分类

    1. <!--商品分类-->
    2. <HomeNavView></HomeNavView>

    上面的代码, 会直接生成一个物品分类区域

    我们创建这个component: 增加: src/components/HomeNav.vue

    1. <template>
    2. <div class="home_n">
    3. <nav class="m_nav">
    4. <ul>
    5. <li class="nav_item">
    6. <a href="#" class="nav_item_link">
    7. <img src="../assets/images/nav0.png" alt="">
    8. <span>草原特色肉</span>
    9. </a>
    10. </li>
    11. <li class="nav_item">
    12. <a href="#" class="nav_item_link">
    13. <img src="../assets/images/nav1.png" alt="">
    14. <span>特色干果</span>
    15. </a>
    16. </li>
    17. <li class="nav_item">
    18. <a href="#" class="nav_item_link">
    19. <img src="../assets/images/nav9.png" alt="">
    20. <span>特色瓜子</span>
    21. </a>
    22. </li>
    23. <li class="nav_item">
    24. <a href="#" class="nav_item_link">
    25. <img src="../assets/images/nav8.png" alt="">
    26. <span>特色大米</span>
    27. </a>
    28. </li>
    29. </ul>
    30. </nav>
    31. </div>
    32. </template>

    之所以这样写, 是考虑到前期的商品分类不多。 在下一个版本会改成读取后台的接口。

    看效果

    默认页面效果如下:

    图1

    三秒钟之后, 轮播图发生了滚动:

    图2

    总结

    我们使用了 现成的轮播图组件。 可以看到, 非常简单。 步骤是:

    1. 复制对应组件的js 文件到src/lib下。
    2. 复制对应组件的vue文件到src/components下
    3. 在对应的vue文件中使用它们。