美文网首页
day04-vuejs项目-商城(4)&&vue

day04-vuejs项目-商城(4)&&vue

作者: 东邪_黄药师 | 来源:发表于2019-02-22 22:58 被阅读55次
    vue-router中编程式导航:

    区分 this.route 和 this.router 这两个对象,
    其中: this.$route 是路由【参数对象】,所有路由中的参数 params,query 都属于它。

    其中: this.$router 是一个路由【导航对象】,用它 可以方便的 使用 JS 代码,实现路由的 前进、后退、 跳转到新的 URL 地址

    <div class="goods-item" v-for="item in goodslist" :key="item.id" @click="goDetail(item.id)">
          <img :src="item.img_url" alt="">
          <h1 class="title">{{ item.title }}</h1>
          <div class="info">
            <p class="price">
              <span class="now">¥{{ item.sell_price }}</span>
              <span class="old">¥{{ item.market_price }}</span>
            </p>
            <p class="sell">
              <span>热卖中</span>
              <span>剩{{ item.stock_quantity }}件</span>
            </p>
          </div>
        </div>
    

    三种方式:

    1. 最简单的
     this.$router.push("/home/goodsinfo/" + id);
    
    1. 传递对象
           this.$router.push({ path: "/home/goodsinfo/" + id });
    
     3. 传递命名的路由
    
          this.$router.push({ name: "goodsinfo", params: { id } });
    
    

    分析:为什么 商品评论中的 轮播图那么丑:

    1. 首页中的图片,它的宽和高,都是 使用了 100% 的宽度 -->
    2. 在商品详情页面中,轮播图的 图片,如果也使用 宽高 为 100%的话,页面不好看
    3. 商品详情页面中的轮播图,期望 高度是 100%, 但是 宽度为 自适应
    4. 经过分析,得到 问题的原因: 首页中的轮播图 和 详情中的轮播图,分歧点是 宽度到底是 100% 还是 自适应
    5. 既然这两个 轮播图,其它方面都是没有冲突的,只是 宽度有分歧, 那么,我们可以定义一个 属性,让 使用轮播图的 调用者,手动指定 是否为 100% 的宽度
    .mint-swipe {
      height: 200px;
    
      .mint-swipe-item {
        text-align: center;
    
        img {
          // width: 100%;
          height: 100%;
        }
      }
    }
    
    .full {
      width: 100%;
    }
    </style>
    

    小球动画优化思路:
    1. 先分析导致 动画 不准确的 本质原因: 我们把 小球 最终 位移到的 位置,已经局限在了某一分辨率下的 滚动条未滚动的情况下;
    2. 只要分辨率和 测试的时候不一样,或者 滚动条有一定的滚动距离之后, 问题就出现了;

    1. 因此,我们经过分析,得到结论: 不能把 位置的 横纵坐标 直接写死了,而是应该 根据不同情况,动态计算这个坐标值;
    2. 经过分析,得出解题思路: 先得到 徽标的 横纵 坐标,再得到 小球的 横纵坐标,然后 让 y 值 求差, x 值也求 差,得到 的结果,就是横纵坐标要位移的距离
    3. 如何 获取 徽标和小球的 位置?domObject.getBoundingClientRect()
          // 获取小球的 在页面中的位置
          const ballPosition = this.$refs.ball.getBoundingClientRect();
          // 获取 徽标 在页面中的位置
          const badgePosition = document.getElementById("badge").getBoundingClientRect();
    
          const xDist = badgePosition.left - ballPosition.left;
          const yDist = badgePosition.top - ballPosition.top;
    
          el.style.transform = `translate(${xDist}px, ${yDist}px)`;
          el.style.transition = "all 0.5s cubic-bezier(.4,-0.3,1,.68)";
          done();
    
    vuex介绍:

    官网[https://vuex.vuejs.org/zh/installation.html]
    概念:
    vuex 是 Vue 配套的 公共数据管理工具,它可以把一些共享的数据,保存到 vuex 中,方便 整个程序中的任何组件直接获取或修改我们的公共数据;

    image.png
    1.运行
    cnpm i vuex -S 
    
    1. 导入包
    import Vuex from 'vuex'
    
    1. 注册vuex到vue中
    Vue.use(Vuex)
    
    1. new Vuex.Store() 实例,得到一个 数据仓储对象:
      (如果在 组件中,想要访问,store 中的数据,只能通过 this.$store.state.*** 来访问)
    var store = new Vuex.Store({
      state: {
        // 可以把 state 想象成 组件中的 data ,专门用来存储数据的
        // 如果在 组件中,想要访问,store 中的数据,只能通过 this.$store.state.*** 来访问
        count: 0
      },
      mutations: {
        // 注意: 如果要操作 store 中的 state 值,只能通过 调用 mutations 提供的方法,才能操作对应的数据,不推荐直接操作 state 中的数据,因为 万一导致了数据的紊乱,不能快速定位到错误的原因,因为,每个组件都可能有操作数据的方法;
        increment(state) {
          state.count++
        },
        // 注意: 如果组件想要调用 mutations 中的方法,只能使用 this.$store.commit('方法名')
        // 这种 调用 mutations 方法的格式,和 this.$emit('父组件中方法名')
        subtract(state, obj) {
          // 注意: mutations 的 函数参数列表中,最多支持两个参数,其中,参数1: 是 state 状态; 参数2: 通过 commit 提交过来的参数;
          console.log(obj)
          state.count -= (obj.c + obj.d)
        }
      },
      getters: {
        // 注意:这里的 getters, 只负责 对外提供数据,不负责 修改数据,如果想要修改 state 中的数据,请 去找 mutations
        optCount: function (state) {
          return '当前最新的count值是:' + state.count
        }
        // 经过咱们回顾对比,发现 getters 中的方法, 和组件中的过滤器比较类似,因为 过滤器和 getters 都没有修改原数据, 都是把原数据做了一层包装,提供给了 调用者;
        // 其次, getters 也和 computed 比较像, 只要 state 中的数据发生变化了,那么,如果 getters 正好也引用了这个数据,那么 就会立即触发 getters 的重新求值;
      }
    })
    
    1. 将 vuex 创建的 store 挂载到 VM 实例上, 只要挂载到了 vm 上,任何组件都能使用 store 来存取数据:
    import App from './App.vue'
    
    const vm = new Vue({
      el: '#app',
      render: c => c(App),
      store /
    })
    

    总结:

    1. state中的数据,不能直接修改,如果想要修改,必须通过 mutations
    2. 如果组件想要直接 从 state 上获取数据: 需要 this.$store.state.***
    3. 如果 组件,想要修改数据,必须使用 mutations 提供的方法,需要通过 this.$store.commit('方法的名称', 唯一的一个参数)
    4. 如果 store 中 state 上的数据, 在对外提供的时候,需要做一层包装,那么 ,推荐使用 getters, 如果需要使用 getters ,则用 this.$store.getters.***

    相关文章

      网友评论

          本文标题:day04-vuejs项目-商城(4)&&vue

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