React Native - text input blinking when using stat

2020-04-16 19:19发布

I'm adding some validation to the input text of a TextInput component. The TextInput's value is handled in the state and is only updated when the value entered is valid.

my code looks like so:

class TextInputWithValidation extends Component {

  constructor(props) {
    super(props);
    this.state = { text: ''}
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange(text) {
    if(isValid) {
        this.setState({text})
    }
  }

  render() {
    return (
            <TextInput
                value={this.state.text}
                onChangeText={this.handleChange}
            />
    )
  }
}

The problem is that when entering a non valid character to the TextInput the non valid text appears for a second and the disappears - what causes an unwanted blink.

Any ideas how to solve this?

2条回答
劫难
2楼-- · 2020-04-16 19:52

Based on your comment, a work around could be to use your handleChange method to detect for a decimal point, and then simply set some sort of inputLengthState to the current location of the decimal

Then you can use the prop for text input maxLength = this.state.inputLengthState + this.state.precision, with precision being your decimal places. Ive written some basic code below

class TextInputWithValidation extends Component {

  constructor(props) {
    super(props);
    this.state = { 
       text: '',
       precision: 2,
       inputLength: 100,
    }
    this.handleChange = this.handleChange.bind(this);
  }

 handleChange(text) {
   if(isValid) {
     this.setState({text})
   }
   //somewhere here you would check text for a decimal place
   //and then set the inputLength the decimals' string index. If null,
   //set it to some limit however you would like ( i used 100 ).
 }

render() {
    return (
        <TextInput
            value={this.state.text}
            maxLength={this.state.inputLength + this.state.precision}
            onChangeText={(text) => {this.handleChange(text)}}
        />
    )
}

}

Apologies if my code is a bit off syntax wise, it has been a little while. For the algorithm to check for the decimal place, I'm sure this should be pretty straight forward. If not, say.

查看更多
唯我独甜
3楼-- · 2020-04-16 20:18

you can try to use '=>' operator

class TextInputWithValidation extends Component {

constructor(props) {
  super(props);
  this.state = { text: ''}
  this.handleChange = this.handleChange.bind(this);
}
//here
handleChange = (text) => {
  if(isValid) {
      this.setState({text})
  }
}

render() {
  return (
          <TextInput
              value={this.state.text}
              //and here
              onChangeText={() => this.handleChange}
          />
  )
}
}
查看更多
登录 后发表回答