未验证 提交 f7e45815 编写于 作者: W wandali2019 提交者: GitHub

Create swiper.js

上级 4ca97b83
import {
emitter
} from '../mixins'
function getSwiper (weex) {
return {
name: 'Swiper',
mixins: [emitter],
props: {
indicatorDots: {
type: [Boolean, String],
default: false
},
vertical: {
type: [Boolean, String],
default: false
},
autoplay: {
type: [Boolean, String],
default: false
},
circular: {
type: [Boolean, String],
default: false
},
interval: {
type: [Number, String],
default: 5e3
},
duration: {
type: [Number, String],
default: 500
},
current: {
type: [Number, String],
default: 0
},
indicatorColor: {
type: String,
default: 'rgba(0,0,0,.3)'
},
indicatorActiveColor: {
type: String,
default: '#000000'
},
previousMargin: {
type: String,
default: ''
},
nextMargin: {
type: String,
default: ''
},
currentItemId: {
type: String,
default: ''
},
skipHiddenItemLayout: {
type: [Boolean, String],
default: false
},
displayMultipleItems: {
type: [Number, String],
default: 1
}
},
data () {
return {
currentSync: this.current,
currentChangeSource: 'autoplay',
touching: false,
touchendTime: 0
}
},
watch: {
current () {
this._currentCheck()
},
currentItemId () {
this._currentCheck()
},
currentSync () {
const source = this.touching && this.currentChangeSource ? 'touch' : this.currentChangeSource
if (source) {
this.$trigger('change', this._getDetail())
}
else {
this.currentChangeSource = 'autoplay'
}
}
},
methods: {
onChange (event) {
this.currentSync = event.detail.index
},
onScroll (event) {
const offsetXRatio = event.detail.offsetXRatio
if (!this.touching && Math.abs(offsetXRatio) === 0) {
const detail = this._getDetail()
if (Date.now() - this.touchendTime < this.interval - 1) {
detail.source = 'touch'
}
this.$trigger('animationfinish', detail)
}
},
onTouchmove () {
this.touching = true
},
onTouchend () {
this.touching = false
this.touchendTime = Date.now()
},
_getDetail () {
const current = this.currentSync
const currentItem = this.items[current] || {}
const currentItemId = (currentItem.componentInstance && currentItem.componentInstance.itemId) || ''
const source = this.touching && this.currentChangeSource ? 'touch' : this.currentChangeSource
return {
current,
currentItemId,
source
}
},
_currentCheck () {
let current = -1
if (this.currentItemId) {
for (let i = 0, items = this.items; i < items.length; i++) {
const componentInstance = items[i].componentInstance
if (componentInstance && componentInstance.itemId === this.currentItemId) {
current = i
break
}
}
}
if (current < 0) {
current = Math.round(this.current) || 0
}
current = current < 0 ? 0 : current
if (this.currentSync !== current) {
this.currentChangeSource = ''
this.currentSync = current
}
}
},
created () {
this.items = []
},
mounted () {
this._currentCheck()
},
render (createElement) {
const swiperItems = []
const slots = Array.isArray(this.$slots.default) ? this.$slots.default : []
slots.forEach(vnode => {
if (vnode.componentOptions && vnode.componentOptions.tag === 'swiper-item') {
swiperItems.push(vnode)
}
})
this.items = swiperItems
const event = {}
const $listeners = this.$listeners
if ($listeners.change || $listeners.animationfinish) {
event.panmove = this.onTouchmove
event.panend = this.onTouchend
}
if ($listeners.change) {
event.change = this.onChange
}
if ($listeners.animationfinish) {
event.scroll = this.onScroll
}
return createElement('div', this._g({
staticClass: ['uni-swiper']
}, $listeners), [createElement('slider', {
staticClass: ['uni-swiper-slider'],
attrs: {
autoPlay: this.autoplay,
interval: this.interval,
index: this.currentSync,
showIndicators: this.indicatorDots,
infinite: this.circular,
vertical: this.vertical
},
on: event
}, [...swiperItems, createElement('indicator', {
staticClass: ['uni-swiper-dots'],
style: {
itemColor: this.indicatorColor,
itemSelectedColor: this.indicatorActiveColor,
itemSize: 8,
// 动态创建 indicator 在安卓上有问题,改成透明度控制显示和隐藏
opacity: this.indicatorDots ? 1 : 0
}
})], 2)])
},
style: {
'uni-swiper': {
position: 'relative',
height: '150px'
},
'uni-swiper-slider': {
position: 'absolute',
left: 0,
top: 0,
right: 0,
bottom: 0
},
'uni-swiper-dots': {
position: 'absolute',
left: 0,
right: 0,
bottom: '10',
height: '10'
}
}
}
}
export default function init (Vue, weex) {
Vue.component('swiper', getSwiper(weex))
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册