反应原生获取 TextInput 值

新手上路,请多包涵

我遇到了一个非常简单的问题。我有带有用户名、密码和按钮的登录表单。在我的按钮处理程序中,我尝试获取 textinput 值。但总是得到未定义的值。我错过了什么吗?

 render() {
        <ExScreen
          headerColor={this.state.headerColor}
          scrollEnabled={this.state.enableScroll}
          style={styles.container} >
          <View >
            <View  >
              <View style={[styles.inputContainer]} >
                <TextInput
                  ref= "username"
                  onChangeText={(text) => this.setState({text})}
                  value={this.state.username}
                />
              </View>
 <Button style={{color: 'white', marginTop: 30, borderWidth: 1, borderColor: 'white', marginLeft: 20*vw, marginRight: 20*vw, height: 40, padding: 10}}
             onPress={this._handlePress.bind(this)}>
              Sign In
            </Button>
...
 _handlePress(event) {
    var username=this.refs.username.value;

原文由 WayneZhao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 355
1 个回答

快速且优化程度较低的方法是在 onChangeText 回调中使用箭头函数,通过传递 username 作为 onChangeText 回调中的参数。

 <TextInput
    ref= {(el) => { this.username = el; }}
    onChangeText={(username) => this.setState({username})}
    value={this.state.username}
/>

然后在您的 _handlePress 方法中

_handlePress(event) {
    let username=this.state.username;
}


但这有几个缺点!!!

  1. 在该组件的每次渲染中,都会创建一个新的箭头函数。
  2. 如果子组件是 PureComponent,它将强制重新渲染不必要的,这会导致巨大的性能问题,尤其是在处理大型列表、表或组件迭代大量时。 React Docs 中的更多内容

最佳实践是使用 handleInputChange 类的处理程序,并在构造函数中绑定 ``this`。

 ...
constructor(props) {
  super(props);
  this.handleChange= this.handleChange.bind(this);
}

...
handleChange(event = {}) {
  const name = event.target && event.target.name;
  const value = event.target && event.target.value;

  this.setState([name]: value);
}
...

render() {
  ...
  <TextInput
    name="username"
    onChangeText={this.handleChange}
    value={this.state.username}
  />
  ...
}

...


或者,如果您使用自动绑定 this 的 es6 类属性简写。但这在测试和性能方面有缺点。 在这里阅读更多

...
handleChange= (event = {}) => {
  const name = event.target && event.target.name;
  const value = event.target && event.target.value;

  this.setState([name]: value);
}
...

render() {
  ...
  <TextInput
    name="username"
    onChangeText={this.handleChange}
    value={this.state.username}
  />
  ...
}

...

原文由 ferndopolis 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏