Vue.js slot 初探

Posted by Yinode on Friday, November 24, 2017

TOC

假设你拥有父组件A,子轮播图组件B,你想在用A中使用B, 假设你使用slot对其进行模板的传递


<div class="slider-wrapper">

        <slider>

          <div v-for="item of slider">
            <a href=""><img :src="item.pic" alt=""></a>
          </div> // slot
        </slider>
</div>

//

但是轮播必然牵扯到样式的切换和初始化,这就意味着必须进行一个样式的初始化,而你又不想写在父组件的模板之中,因为那样会偏离关注点原则,让父组件调用的时候关心一些无关的东西。

所以我们需要在子组件中去做这些事情,所以我们在子组件的Mounted生命周期中去做些底层的便利操作


mounted() {
    setTimeout(() => {
      this._setSliderWidth()
      this._initSlider()
    }, 20)
  },
  methods: {
    _setSliderWidth() {
      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]
      }
    },
    _initSlider() {
    }
  }

这些我们就保证了好莱坞原则,让父组件调用的时候只传递必须的数据

这里请注意一个组件的生命周期问题,就是当子组件mounted触发的时候请确保你所有的数据都已经到位,如果是一个AJAX请求,那么很有可能你会没来得及获取数据,就触发mounted,那么自然就无法正常的渲染数据了