I use redux-form and Material UI and had to do the following. MaterialCheckboxField
and MaterialTextField
are custom components in my project wrapping material-ui/{Checkbox,TextField}
.
I converted MaterialTextField
to a class component (as stipulated in the React docs).
You may not use the ref
attribute on function components because they don’t have instances.
import { findDOMNode } from "react-dom";
The field setting focus (within the render()
method):
<Field
component={MaterialCheckboxField}
label="Checkbox"
name="..."
onClick={event => {
if (!event.target.checked) return;
// focus() field after grace period
// oddity of Material UI, does not work without
window.setTimeout(() => this.textField.focus(), 150);
}}
/>
Material UI specific
Suggestion to allow a grace period using setTimeout()
from this SO question. Consider @Lukas' comment:
"This code may throw. What would be even better is to save setTimeout()
returned ID to component and on
componentWillUnmount()
check if the timeout is still there and clear
it if so"
The field that will receive focus (within the render()
method):
<Field
component={MaterialTextField}
label="Text field"
name="..."
ref={ref => {
const node = findDOMNode(ref);
if (node) {
// Material UI wraps input element,
// use querySelector() to obtain reference to it
// if not using MUI, querySelector() likely not needed
this.textField = node.querySelector("input");
}
}}
withRef
/>
Note
I am using Material UI 0.x
, not sure if that's why
React.CreateRef()
didn't work for me (the recommended approach
since React 16.3).