vuejs 幻灯片组件发开

实现一个幻灯片组件

        回顾一下在vue里面组件之间的交互,父组件向子组件传递信息,通过的是子组件的属性props;子组件想要通知父组件一些事件,是通过自定义事件来实现的。那么想一下,幻灯件作为子组件,需要怎样的属性和事件呢?在事件上,可以设置一个onchange事件,每一次幻灯片切换了,都会通知父组件,这个事件可以带一个参数,可能是当前在哪个页面;父组件需要告诉子组件我们要展示的图片数组以及一些相应信息的数组

1.新建一个slideShow.vue

<template>
    <div>
        hello world{{x}}
    </div>
</template>
<script>
export default {
    data () {
        return {
            x:1
        }
    }
}
</script>
<style scoped></style>


2.在index.vue根组件中引用

<script>
/*引入幻灯片组件*/
import slideShow from '../components/slideShow'
export default {
   components: {
      slideShow
   },
   data () {
    return {
        slides: [
            {
              src: require('../assets/slideShow/pic1.jpg'),//在Js里面,用require将图片引入进来
              title: 'xxx1',
              href: 'detail/analysis'
            },
            {
              src: require('../assets/slideShow/pic2.jpg'),
              title: 'xxx2',
              href: 'detail/count'
            },
            {
              src: require('../assets/slideShow/pic3.jpg'),
              title: 'xxx3',
              href: 'http://xxx.xxx.com'
            },
            {
              src: require('../assets/slideShow/pic4.jpg'),
              title: 'xxx4',
              href: 'detail/forecast'
            }
         ],
	 ...
    }
  },
	...
}
</script>
<template>
   <slide-show :slides="slides"></slide-show> //接受一个slides属性,这里传什么内容,幻灯片就展示什么内容
</template>

补充:什么情况下我们需要使用require,就是图片通过js引入到项目里包括模板里(就是放到<script>部位)


3.子组件接收父组件的传值

<script>
export default {
    props: {
        slides: {  /*设置默认值*/
            type: Array,
            default: []
        }
    },
    data () {
        return {
            x:1
        }
    },
    mounted() {
        console.log(this.slides)
    }
}
</script>

props的意思是当前这个组件接收一些什么属性,这里接收的是slides这个属性

可以在控制台打印出接收到的数据



接下来就是根据这样的一个数据,展现到幻灯片位置


4.附上后续相关代码

//slideShow.vue
<template>
    <div class="slide-show" @mouseover="clearInv" @mouseout="runInv">
        <div class="slide-img">
            <a :href="slides[nowIndex].href">
                <img :src="slides[nowIndex].src">
            </a>
        </div>
        <h2>{{slides[nowIndex].title}}</h2>
        <ul class="slide-pages">
            <li @click="goto(prevIndex)">&lt;</li>
            <li v-for="(item, index) in slides" @click="goto(index)">
                <a :class="{on : index === nowIndex}">{{index+1}}</a>
            </li>
            <li @click="goto(nextIndex)">&gt;</li>
        </ul>
    </div>
</template>

<script>
export default {
    props: {
        slides: {  /*设置默认值*/
            type: Array,
            default: []
        },
      inv: {
        type: Number,
        default: 1000
      }
    },
    data () {
        return {
            nowIndex: 0
        }
    },
    computed : {
      prevIndex (){
        if(this.nowIndex === 0 ){
          return this.slides.length - 1;
        }else {
          return this.nowIndex - 1;
        }
      },
      nextIndex(){
        if(this.nowIndex === this.slides.length - 1 ){
          return 0;
        }else {
          return this.nowIndex + 1;
        }
      }
    },
    methods: {
      goto (index) {
        this.nowIndex = index;
      },
      runInv () {
        this.invId = setInterval( () => {
            this.goto(this.nextIndex)
          },this.inv)
      },
      clearInv (){
          clearInterval(this.invId)
      }
    },
    mounted() {
        console.log(this.slides)
        this.runInv();
    }
}
</script>
//index.vue
<slide-show :slides="slides" :inv="slideSpeed"></slide-show>

效果如下:



5.可以加入一些动画效果...


6.设置一个onchange事件,每一次幻灯片切换了,都会通知父组件

methods: {
  goto (index) {
    this.isShow = false;
    setTimeout( () => {
        this.isShow = false;
        this.nowIndex = index;
        this.$emit('onchange', index);
    },10)

  },
<slide-show :slides="slides" :inv="slideSpeed" @οnchange="doSomethingsOnSlideChange"></slide-show>
methods: {
  doSomethingsOnSlideChange () {
    console.log("doSomethingsOnSlideChange run");
  }
},



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值