在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ Vue mounted 鉤子內(nèi)的函數(shù)未觸發(fā)

Vue mounted 鉤子內(nèi)的函數(shù)未觸發(fā)

  1. 使用vue 及best scroll做輪播圖,其中slider.vue 引用dom.js 的方法, recommend.vue 組件引用slider.vue 組件;slider.vue 下的mounted 內(nèi)的兩個方法未被正常使用,本應(yīng)該實(shí)現(xiàn)為slider下的div增加slider-item的class(如recommend.vue DOM結(jié)構(gòu)的 注釋部分),并可以有輪播的功能;
  2. 在slider.vue 下的mounted 內(nèi)可以alert出內(nèi)容;在mounted 內(nèi)的兩個方法中增加alert 也可以彈出內(nèi)容..
  3. 推測可能是因?yàn)閞ecommend.vue 中異步獲取的圖片在展示出來之前,mounted 內(nèi)的方法已經(jīng)被調(diào)用完了,但是不知道要如何在圖片展示后,再次調(diào)用slider.vue 下的dom 方法...

代碼如下:

recommend.vue

<template>
      <div class="slider-wrapper" v-if="recommends.length !== 0">
        <slider>
          <div v-for="item in recommends"  <!--class="slider-item"-->>
            <a :href="item.linkUrl">
              <img :src="item.picUrl" alt="">
            </a>
          </div>
        </slider>
      </div>
</template>

<script type="text/ecmascript-6">
  import Slider from 'base/slider/slider'
  import { getRecommend } from 'api/recommend'
  import { ERR_OK } from 'api/config'

  export default {
    data () {
      return {
        recommends: []
      }
    },
    created () {
      this._getRecommend()
    },
    methods: {
      _getRecommend () {
        getRecommend().then((res) => {
          if (res.code === ERR_OK) {
            console.log(res.data.slider)
            this.recommends = res.data.slider
          }
        })
      }
    },
    components: {
      Slider
    }
  }
</script>

slider.vue

<template>
  <div class="slider" ref="slider">
    <div class="slider-group" ref="sliderGroup">
      <slot>
      </slot>
    </div>
  </div>
</template>

<script type="text/ecmascript-6">
  import { addClass } from 'common/js/dom'
  import BScroll from 'better-scroll'

  export default {
    mounted () {
      this.$nextTick(() => {
        setTimeout(() => {
//          alert(11)
          this._setSlideWidth()
          this._initDots()
          this._initSlider()
        }, 10)
      })
    },
    methods: {
      _setSlideWidth () {
        this.children = this.$refs.sliderGroup.children
        let width = 0
        let sliderWidth = this.$refs.slider.clientWidth
        for (let i = 0; i < this.children.length; i++) {
          let child = this.children[i]
          addClass(child, 'slider-item')
          child.style.width = sliderWidth + 'px'
          width += sliderWidth
        }
        if (this.loop) {
          width += 2 * sliderWidth
        }
        this.$refs.sliderGroup.style.width = width + 'px'
      },
      _initSlider () {
        console.log(11)
        this.slider = new BScroll(this.$refs.slider, {
          scrollX: true,
          scrollY: false,
          momentum: false,
          snap: true,
          snapLoop: this.loop,
          snapThreshold: 0.3,
          snapSpeed: 400
        })
      }
    }
  }
</script>

dom.js

export function addClass(el, className) {
  if (hasClass(el, className)) {
    return
  }

  let newClass = el.className.split(' ')
  newClass.push(className)
  el.className = newClass.join(' ')
}
export function hasClass(el, className) {
  let reg = new RegExp('(^|\\s)' + className + '(\\s|$)')
  return reg.test(el.className)
}
回答
編輯回答
旖襯

mounted里的$nextTick是不會被觸發(fā)的,mounted是表示這個組件已經(jīng)掛載到dom上了,這個時候你注冊了一個$nextTick,那就只有等下一次dom被更新的時候才會被執(zhí)行到

2018年5月7日 09:14
編輯回答
陌離殤

我一般是這么做的:

//父組件定義一個onload值
onload:false
//父組件獲取數(shù)據(jù)
getData(){
    this.onload = false;
    _api.get(xxx).then(res=>{
    this.onload = true;
    this.data = res.data;
})
}
//把onload傳給子組件

<child :onload="onload"></child>

//子組件接收
props:['onload']

//子組件監(jiān)聽
watch:{
    onload(val){
    if(val){
    this.getChildData();
    }
}

}
2017年12月15日 12:25