import React from "react";
import { render } from "react-dom";
import { createStore, applyMiddleware } from "redux";
import { Provider, connect } from "react-redux";
import thunk from "redux-thunk";
const disabled = (state = true, action) => {
return action.type === "TOGGLE" ? !state : state;
};
class Button extends React.Component {
componentDidUpdate(prevProps) {
if (prevProps.disabled !== this.props.disabled && !this.props.disabled) {
// this.ref.focus(); // uncomment this to see the desired effect
}
}
render() {
const { props } = this;
console.log("rendering", props.value);
return (
<div>
<input
type="checkbox"
onClick={() => {
props.toggle();
this.ref.focus(); // doesn't work
}}
/>
<input
disabled={props.disabled}
ref={ref => {
this.ref = ref;
}}
/>
</div>
);
}
}
const toggle = () => ({
type: "TOGGLE"
});
const A = connect(state => ({ disabled: state }), { toggle })(Button);
const App = () => (
<Provider store={createStore(disabled, applyMiddleware(thunk))}>
<A />
</Provider>
);
render(<App />, document.getElementById("root"));
Я хочу сфокусировать input
когда флажок установлен. Однако this.ref.focus()
необходимо вызывать только после повторного рендеринга компонента с помощью props.disabled === false
, поскольку input
с disabled
поддержкой не может быть сфокусирован.
Если я сделаю логику в componentDidUpdate
, я смогу добиться того, чего хочу. Но это не чистое решение, так как логика специфична для обработчика onClick
а не для события жизненного цикла.
Есть ли другой способ сделать это? (предпочтительно с примером рабочих кодов и ящиков)