React Native 和处理 TextInput 数据的正确方法?

Posted

技术标签:

【中文标题】React Native 和处理 TextInput 数据的正确方法?【英文标题】:React Native and right way to handle TextInput data? 【发布时间】:2017-04-23 13:19:22 【问题描述】:

我正在使用 react-native-maps 制作一个应用程序,现在我正在添加一个 UI。

我遇到了这个问题,如果ValueonChangeText 上将更新的值相同,我无法更改TextInput 上的文本。我打字时它被清空了。

我通过在更改值后立即添加 this.forceUpdate() 解决了这个问题,但这会使应用程序有点滞后,并且当我输入文本时地图上的标记会闪烁。

该值有时由代码更改,但有时由用户编辑并由代码读取。处理这个问题的正确方法是什么? forceUpdate 感觉不对……

<TextInput
    keyboardType='numeric'
    style = styles.textInput
    value = this.state.tmpCustomer.phoneNumber                    
    onChangeText =(text) => this.state.tmpCustomer.phoneNumber=text; this.forceUpdate()
/>

【问题讨论】:

也许setState 会起作用?我如何setState 对象内的值 (tmpCustomer) ?我试过了,但出现错误(意外令牌):onChangeText =(text) =&gt; this.setState(tmpCustomer: phoneNumber: text ); 【参考方案1】:

我通过将onChangeText 切换为onEndEditing 并删除value 并使用setNativeProps 来更改文本来修复滞后。 https://facebook.github.io/react-native/docs/direct-manipulation.html

【讨论】:

我遇到了一个非常滞后的键盘 + onKeyPress。通过从中删除value,它在android 上改进了很多!非常感谢!【参考方案2】:

你试过了吗?

<TextInput
    keyboardType='numeric'
    style = styles.textInput
    value = this.state.tmpCustomer.phoneNumber                    
    onChangeText =(text) =>  
        const tmpCustomer = this.state;
        tmpCustomer.phoneNumber = text;
        this.setState(tmpCustomer : tmpCustomer);
    
/>

setState() 会更新组件,所以不需要forceUpdate(说实话,你应该避免这种用法)

【讨论】:

【参考方案3】:

我也遇到了 React Native 的 TextInput 的性能问题。我通过使用defaultValue 而不是value 解决了这个问题,并允许组件在使用shouldComponentUpdate() 发生焦点/模糊事件时重新渲染

请参阅下面的示例。

export default class TextField extends React.Component 
    state = 
        value: '',
        touched: false
    ;

    handleChange = (text) => 
        this.setState(
            value: text
        );
    ;

    handleFocus = () => 
        this.setState(
            touched: true
        );
    ;

    handleBlur = () => 
        this.setState(
            touched: false
        );
    ;

    shouldComponentUpdate(nextProps, nextState) 
        const currentTouched = this.state.touched;
        const nextTouched = nextState.touched;

        // Re-render when the user has focused or unfocused the text field
        return (currentTouched !== nextTouched);
    

    render() 
        const value = this.state;

        return (
            <TextInput
                // Use defaultValue to set the text field's default value upon render
                defaultValue=value
                onFocus=this.handleFocus
                onBlur=this.handleBlur
                onChangeText=this.handleChange
            />
        );
    

【讨论】:

以上是关于React Native 和处理 TextInput 数据的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

React Native 和处理 TextInput 数据的正确方法?

React Native 未处理的承诺拒绝 | React-Native,异步,

在 React-Native 移动应用程序中处理数据的最佳方法是啥?

在 react native 中添加抽屉菜单和底部标签栏的事件处理程序

在 React Native 中使用 Context 和 React Navigation 处理嵌套屏幕上的更新

处理 Async Await 以使用 Firebase 和 react native