react-app-shell
Version:
react打包脚本和example, 这里的版本请忽略
151 lines (135 loc) • 5.24 kB
JavaScript
import React, {Component} from 'react';
import {observer, inject} from 'mobx-react';
import classNames from 'classnames';
import VideoPlayer from './videoPlay';
import {BARGAIN_TYPE} from '../../../constants';
import styles from './introduceTabs.less';
/**
* 产品介绍及活动规则
*/
(({bargainStore}) => {
return {
activeType: bargainStore.state.activeType,
ruleImgs: bargainStore.activeInfo.ruleImgs || [], // 规则图片
descImg: bargainStore.activeInfo.descImg || [], // 产品介绍图片
videos: bargainStore.activeInfo.videos || [], // 视频
};
})
class IntroduceTabs extends Component {
state = {
active: 'product',
fixedMenu: false, // 是否吸顶
};
componentDidMount() {
window.addEventListener('scroll', this.handleScroll);
}
componentWillUnmount() {
window.removeEventListener('scroll', this.handleScroll);
}
/**
* @description 滚动条事件
* @return {boolean}
*/
handleScroll = () => {
let ruleTop = this.refs.rule.offsetTop - window.pageYOffset;
let introduceTop = this.refs.introduce.offsetTop - window.pageYOffset;
let {fixedMenu, active} = this.state;
fixedMenu = introduceTop < 10;
if (ruleTop < 100) {
active = 'rule';
} else {
active = 'product';
}
this.setState(() => ({
fixedMenu,
active
}));
};
/**
* 选项卡点击事件
*/
handleTak = value => {
let productTop = this.refs.product.offsetTop;
const contentHeight = this.refs.introduce.offsetHeight;
let ruleTop = this.refs.rule.offsetTop;
this.setState(state => ({
fixedMenu: contentHeight > window.innerHeight ? true : state.fixedMenu,
active: value
}));
switch (value) {
case 'product': {
this.move(productTop);
break;
}
case 'rule': {
this.move(ruleTop);
break;
}
}
};
move = iTarget => {
window.scrollTo(0, iTarget);
};
render() {
let {active, fixedMenu} = this.state;
const {ruleImgs, descImg, videos, activeType} = this.props;
return (
<div className={styles['introduce-wrapper']} ref="introduce">
<div className={styles['details']}>
<div className={styles['dt-content']}>
<div className={fixedMenu ? styles['fixedMenu'] : styles['dt-title']} >
<a
className={active === 'product' ? styles['active'] : ''}
onClick={this.handleTak.bind(this, 'product')}>
{activeType === BARGAIN_TYPE.BARGAIN_ACTIVITY_TRAINING_CAMP ? '训练营介绍' : '礼包介绍'}
</a>
<a
className={active === 'rule' ? styles['active'] : ''}
onClick={this.handleTak.bind(this, 'rule')}>
活动规则
</a>
</div>
<div className={classNames({
[styles['dt-wrapper']]: fixedMenu
})}
/>
<div>
<div ref="product" className={styles['dt-product']}>
{videos.map((item, index) => {
return (
<VideoPlayer videoData={item} key={index}/>
);
})}
{descImg.map((item, index) => {
return (
<img
src={item}
alt="产品介绍"
key={index}
/>
);
})}
</div>
<div ref="rule" className={styles['dt-rule']}>
{ruleImgs.map((item, index) => {
return (
<img
src={item}
alt="规则介绍"
key={index}
/>
);
})}
</div>
<div className={styles['bargain-remark']}>
<p>*本活动最终解释权归魔力耳朵所有</p>
</div>
</div>
</div>
</div>
</div>
);
}
}
export default IntroduceTabs;