Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React Native conditionally render part of view while input is focused

I have the following scenario.

function MyComponent() {
  return (
    <View>
      <TextInput ref={ref => (this.input = ref)} style={styles.input} />
      {this.input.isFocused() && <Text>Hello World</Text>}
    </View>
  );
}

This actually works fine, but I get the warning:

MyComponent is accessing findNodeHandle inside its render. render should be a pure function.

How do I conditionally render The text block and avoid this warning?

like image 1000
Steven Scaffidi Avatar asked Mar 10 '23 18:03

Steven Scaffidi


2 Answers

You can use component state :

class MyComponent extends React.Component {

   state = { isFocused: false }

   handleInputFocus = () => this.setState({ isFocused: true })

   handleInputBlur = () => this.setState({ isFocused: false })

   render() {
      const { isFocused } = this.state

      return (
        <View>
          <TextInput 
            onFocus={this.handleInputFocus} 
            onBlur={this.handleInputBlur} 
          />
          {isFocused && <Text>Hello World</Text>}
        </View>
      )
   }
}
like image 61
Freez Avatar answered Mar 12 '23 07:03

Freez


You cannot reference refs from the render() method. Read more about the cautions of working with refs here.

As you can see in the image below, the first time the component mounts, refs is undefined, when I change the text (Which changes the State, which re-renders the component) refs is now available.

This app updates the state on text change of the Text Input and therefore re-renders the component with the proper refs

An optimal solution would be using state. I was going to post a solution but Freez already did. However, I am still posting this so you know why you should be using state instead of refs.

like image 41
Luis Rizo Avatar answered Mar 12 '23 06:03

Luis Rizo