vue 在商品组件长时间停留 在回到组件报错

<template lang="html">
<div class="a">
  <div class="goods-container">
      <div class="goods-left" ref="leftScroll">
        <ul>
          <li class="goods-left-list" :class="{'active':currentIndex===idex}" v-for="(item,idex) in goods" :key='item.name' @click="tofood(idex)">
            <span class="text border-1px">
              <span class="icon" v-if="item.type>0" :class="icon[item.type]"></span>{{item.name}}
            </span>
          </li>
        </ul>
      </div>
      <div class="goods-right" ref="rightScroll">
        <ul>
          <li class="goods-right-wrapper iconclass "  v-for = "item in goods " :key="item.name"  ref="item">
            <h1 class="goods-title">{{item.name}}</h1>
            <ul>
              <li class="goods-item border-1px"
                v-for = "food in item.foods"
                :key="food.name"
                @click="getfoodinfo(food, $event)"
                >
                <img :src="food.icon" alt="" class="goods-icon">
                <div class="goods-content">
                  <h1 class="goods-name">{{food.name}}</h1>
                  <p class="goods-description">{{food.description}}</p>
                  <p class="goods-sell">月售:{{food.sellCount}}<span class="goods-sell-rating"> 好评{{food.rating}}%</span></p>
                  <p class="goods-price">
                    <span class="goods-price-one-icon">¥</span><span class="goods-price-one">{{food.price}}</span><span v-show="food.oldPrice" class="goods-price-two-icon">¥</span><span v-show="food.oldPrice" class="goods-price-two">{{food.oldPrice}}</span>
                  </p>
                </div>
                <div class="goodsControl-wrapper" >
                  <transition><goodsControl :food="food" @getdom="getdom" ></goodsControl></transition>
                </div>
              </li>
            </ul>
          </li>
        </ul>
      </div>
      <shop  :seller="seller" :goods="goods" ref="shop"></shop>
      <food :foodInfo="foodInfo" @getdom="getdom"  ref="foodInfoShowDom"></food>
  </div>
</div>
</template>

<script>
import BScroll from 'better-scroll';
import shop from '../shop/shop.vue';
import goodsControl from '../goodsControl/goodsControl.vue';
import food from '../food/food.vue';
export default {
  data() {
    return {
      goods: [],
      icon: ['decrease', 'discount', 'guarantee', 'invoice', 'special'],
      listHeight: [],
      scorllY: 0,
      foodInfo: {}
    };
  },
  created() {
    this.getGoods();
  },
  mounted() {
    this.scrollall();
    // this.getItemHeight();
    // this.$nextTick(() => {
    //   this.getItemHeight();
    setTimeout(() => {
      this.getItemHeight();
    });
    // });
  },

  updated() {
    // this.getItemHeight();
    // 尽量不要使用
    // 如果getItemHeight()使得数据变化 而之后watch 或
  },
  methods: {
    getGoods() {
      this.$http.get('/api/goods').then(result => {
        if (result.body.errno === 0) {
          this.goods = result.body.data;
        }
      });
    },
    getfoodinfo(food, event) {
      this.foodInfo = food;
      this.$refs.foodInfoShowDom.show();
    },
    // foodInfoShow() {
    //   this.$refs.foodInfoShowDom.show()
    // }
    scrollall() {
      this.leftScroll = new BScroll(this.$refs.leftScroll, {
        click: true
      });
      this.rightScroll = new BScroll(this.$refs.rightScroll, {
        click: true,
        probeType: 3
        // 探头为3 时
      });
      this.rightScroll.on('scroll', (pos) => {
        this.scorllY = Math.abs(Math.round(pos.y));
      });
      // this.rightScroll.on('scroll', (pos) => {
      // });
    },
    getItemHeight() {
      // 这里来得到每个大块的高度 0为起点  每两个就是一个区间
      let item = this.$refs.item;
      console.log(item);
      let height = 0;
      this.listHeight.push(height);
      for (var i = 0; i < item.length; i++) {
        height += item[i].clientHeight;
        // 注意这里不可以使用  height += item[i].style.height;  这个必须是你写了这个样式才可以得到
        this.listHeight.push(height);
      }
    },
    tofood(index) {
      let item = this.$refs.item;
      let el = item[index];
      this.rightScroll.scrollToElement(el, 300, 0, 0);
    },
    getdom(dom) {
      this.givedom(dom);
    },
    givedom(dom) {
      this.$nextTick(() => {
        this.$refs.shop.getdom(dom);
      });
    }
  },
  components: {
    shop,
    goodsControl,
    food
  },
  computed: {
    currentIndex() {
      for (var i = 0; i < this.listHeight.length; i++) {
        let h1 = this.listHeight[i];
        let h2 = this.listHeight[i + 1];
        if (!h2 || (this.scorllY >= h1 && this.scorllY < h2)) {
          return i;
        }
      }
      return 0;
    }
  },
  props: ['seller']

};
</script>

<style lang="stylus" scoped>
  @import "../../common/stylus/mixin.styl"
.a
  position: absolute;
  width: 100%
  top: 172px
  bottom: 0px
  .goods-container
    display: flex
    position: absolute;
    width: 100%
    top: 0px
    bottom: 46px
    overflow: hidden
    .goods-left
      overflow: hidden
      flex: 0 0 80px
      // 安卓兼容 要写width
      width: 80px
      background-color: #f3f5f7
      .goods-left-list
        display: table;
        width: 56px
        height: 54px
        padding: 0 12px
        &.active
          background-color: white
          margin-top: -1px
          border-none()
        .text
          display: table-cell
          vertical-align: middle;
          font-size:  12px
          color: black
          border-1px( rgba(7,17,27,0.1) )
          height: 14px
          .icon
            display:inline-block
            background-size:100% 100%
            background-repeat: no-repeat;
            vertical-align: top
            margin-right: 2px
            width:12px
            height:12px
            &.decrease
              bg-image(decrease_3)
            &.discount
              bg-image(discount_3)
            &.invoice
              bg-image(invoice_3)
            &.special
              bg-image(special_3)
            &.guarantee
              bg-image(guarantee_3)
    .goods-right
      overflow: hidden
      flex: 1
      .goods-right-wrapper
        .goods-title
          height: 26px
          width: 100%
          padding-left: 12px
          border-left: 2px solid #d9dde1
          background-color: #f3f5f7
          font-size: 12px
          line-height:26px
        .goods-item
          display: flex
          position: relative;
          margin: 18px
          padding-bottom: 18px
          border-1px( rgba(7,17,27,0.1) )
          &:last-child
            border-none()
          .goods-icon
            flex: 0 0 60px
            margin-right: 10px
            width: 63px
            height: 63px
          .goods-content
            flex: 1
            margin-top: 2px
            .goods-name
              margin-bottom: 8px
              font-size: 14px
              color: rgb(7,17,27)
              font-weight:700
            .goods-description
              margin-bottom: 8px
              font-size: 12px
              color: rgb(147,153,159)
              font-weight:500
            .goods-sell
              margin-bottom: 3px
              font-size: 10px
              color: rgb(147,153,159)
              font-weight:500
              .goods-sell-rating
                margin-left: 12px
            .goods-price
              font-size: 10px
              line-height: 24px
              color: rgb(147,153,159)
              .goods-price-one-icon
                vertical-align: middle;
                color: red
              .goods-price-one
                vertical-align: middle;
                font-size: 14px
                color: red
                font-weight: 700
              .goods-price-two-icon

                margin-left: 8px
                text-decoration: line-through
              .goods-price-two

                text-decoration: line-through
                font-weight: 700
          .goodsControl-wrapper
            position: absolute;
            bottom: 18px
            right: 0
</style>

图片描述
clipboard.png

clipboard.png

图片描述

图片描述

例如 在商品评论两个组件快速切换不报错 但长时间在评论组件停留 回到商品组件 就找不到

图片描述

快速切换打印是数组 停留打印就是undefined

回答:

watch: {

  goods() {
    console.log('a');
    this.$nextTick(() => {
      console.log('b');
      this.getItemHeight();
    })
  }

},
最后watch 解决问题

回答:

item的数据格式可能不是数组了,你打印一下item看看

回答:

let item = this.$refs.item;
调试 item 此时的数据类型,这里应该是一个 dom就是一个<li>...</li>

暂无评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注