美文网首页
有赞商城实战项目

有赞商城实战项目

作者: sweetBoy_9126 | 来源:发表于2018-10-27 21:34 被阅读13次
    1. 对于多页面中使用同一个组件(导航组件),如何对这个组件的点击状态进行设置,这里以底部导航为例
      首先我们要对导航里的内容做数据渲染,如果没有数据那么我们就自己创造数据,然后通过v-for遍历
    <template>
        <div class="bottom-nav">
          <ul>
            <li :class="{active:current===index}" 
            v-for="(list,index) in navLists"
            @click="changeNav(list,index)"
            >
              <a>
                <i :class="list.icon"></i>
                <div>{{list.name}}</div>
              </a>
            </li>
          </ul>
        </div>
    </template>
    let navLists = [{
      "name": "有赞",
      "icon": "icon-home",
      "href": "/index.html"
    },{
      "name": "分类",
      "icon": "icon-category",
      "href": "/category.html"
    },{
      "name": "购物车",
      "icon": "icon-cart",
      "href": "/cart.html"
    },{
      "name": "我",
      "icon": "icon-user",
      "href": "/member.html"
    }]
    export default {
        name: 'Footer',
        data(){
          return {
            navLists,
            current: 0//默认第0个选中
          }
        },
        methods: {
          changeNav(list,index){
           this.current = index
          }
        }
    }
    

    上面虽然在每个页面里都可以正常显示组件里的内容了,但是因为点击要跳转到不同的页面,所以你每次current的值都会重新渲染为0,没办法点击哪个页面当前导航添加指定类。

    解决办法:将你的每个的index传入你点击跳转后的url中的查询参数中,然后通过location.search获取查询参数,这里需要将你拿到的查询参数转成一个对象比如index=1转成{index:'1'}这样方便进行数据的操作,所以我们要使用一个qs插件

    import qs from 'qs'
    //qs.parse(location.search.substring(1))就是{index:'1'}
    //这里拿到的index的值是字符串类型的
    //因为location.search拿到的查询参数包含?所以从第一个开始获取
    let {index} = qs.parse(location.search.substring(1))
    export default {
        name: 'Footer',
        data(){
          return {
            navLists,
            //index这个变量存在current就是将index转成number的值,不存在也就是刚进首页的时候current就是0
            current: Number(index) || 0
          }
        },
        methods: {
          changeNav(list,index){
            location.href=`${list.href}?index=${index}`
            //http://localhost:8080/category.html?index=1
          }
        }
    }
    

    这样每次点击就可以把你当前的index传给current了


    1. 多页面应用中多次用到的模块,可以使用mixins混合。
      接受一个混入对象的数组
      比如:我很多页面中都需要用到一个价格的过滤器和底部导航组件,这时就可以在公用的js里创建一个mixin.js将他们写在一个对象里
    //mixin.js
    import Foot from 'components/Foot.vue'
    let mixin = {
        filters: {
            priceNum(value){
                let newValue = value + '';
                if(newValue.indexOf('.') !== -1){
                    let arr = newValue.split('.')
                    return arr[0] + '.' + (arr[1]+ '0').substring(0,2)
                }else{
                    return value + '.00'
                }
            }
        },
        components: {
            Foot
        }
    }
    export default mixin
    

    然后在需要使用的地方引入,在实例里通过mixins:[你定义的名字]来使用

    //category.js
    import mixin from 'js/mixin.js'
    let app = new Vue({
        el: '#app',
        mixins: [mixin]
    }
    

    1. vue里通过触摸滑动执行的方法写在@touchmove=""里

    2. 使用mint-ui组件实现一个滚动条滚动到底部的时候加载更多数据
      1). 安装使用

      npm i mint-ui -S
      //在需要使用的地方引入
      import { InfiniteScroll } from 'mint-ui';
      
      Vue.use(InfiniteScroll);
      

      2). 在需要渲染数据的父节点上使用

      <ul
        v-infinite-scroll="getLists"
        infinite-scroll-disabled="loading"
        infinite-scroll-distance="10">
        <li v-for="item in list">{{ item }}</li>
      </ul>
      

      上面的getLists是你滚动条滚动的时候执行的加载更多数据的方法,infinite-scroll-disabled后面的loading是布尔值,是否禁用无限滚动,默认是false,可以触发无限滚动加载数据,true就是不触发,infinite-scroll-distance无限滚动距离,上面当滚动距离为10的时候再次触发getLists这个方法

      import { InfiniteScroll } from 'mint-ui';
      Vue.use(InfiniteScroll);
      let app = new Vue({
      el: '#app',
      data: {
          list: null,
          //默认为false可以使用无限滚动加载数据
          loading: false,
          //是否完全加载完成
          allLoaded: false,
      },
      created(){
          this.getLists()
      },
      methods: {
          getLists(){
              //如果所有数据都加在完了,那么就不去执行这个方法了
              if(this.allLoaded) return;
              //是否正在加载,当数据还未完成加载就禁用无限滚动 
              this.loading = true
              axios.get(url.hostlists).then((res)=>{
                  let curLists = res.data.lists;
                  //所有数据是否加载完毕
                  if(curLists.length<this.pageSize){
                      this.allLoaded = true
                  }
                  if(this.list){
                      //如果已经获取了list,就让list在已经存在的数据基础上添加新的数据
                      this.list = this.list.concat(curLists)
                  }else{
                      //初始化
                      this.list= curLists
                  }
                  //数据加载完成后继续使用无限滚动
                  this.loading = false
              })
          }
      }
      
    3. 对于点击多个按钮,如果想点击每个不同的按钮都显示不同的html片段的话,那么可以通过同一个点击事件值传入一个不同的数字来实现,比如

    <button @click="getMain(1)">购物车</button>
    <button @click="getMain(2)">立即购买</button>
    <button @click="getMain(3)">选择规格</button>
    <div v-show="1">
      点击购物车要显示的内容....
    </div>
    <div v-show="2">
      点击立即购买要显示的内容...
    </div>
    <div v-show="3">
      点击选择规格要显示的内容...
    </div>
    <script>
      var app = new Vue({
        el: '#app',
        data: {
          dis: 1
        },
        methods: {
          getMain(index){
            this.dis = index
          }
        }
      })
    <script>
    

    上面就是默认第一个也就是购物车内的内容显示,点击不同按钮,不同的内容显示


    1. 点击按钮实现数值加减
      也是同样写一个方法就可以,然后按钮里面传入每次点击要加的数量,加按钮就传入这个数量的正数,减按钮就传如负数,利用这个方法实现购物车商品数量的加减
    <buttton @click="changeNum(-1)"  :class="{disabled: count===1}">-</button>
    <input type="text" :value="count">
    <button @click="changeNum(1)">+</button>
    
    <script>
    var app = new Vue({
      el: '#app',
      data: {
        count: 1,
      },
      methods: {
        changeNum(num){
          if(num===-1 && this.count===1) return
          //如果num是-1就是加-1,num是1就是+1
          this.count += num
        }
      }
    })
    </script>
    

    相关文章

      网友评论

          本文标题:有赞商城实战项目

          本文链接:https://www.haomeiwen.com/subject/ticjtqtx.html