Правильное использование onChangeText в React Native

Я новичок в React Native, и у меня проблема с использованием onChangeText. Я пытаюсь использовать TextInput для ввода слова и обновления состояния. Когда я использую onChangeText, я могу вводить только 1 символ за раз, пока он не отобразится повторно. Я могу сохранить ценность, используя value = {this.state.text}, но поле ввода все равно теряет фокус каждый раз, когда я пишу письмо.

Я также безуспешно пытался использовать onBlur и onSubmitEditing.

Это мой текущий код. Что находится внутри render ().

 <View style = {{padding: 10}}>
   <TextInput
    onChangeText = {(text) => { this.setState({text: text})} }
    />
    <TouchableHighlight style = {styles.button} onPress = {this.handlePress.bind(this)}>
         <Text style = {styles.buttonText}>Login</Text>
       </TouchableHighlight>
            <Text style = {{padding: 10, fontSize: 42}}>
      {this.state.text}
    </Text>
  </View>

Таким образом, используя этот метод, я могу писать только одну букву за раз, поскольку this.state.text будет состоять только из одной буквы за раз.

Любая помощь приветствуется.

Пример

Решено

Я использовал response-native-tab-view, который использует собственный маршрутизатор. Я написал свой код как это Как видите, рендеринг происходит вне return (). Вот что вызвало мою проблему. Я удалил response-native-tab-view и переписал его как это

Я не хочу быть приверженцем, но вы не должны так связывать, это технически нормально, но это вызовет проблемы с производительностью в более крупных приложениях. Вместо этого привяжите конструктор или объявите методы, которые необходимо привязать как method = (args) =>, чтобы не связывать все вместе

Robbie Milejczak 26.10.2018 15:30

Я переделал это в закуску: snake.expo.io/Hk-3w9x3m, и он работает нормально, нет проблем с размытием ввода текста, поэтому проблема определенно в другом месте вашего кода

Robbie Milejczak 26.10.2018 15:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
5
2
10 064
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

<TextInput style = {styles.input}
     placeholder='username'
     onChangeText = {(text) => { this.setState({ username: text})}}>
</TextInput>

Вам нужен {}, чтобы открывать и закрывать функциональный блок, иначе он вернет setState

() => callFn эквивалентен () => {return callFn}, поэтому вы возвращаете свой вызов setState. Вам нужен здесь () => {callFn}

И удалите {this.state.text} из тега <Text>, который будет запускать повторную визуализацию каждый раз, когда вы меняете state.

Спасибо за ответ. Это была просто опечатка с моей стороны. Я редактировал код. Возникает такая же проблема

Gjermund Wiggen 26.10.2018 15:07

Хм, ладно, можешь ли ты посмотреть на пример изображения и, может быть, узнать, что может быть не так?

Gjermund Wiggen 26.10.2018 15:13

Можно попробовать извлечь TouchableHighlight для теста?

oma 26.10.2018 15:14

Но у меня ваша проблема ... это потому, что ваш <Text style = {{padding: 10, fontSize: 42}}> {this.state.text} </Text> это использование вашего состояния является проблемой, удалите это и будет работать

oma 26.10.2018 15:16

Вы используете this.state.text в своей DOM, поэтому новый DOM не будет равен старому (виртуальному) DOM, поэтому будет выполнен повторный рендеринг.

oma 26.10.2018 15:17

Я попытался удалить это, просто попробовал еще раз. Возникает та же проблема. Мой код теперь выглядит как <View> <TextInput onChangeText = {(text) => {this.setState ({text: text})}} /> </View>, и проблема все еще возникает

Gjermund Wiggen 26.10.2018 15:20

Возможно, вы используете где-то еще this.state.someVariable в DOM ..

oma 26.10.2018 15:21
Ответ принят как подходящий

Попытайтесь с этим полным компонентом надеяться, что это будет полезно для вас.

'use strict';

import React, { Component } from "react";
import { Text, View, TextInput } from 'react-native';

class Home extends Component {

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

    render() {
        let {text}=this.state;

        return ( 
            <View style = {{padding: 10}}>
                <TextInput onChangeText = {(text) => { this.setState({ text: text})}}/>
                    <Text style = {{padding: 10, fontSize: 42}}>
                    {text}
                    </Text>
            </View>
        )
     }
  }

  export default Home;

Этот работает. Проблема, вероятно, в том, что мой <View> находится за пределами return ()?

Gjermund Wiggen 26.10.2018 15:27

Чего ждать? как внешний возврат?

oma 26.10.2018 15:28

Я использую response-native-tab-view, думаю, вот как

Gjermund Wiggen 26.10.2018 15:32

Хм, не совсем понимаю, но в любом случае не используйте {this.state.variable}, всегда будет запускать повторный рендеринг. Это была ваша проблема здесь.

oma 26.10.2018 15:34

@oma {this.state.variable} это не проблема, если обновить состояние ur или props, поэтому повторно визуализируйте компонент ur.

Asif vora 26.10.2018 15:37

Создавать функции внутри свойств компонентов - не лучшая практика. Это всегда будет вызывать повторную визуализацию, даже если ничего не было изменено из-за того, что значение prop является новой функцией. Попробуйте вот так. Я также дал вам способ иметь несколько текстовых входов без создания единой встроенной функции с помощью «каррирования», наряду с превращением их в управляемые входы, при этом их значение «контролируется» состоянием. Социализм в действии!

'use strict';

import React, { Component } from "react";
import { Text, View, TextInput, StyleSheet } from 'react-native';

class Home extends Component {

  constructor(props) {
    super(props);
    this.state = {
      name:''
      email:''
      nameError:''
      emailError:''
    };
  }

  onChangeText = name => text => this.setState({ [name]: text });

  render() {
    let { name, email, nameError, emailError } = this.state;

    return ( 
      <View style = {styles.container}>
        <TextInput onChangeText = {this._onChangeText("name")} value = {name} />
        <Text style = {styles.text}>{nameError}</Text>
        <TextInput onChangeText = {this._onChangeText("email"} value = {email} />
        <Text style = {styles.text}>{emailError}</Text>
      </View>
    )
  }
}

const styles = StyleSheet.create({
  text: {
    padding: 10,
    fontSize: 42
  },
  container: {
    padding: 10
  }
});

export default Home;

Другие вопросы по теме