taro-material
Version:
Mini Program components that implement Google's Material Design.
138 lines (120 loc) • 3.33 kB
JavaScript
/* eslint-disable taro/function-naming */
import Taro from '@tarojs/taro'
import { View, Text, ScrollView } from '@tarojs/components'
import PropTypes from 'prop-types'
import classNames from 'classnames'
import _isFunction from 'lodash/isFunction'
import AtComponent from '../../common/component'
import { handleTouchScroll } from '../../common/utils'
export default class AtFloatLayout extends AtComponent {
constructor (props) {
super(...arguments)
const { isOpened } = props
this.state = {
_isOpened: isOpened
}
}
componentWillReceiveProps (nextProps) {
const { isOpened } = nextProps
if (this.props.isOpened !== isOpened) {
handleTouchScroll(isOpened)
}
if (isOpened !== this.state._isOpened) {
this.setState({
_isOpened: isOpened
})
}
}
handleClose = () => {
if (_isFunction(this.props.onClose)) {
this.props.onClose()
}
}
close = () => {
this.setState(
{
_isOpened: false
},
this.handleClose
)
}
handleTouchMove = e => {
e.stopPropagation()
}
render () {
const { _isOpened } = this.state
const {
title,
scrollY,
scrollX,
scrollTop,
scrollLeft,
upperThreshold,
lowerThreshold,
scrollWithAnimation
} = this.props
const rootClass = classNames(
'at-float-layout',
{
'at-float-layout--active': _isOpened
},
this.props.className
)
return (
<View className={rootClass} onTouchMove={this.handleTouchMove}>
<View onClick={this.close} className='at-float-layout__overlay' />
<View className='at-float-layout__container layout'>
{title ? (
<View className='layout-header'>
<Text className='layout-header__title'>{title}</Text>
<View className='layout-header__btn-close' onClick={this.close} />
</View>
) : null}
<View className='layout-body'>
<ScrollView
scrollY={scrollY}
scrollX={scrollX}
scrollTop={scrollTop}
scrollLeft={scrollLeft}
upperThreshold={upperThreshold}
lowerThreshold={lowerThreshold}
scrollWithAnimation={scrollWithAnimation}
onScroll={this.props.onScroll}
onScrollToLower={this.props.onScrollToLower}
onScrollToUpper={this.props.onScrollToUpper}
className='layout-body__content'
>
{this.props.children}
</ScrollView>
</View>
</View>
</View>
)
}
}
AtFloatLayout.defaultProps = {
title: '',
isOpened: false,
scrollY: true,
scrollX: false,
scrollWithAnimation: false,
onClose: () => {},
onScroll: () => {},
onScrollToLower: () => {},
onScrollToUpper: () => {}
}
AtFloatLayout.propType = {
title: PropTypes.string,
isOpened: PropTypes.bool,
scrollY: PropTypes.bool,
scrollX: PropTypes.bool,
scrollTop: PropTypes.number,
scrollLeft: PropTypes.number,
upperThreshold: PropTypes.number,
lowerThreshold: PropTypes.number,
scrollWithAnimation: PropTypes.bool,
onClose: PropTypes.func,
onScroll: PropTypes.func,
onScrollToLower: PropTypes.func,
onScrollToUpper: PropTypes.func
}