React native accessing refs in a custom component
Let's start from the CustomTextInput component.
export default class CustomTextInput extends Component {
componentDidMount() {
if (this.props.onRef != null) {
this.props.onRef(this)
}
}
onSubmitEditing() {
this.props.onSubmitEditing();
}
focus() {
this.textInput.focus()
}
render() {
return (
<View>
<View style={this.state.isFocused ? styles.onFocusedStyle : styles.onBlurStyle}>
<TextInput
ref={input => this.textInput = input}
onSubmitEditing={this.onSubmitEditing.bind(this)}
/>
</View>
<Text style={styles.errorMessageField}>{this.state.errorStatus && this.props.errorMessage}</Text>
</View>
);
}}
Here i have a sample customTextInput. Important things to note here is the componentDidMount(), focus() method and ref property in the TextInput view in render method.
componentDidMount() method passes the ref of the whole CustomTextInput component to it's parent component. Through that reference we will call the focus method of CustomTextInput component from the parent component.
focus() method here focuses the textInput inside the CustomTextInput component by using the ref of TextInput component inside the CustomTextInput component.
The ref property of TextInput stores the reference of the TextInput. This reference is used by the focus() method.
Now let's see the parent component
export default class ParentComponent extends Component {
constructor(props) {
super(props);
this.focusNextField = this.focusNextField.bind(this);
this.inputs = {};
}
focusNextField(id) {
this.inputs[id].focus();
}
render() {
return (
<ScrollView
contentContainerStyle={{paddingBottom:100}}
keyboardDismissMode={'on-drag'}
scrollToTop={true}>
<View>
<View style={{marginTop: 10}}>
<CustomTextInput
onRef={(ref) => {
this.inputs['projectName'] = ref;
}}
onSubmitEditing={() => {
this.focusNextField('projectDescription');
}}
/>
</View>
<View style={{marginTop: 10}}>
<CustomTextInput
onRef={(ref) => {
this.inputs['projectDescription'] = ref;
}}
onSubmitEditing={() => {
this.focusNextField('subDivision');
}}
/>
</View>
<View style={{marginTop: 10}}>
<CustomTextInput
onRef={(ref) => {
this.inputs['subDivision'] = ref;
}}
onSubmitEditing={() => {
this.focusNextField('plan');
}}
/>
</View>
<View style={{marginTop: 10}}>
<CustomTextInput
onRef={(ref) => {
this.inputs['plan'] = ref;
}}
</View>
</View>
</ScrollView>
);
}}
Here in the parent component we store the ref of each CustomTextInput with onRef property and when the submit button from keyboard is pressed we call the focus method of the next CustomTextInput and the focus method of CustomTextInput focuses the TextInput inside the child component.
prinnny
Updated on July 09, 2022Comments
-
prinnny almost 2 years
I have a custom TextInput. When I edit the first
TextInput
and hit the "Next" in the keyboard, I want it to focus the secondTextInput
. I have searched before in Stack Overflow and it seems I can do it usingref
. However I'm not sure how to do that with customTextInput
.Here is my basic CustomTextInput code:
let CustomTextInput = React.createClass({ propTypes: { refName: React.PropTypes.string, returnKeyType: React.PropTypes.string, onSubmitEditing: React.PropTypes.func }, getDefaultProps: function(){ return { refName: "", returnKeyType: "default", onSubmitEditing: () => {} } }, render: function(){ return( <View> <TextInput ref={this.props.refName} returnKeyType={this.props.returnKeyType} onSubmitEditing={this.props.onSubmitEditing} /> </View> ) } }); module.exports = CustomTextInput
And here is my Parent class that calls it:
let MyParent = React.createClass({ render: function(){ return( <View> <CustomTextInput refName={'firstNameInput'}, returnKeyType={'next'} onSubmitEditing={(event) => { this.refs.lastNameInput.focus(); }} /> <CustomTextInput refName={'lastNameInput'} /> </View> ) } });
Right now, when I press the
Next
in the keyboard, after selecting thefirstName
, I got an exception:undefined is not an object (evaluating '_this2.refs.lastNameInput.focus')
I'm not sure what I did wrong there.. Any help is appreciated. :)