Реакция: обходной путь для событий указателя CSS: нет в IE9
Я был бы признателен за некоторую помощь в реализации обходного пути для событий указателя: ни одного из них для моего компонента React button в IE9. Я использую эту кнопку для отправки формы. Я передаю реквизит кнопке, и, в зависимости от значения этой реквизита, кнопка будет иметь другой стиль.
Я использую componentWillReceiveProps, чтобы изменить состояние и стиль моей кнопки, когда она получает новое значение проп.
Что я пытаюсь достичь здесь: submitState - это '', тогда клики разрешены. submitState - "загрузка" или "успех", затем отключите щелчок по кнопке.
У меня проблема в том, что я пытаюсь запросить селекторы, которые не существуют, когда компонент монтируется. Что я здесь не так делаю? Как я могу заставить мой код ниже работать?
class Button extends React.Component {
constructor(props) {
super(props);
this.state = {
submitState: this.props.buttonState,
text: 'Click',
textLoad: 'Loading',
textSuccess: 'Success'
}
this.noclickLoad = this.noclickLoad.bind(this);
this.noclickSuccess = this.noclickSuccess.bind(this);
}
loading () {
this.setState({
submitState: 'loading'
});
}
success() {
this.setState({
submitState: 'success'
});
}
disabled() {
this.setState({
submitState: 'disabled'
});
}
nothing() {
this.setState({
submitState: ''
})
}
noclickLoad() {
document.querySelector('.myButtonContainer.loading .myButton').style.cursor = 'default';
document.querySelector('.myButtonContainer.loading .myButton').disabled = 'true';
}
noclickSuccess() {
document.querySelector('.myButtonContainer.success .myButton').style.cursor = 'default';
document.querySelector('.myButtonContainer.success .myButton').disabled = 'true';
}
componentWillReceiveProps(nextProps) {
if(nextProps.submitState === this.props.submitState) {
return
}
switch (nextProps.submitState) {
case 'loading':
this.loading();
break;
case 'success':
this.success();
break;
case '':
this.nothing();
break;
default:
return
}
}
componentDidMount () {
window.addEventListener('load', this.noclickLoad);
window.addEventListener('load', this.noclickSuccess);
}
render() {
return (
<div>
<div className={`myButtonContainer ${this.state.submitState}`}>
<button className="myButton">
<div className="buttonText">{this.state.text}</div>
<div className="buttonTextLoad">{this.state.textLoad}</div>
<div className="buttonTextSuccess">{this.state.textSuccess}</div>
</button>
</div>
</div>
);
}
}
И CSS
.myButtonContainer .myButton {
background-color: red;
}
.myButtonContainer .myButton .buttonTextLoad, .myButtonContainer .myButton .buttonTextSuccess {
display: none;
}
.myButtonContainer.loading .myButton {
background-color: yellow;
}
.myButtonContainer.loading .myButton .buttonTextLoad {
display: block;
}
.myButtonContainer.loading .myButton .buttonText, .myButtonContainer.loading .myButton .buttonTextSuccess {
display: none;
}
.myButtonContainer.success .myButton {
background-color: chartreuse;
}
.myButtonContainer.success .myButton .buttonTextSuccess {
display: block;
}
.myButtonContainer.success .myButton .buttonText, .myButtonContainer.success .myButton .buttonTextLoading {
display: none;
}
2 ответа
Кажется, что .loading
а также .success
Контейнер кнопки не будет сосуществовать одновременно. использование if
заявление, чтобы убедиться, что элемент селектора существует, прежде чем изменить его.
// Same to .success
let button = document.querySelector('.myButtonContainer.loading .myButton');
if (button) {
button.style.cursor = 'default';
button.disabled = 'true';
}
const [loading, setLoading] = useState(false);
<div id='inputArea' className={`input-area${loading ? ' pointerEventNone' : ''}`} aria-disabled={loading}>
//code..
</div>
<button className="myButton" onClick={()=>setLoading(!loading)}>Toggle Button for Disable</button>
CSS:
.pointerEventNone {
pointer-events: none;
}