所以在休息了一段时间后,我决定是时候再写一章“学生教学生”(由我执导并主演)。
为了更简洁地回答我自己的问题,transitionend 事件侦听器将侦听器附加到元素,并在转换结束时触发回调函数。我遇到的问题是这是异步的,因此将其放入 componentWillUpdate 将不起作用,因为 DOM 会在转换完成之前呈现。我目前的解决方法是让按钮单击调用包含事件侦听器的函数,并让 trnasitionend 的回调函数更改组件的状态。这样,在过渡完成之前不会进行渲染。
代码:
class Button2 extends React.Component {
constructor(props){
super(props)
this.onClickHandler = this.onClickHandler.bind(this)
}
onClickHandler(){
this.props.onClick("Button2")
}
render() {
return (
<button onClick={this.onClickHandler} id="button2">
BUTTON2!!
</button>
)
}
}
class Button1 extends React.Component {
constructor(props){
super(props)
this.onClickHandler = this.onClickHandler.bind(this)
}
onClickHandler(){
this.props.onClick('Button1')
}
render() {
return (
<button onClick={this.onClickHandler} id="button1">
BUTTON1!!
</button>
)
}
}
class App extends React.Component {
constructor(props){
super(props)
this.state = {
showButton : true,
hide: false
}
this.changeButtonState = this.changeButtonState.bind(this)
this.getButton = this.getButton.bind(this)
this.transitionEndEventName = this.transitionEndEventName.bind(this)
this.hideApp = this.hideApp.bind(this)
this.removeEvent = this.removeEvent.bind(this)
}
getButton() {
if (this.state.showButton){
return <Button1 onClick={this.hideApp}/>
} else {
return <Button2 onClick={this.hideApp}/>
}
}
transitionEndEventName () {
var el = document.createElement('div')//what the hack is bootstrap
var transEndEventNames = {
WebkitTransition : 'webkitTransitionEnd',
MozTransition : 'transitionend',
OTransition : 'oTransitionEnd otransitionend',
transition : 'transitionend'
}
for (var name in transEndEventNames) {
if (el.style[name] !== undefined) {
return transEndEventNames[name];
}
}
return false // explicit for ie8 ( ._.)
}
hideApp(button) {
var app = document.getElementById('main')
var transitionEnd = this.transitionEndEventName()
app.addEventListener(transitionEnd, this.removeEvent, false)
app.classList.contains('show-element') ? app.classList.remove('show-element') : null
app.classList.add('remove-element')
}
removeEvent(){
console.log('hey')
var app = document.getElementById('main')
var transitionEnd = this.transitionEndEventName()
app.removeEventListener(transitionEnd, this.removeEvent, false)
this.changeButtonState()
}
changeButtonState(button) {
this.setState({
showButton: !this.state.showButton,
hide: true
})
}
componentDidUpdate(){
var app = document.getElementById('main')
app.classList.contains('remove-element') ? app.classList.remove('remove-element') : null
app.classList.add('show-element')
}
render(){
var button = this.getButton()
return (
<div id="button-container">
{button}
</div>
)
}
}
ReactDOM.render(<App />, document.getElementById('main'))
代码笔(检查代码笔