直接貼效果圖及代碼
上面的父組件,下面的是子組件。
照道理講,this.ripple.init(this[`item_${i}`])會把這兩個元素分別加上點擊事件,
然后點擊的時候分別響應,但為什么無論點哪個元素,只有最后一個元素有效果?
import React from 'react'
import Ripple from '../../component/Ripple/Ripple'
export default class Ripple_demo extends React.Component {
constructor(props) {
super(props)
this.state = {}
}
componentDidMount = () => {
for(let i = 0; i < this.dataSource.length; i++){
this.ripple.init(this[`item_${i}`]);
}
}
dataSource = [
{label: 'test1'},
{label: 'test2'},
];
render() {
return (
<div className='Ripple_demo'>
{
this.dataSource.map((item, i) => {
return (
<div style={{overflow: 'hidden', position: 'relative'}}>
<div ref={ref => this[`item_${i}`] = ref} style={{background: '#F96', height: 200}}>{item.label}</div>
<Ripple ref={ref => this.ripple = ref} wrapWidth={375} />
</div>
)
})
}
</div>
)
}
}
import React from 'react'
import './css/Ripple.css'
/* 點擊波紋 */
export default class Ripple extends React.Component {
constructor(props) {
super(props);
this.state = {
display: false, // 動畫是否開始
left: 0,
top: 0,
opacity: 0,
};
}
componentDidMount = () => {}
init = element => {
// element.addEventListener('transitionend', e => {
// this.setState({display: false});
// }, false);
element.addEventListener('click', e => {
const {offsetX, offsetY} = e;
const {wrapWidth = 150} = this.props;
// 開始動畫
this.setState({
scale: wrapWidth,
left: offsetX,
top: offsetY,
opacity: 1,
display: true,
}, () => {
// 波紋淡出
this.setState({opacity: 0});
// 動畫結束后移除樣式 mark
setTimeout(() => {
this.setState({display: false});
}, 1000);
});
}, false);
}
render() {
let {wrapWidth = 150} = this.props;
let {display, scale, opacity, left, top} = this.state;
// let transition = display ? 'transform 1s cubic-bezier(0.250, 0.460, 0.450, 0.940), opacity 1s cubic-bezier(0.250, 0.460, 0.450, 0.940)' : 'opacity .7s cubic-bezier(0.250, 0.460, 0.450, 0.940)';
let style = {transform: `scale(${scale})`, opacity , left, top, width: 2, height: 2};
return (
<div className='Ripple' style={display ? style : null} />
)
}
}
好吧,自己解決了,但不知道是為什么
把render里的代碼改成下面這些就行了,就是init和遍歷放在一起而不是在componentDidMount中再遍歷一次
可能是因為對閉包的理解不夠深刻,componentDidMount遍歷元素綁定事件時始終綁定在最后一個元素上
先更著,容我仔細看看閉包再來結案
render() {
return (
<div className='Ripple_demo'>
{
this.dataSource.map((item, i) => {
return (
<div style={{overflow: 'hidden', position: 'relative'}}>
<div ref={ref => this[`item_${i}`] = ref} style={{background: '#F96', height: 200}}>{item.label}</div>
<Ripple ref={ref => ref.init(this[`item_${i}`])} wrapWidth={document.body.clientWidth} />
</div>
)
})
}
</div>
)
}北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。