#javascript #reactjs
#javascript #reactjs
Вопрос:
Я работаю над приложением, в котором есть модуль React Flipcard — но я заметил, что flipcard не будет откидываться назад в некоторых ситуациях, когда пользователь слишком быстро зависает — я попытался ввести состояние — не просто isFlipped, но и состояние переключения — чтобы избежать многократного запуска flip несколько раз, еслиэлемент все еще переворачивается — но также у меня есть тайм-аут, чтобы вернуться к frontcard, чтобы фронт вернулся.
Есть ли способ улучшить качество и обработку этой flipcard.
https://codesandbox.io/s/proud-morning-duo0k?file=/src/FlipIconCard.js
import React, { Component } from 'react';
import ReactCardFlip from 'react-card-flip';
import './FlipIconCard.scss';
class FlipIconCard extends Component {
constructor() {
super();
this.state = {
isFlipped: false
};
this.handleToggle = this.handleToggle.bind(this);
this.resetToFront = this.resetToFront.bind(this);
}
handleToggle(e) {
e.preventDefault();
this.setState(prevState => ({ isFlipped: !prevState.isFlipped }));
this.setState({ isFlippping: true });
if(this.state.isFlippping){
setTimeout(
function() {
this.setState({ isFlippping: false });
}
.bind(this), 600
);
}
if(!this.state.isFlippping){
this.resetToFront();
}
}
resetToFront() {
let timer = setTimeout(
function() {
if(this.state.isFlipped) {
this.setState({ isFlipped: false });
clearTimeout(this.state.timer);
}
}
.bind(this), 4000
);
this.setState({ timer: timer });
}
render() {
return (
<div className="flip-icon-card">
<div className="flip-icon-flipper">
<ReactCardFlip isFlipped={this.state.isFlipped} flipDirection="horizontal">
<div onMouseOver={this.handleToggle}>
<div className="flip-card-contents"><img className="icon-badge" src={require('../../../img/icons/' this.props.icon)} alt="" /></div>
</div>
<div onMouseLeave={this.handleToggle}>
<div className="flip-card-contents backcard"><div className="element">{this.props.text}</div></div>
</div>
</ReactCardFlip>
</div>
<div>{this.props.label}</div>
</div>
);
}
}
export default FlipIconCard;
Ответ №1:
Вы немного усложнили это, вы могли бы определить функцию, которая получает флаг, и установить соответствующее состояние:
setFlipped(flipped) {
this.setState({ isFlipped: flipped });
}
И в оболочке зарегистрируйте события следующим образом:
<div
className="flip-icon-flipper"
onMouseLeave={() => this.setFlipped(false)}
onMouseOver={() => this.setFlipped(true)}
>
Вот рабочий пример
Комментарии:
1. правильно — но есть позиция — когда onMouseLeave не запускается — и поэтому обратная сторона карты остается показанной навсегда
2. @TheOldCounty Это случается редко, на самом деле никогда. Если курсор пользователя все еще не находится на этой карте. Вы можете попробовать поиграть с примером , вы никогда не перевернете карточку, если курсор все еще не наведен на нее.
3. Причина, по которой в вашем подходе возникает эта проблема, заключается в том, что вы зарегистрировали события с разных сторон. Который до того, как карта полностью перевернется, не сможет вызвать
onMouseLeave
с другой стороны.4. — хорошее решение — мне также было интересно, переключается ли это предыдущее состояние.
5. Спасибо — я реализовал ваше решение