support Carousel

support Carousel @rijn you can review when you are free
This commit is contained in:
梁灏 2017-03-02 15:36:39 +08:00
parent a190ce84be
commit bb71140e7b
8 changed files with 57 additions and 203 deletions

View file

@ -20,3 +20,5 @@ class 改为了 className
父级不能 computed Upload 的 fileList 了
### Collapse
废弃 activeKey使用 v-modelkey 是保留的,更名为 name
### Carousel
废弃 activeIndex使用 v-modelv-for="n in slides.length",Vue2的数字循环是从1开始的

View file

@ -42,12 +42,12 @@
- [ ] Modal
- [x] Progress
- [x] Badge
- [ ] Collapse
- [x] Collapse
- [x] Timeline
- [x] Tag
- [ ] Tooltip
- [ ] Poptip
- [ ] Carousel
- [x] Carousel
- [ ] Tree
- [ ] Menu
- [ ] Tabs

View file

@ -1,12 +1,12 @@
<template>
<div :class="prefixCls" v-bind:style="styles"><slot></slot></div>
<div :class="prefixCls" :style="styles"><slot></slot></div>
</template>
<script>
const prefixCls = 'ivu-carousel-item';
export default {
componentName: 'carousel-item',
name: 'CarouselItem',
data () {
return {
prefixCls: prefixCls,
@ -24,10 +24,12 @@
};
}
},
compiled () {
mounted () {
// todo while
this.$parent.slotChange();
},
beforeDestroy () {
// todo while
this.$parent.slotChange();
}
};

View file

@ -4,7 +4,7 @@
<Icon type="chevron-left"></Icon>
</button>
<div :class="[prefixCls + '-list']">
<div :class="[prefixCls + '-track']" :style="trackStyles" v-el:slides>
<div :class="[prefixCls + '-track']" :style="trackStyles">
<slot></slot>
</div>
</div>
@ -13,9 +13,9 @@
</button>
<ul :class="dotsClasses">
<template v-for="n in slides.length">
<li :class="[n === currentIndex ? prefixCls + '-active' : '']"
@click="dotsEvent('click', n)"
@mouseover="dotsEvent('hover', n)">
<li :class="[n - 1 === currentIndex ? prefixCls + '-active' : '']"
@click="dotsEvent('click', n - 1)"
@mouseover="dotsEvent('hover', n - 1)">
<button></button>
</li>
</template>
@ -65,7 +65,7 @@
return oneOf(value, ['click', 'hover']);
}
},
currentIndex: {
value: {
type: Number,
default: 0
},
@ -86,7 +86,8 @@
slides: [],
slideInstances: [],
timer: null,
ready: false
ready: false,
currentIndex: this.value
};
},
computed: {
@ -140,7 +141,7 @@
});
}
},
updateSlides (init ) {
updateSlides (init) {
let slides = [];
let index = 1;
@ -189,6 +190,7 @@
while (index < 0) index += this.slides.length;
index = index % this.slides.length;
this.currentIndex = index;
this.$emit('input', index);
},
arrowEvent (offset) {
this.setAutoplay();
@ -197,6 +199,7 @@
dotsEvent (event, n) {
if (event === this.trigger && this.currentIndex !== n) {
this.currentIndex = n;
this.$emit('input', n);
// Reset autoplay timer when trigger be activated
this.setAutoplay();
}
@ -215,9 +218,6 @@
});
}
},
compiled () {
this.updateSlides(true);
},
watch: {
autoplay () {
this.setAutoplay();
@ -231,9 +231,13 @@
},
height () {
this.updatePos();
},
value (val) {
this.currentIndex = val;
}
},
ready () {
mounted () {
this.updateSlides(true);
this.handleResize();
this.setAutoplay();
window.addEventListener('resize', this.handleResize, false);

View file

@ -8,7 +8,7 @@ import Badge from './components/badge';
// import Breadcrumb from './components/breadcrumb';
import Button from './components/button';
// import Card from './components/card';
// import Carousel from './components/carousel';
import Carousel from './components/carousel';
// import Cascader from './components/cascader';
import Checkbox from './components/checkbox';
// import Circle from './components/circle';
@ -57,8 +57,8 @@ const iview = {
Button,
ButtonGroup: Button.Group,
// Card,
// Carousel,
// CarouselItem: Carousel.Item,
Carousel,
CarouselItem: Carousel.Item,
// Cascader,
Checkbox,
CheckboxGroup: Checkbox.Group,

View file

@ -29,6 +29,7 @@ li + li { border-left: solid 1px #bbb; padding-left: 10px; margin-left: 10px; }
<li><router-link to="/progress">Progress</router-link></li>
<li><router-link to="/upload">Upload</router-link></li>
<li><router-link to="/collapse">Collapse</router-link></li>
<li><router-link to="/carousel">Carousel</router-link></li>
</ul>
</nav>
<router-view></router-view>

View file

@ -80,6 +80,10 @@ const router = new VueRouter({
{
path: '/collapse',
component: require('./routers/collapse.vue')
},
{
path: '/carousel',
component: require('./routers/carousel.vue')
}
]
});

View file

@ -1,197 +1,28 @@
<template>
<Row>
<i-col span="2">
Current Index
<p>{{ currentIndex }}</p>
</i-col>
<i-col span="2">
<p>Autoplay</p>
<Switch :checked.sync="autoplay" size="small"></Switch>
</i-col>
<i-col span="4">
Speed <Slider :value.sync="autoplaySpeed" :min="300" :max="5000"></Slider>
</i-col>
<i-col span="4">
Switch To
<Button-group>
<i-button @click="currentIndex = 0">0</i-button>
<i-button @click="currentIndex = 1">1</i-button>
<i-button @click="currentIndex = 2">2</i-button>
</Button-group>
</i-col>
<i-col span="4">
<i-button @click="push">Push</i-button>
<i-button @click="remove = true">Remove Front</i-button>
</i-col>
</Row>
<Row>
<i-col span="4">
<p>Dots</p>
<Button-group>
<i-button @click="dots = 'inside'">Inside</i-button>
<i-button @click="dots = 'outside'">Outside</i-button>
<i-button @click="dots = 'none'">None</i-button>
</Button-group>
</i-col>
<i-col span="4">
<p>Trigger</p>
<Button-group>
<i-button @click="trigger = 'click'">Click</i-button>
<i-button @click="trigger = 'hover'">Hover</i-button>
</Button-group>
</i-col>
<i-col span="4">
Arrow
<Button-group>
<i-button @click="arrow = 'hover'">Hover</i-button>
<i-button @click="arrow = 'always'">Always</i-button>
<i-button @click="arrow = 'never'">Never</i-button>
</Button-group>
</i-col>
<i-col span="4">
Height
<i-button @click="height = 'auto'">Auto</i-button>
<i-button @click="height = 80">Manual</i-button>
<Slider v-if="height !== 'auto'" :value.sync="height" :min="50" :max="200"></Slider>
</i-col>
</Row>
<Carousel style="width: 50%; border: solid 1px #000; margin-top: 20px;"
:current-index.sync="currentIndex"
:autoplay="autoplay"
:autoplay-speed="autoplaySpeed"
:dots="dots"
:trigger="trigger"
:arrow="arrow"
:height="height"
@on-change="slideChange"
easing="linear">
<Carousel-item v-if="!remove">
<Alert type="warning" show-icon>
警告提示文案
<template slot="desc">
警告的提示描述文案警告的提示描述文案警告的提示描述文案
</template>
</Alert>
<div>
<Carousel v-model="v1" dots="inside" trigger="hover">
<Carousel-item>
<div class="demo-carousel">1</div>
</Carousel-item>
<Carousel-item>
<div style="height: 150px; background: #f50; position: relative">
<p style="position: absolute; width: 100%; color: #fff; top: 50%; height: 20px; line-height: 20px; margin-top: -10px; text-align: center">test font 定高测试</p>
</div>
<div class="demo-carousel">2</div>
</Carousel-item>
<Carousel-item>
<div style="height: 100%; min-height: 20px; background: #f50; position: relative;">
<p style="position: absolute; width: 100%; color: #fff; top: 50%; height: 20px; line-height: 20px; margin-top: -10px; text-align: center">test font 居中测试</p>
</div>
<div class="demo-carousel">3</div>
</Carousel-item>
<Carousel-item>
<Card style="width:350px">
<p slot="title">
<Icon type="ios-film-outline"></Icon>
经典电影
</p>
<a href="#" slot="extra">
<Icon type="ios-loop-strong"></Icon>
换一换
</a>
<ul>
</ul>
</Card>
</Carousel-item>
<Carousel-item style="text-align: center">
<Icon type="checkmark" style="font-size: 5em"></Icon>
</Carousel-item>
<Carousel-item>test3</Carousel-item>
<Carousel-item v-for="item in pushItem" track-by="$index">
<Icon type="checkmark" style="font-size: 5em"></Icon>{{item}}
<div class="demo-carousel">4</div>
</Carousel-item>
</Carousel>
<div style="max-height: 200px; overflow: scroll">
<p v-for="item in log" track-by="$index">{{item}}</p>
{{ v1 }}
<div @click="v1 = 0">change v1</div>
</div>
<Card style="width:350px">
<p slot="title">
<Icon type="ios-film-outline"></Icon>
经典电影
</p>
<Carousel>
<Carousel-item v-if="!remove">
<Alert type="warning" show-icon>
警告提示文案
<template slot="desc">
警告的提示描述文案警告的提示描述文案警告的提示描述文案
</template>
</Alert>
</Carousel-item>
<Carousel-item>
<div style="height: 100%; min-height: 20px; background: #f50; position: relative;">
<p style="position: absolute; width: 100%; color: #fff; top: 50%; height: 20px; line-height: 20px; margin-top: -10px; text-align: center">test font 定高测试</p>
</div>
</Carousel-item>
<Carousel-item style="text-align: center">
<Icon type="checkmark" style="font-size: 5em"></Icon>
</Carousel-item>
</Carousel>
</Card>
<Tabs>
<Tab-pane label="标签一">
<Carousel>
<Carousel-item v-if="!remove">
<Alert type="warning" show-icon>
警告提示文案
<template slot="desc">
警告的提示描述文案警告的提示描述文案警告的提示描述文案
</template>
</Alert>
</Carousel-item>
<Carousel-item>
<div style="height: 100%; min-height: 20px; background: #f50; position: relative;">
<p style="position: absolute; width: 100%; color: #fff; top: 50%; height: 20px; line-height: 20px; margin-top: -10px; text-align: center">test font 定高测试</p>
</div>
</Carousel-item>
<Carousel-item style="text-align: center">
<Icon type="checkmark" style="font-size: 5em"></Icon>
</Carousel-item>
</Carousel>
</Tab-pane>
<Tab-pane label="标签二" disabled>标签二的内容</Tab-pane>
<Tab-pane label="标签三">
<Carousel>
<Carousel-item v-if="!remove">
<Alert type="warning" show-icon>
警告提示文案
<template slot="desc">
警告的提示描述文案警告的提示描述文案警告的提示描述文案
</template>
</Alert>
</Carousel-item>
<Carousel-item>
<div style="height: 100%; min-height: 20px; background: #f50; position: relative;">
<p style="position: absolute; width: 100%; color: #fff; top: 50%; height: 20px; line-height: 20px; margin-top: -10px; text-align: center">test font 定高测试</p>
</div>
</Carousel-item>
<Carousel-item style="text-align: center">
<Icon type="checkmark" style="font-size: 5em"></Icon>
</Carousel-item>
</Carousel>
</Tab-pane>
</Tabs>
</template>
<script>
export default {
data () {
return {
currentIndex: 0,
autoplay: true,
autoplaySpeed: 2000,
remove: false,
pushItem: [],
arrow: 'hover',
trigger: 'click',
dots: 'inside',
height: 'auto',
log: []
v1: 1
}
},
methods: {
@ -204,3 +35,13 @@
}
}
</script>
<style>
.demo-carousel{
height: 200px;
line-height: 200px;
text-align: center;
color: #fff;
font-size: 20px;
background: #506b9e;
}
</style>