Проблема с onChangeText при использовании react-native-component this.setState не устанавливает состояние внутри onChangeText

У меня проблема с реакцией на родной, и я как бы застрял в том, почему это не работает. Я пытаюсь обновить свое состояние на странице друзей, используя свойство onChangeText компонента ввода из react-native-elements.

export default class FriendsPage extends Component {
    
    constructor(props) {
        super(props);
        this.state = {
            search:'',
            loading:false
        };
    }
    findFriend(){
        //Does stuff
    }
  
    renderButtonOrLoading() {
        if(this.state.loading){
            return <Text>Loading</Text>
        }
        return(
            <View style={styles.container}>
                <Button title = "Search" onPress={()=>this.findFriend()} styles={styles.button}/>
            </View>
        );
    }
    render(){
      console.log(this.search)
        return(
            <View style={styles.container}>
              <TextInput style={styles.input}
                  placeholder='username'
                  onChangeText={search =>this.setState({ search})}/>
                     
              {this.renderButtonOrLoading()}
            </View>

        
        );
    }
}

const styles = StyleSheet.create({
    container:{
        marginTop: 100,
        flex: 1,
        alignItems: 'center',
        justifyContent: 'center',

    }
});

Моя проблема в том, что каждый раз, когда я вызываю функцию findFriends(), я получаю сообщение об ошибке, в котором говорится, что this.search не определен. Я попытался консольно зарегистрировать this.search во время рендеринга, и кажется, что он остается неопределенным в каждом цикле рендеринга. У меня есть ощущение, что я должен как-то использовать реквизит, но я не уверен, так как я относительно новичок, чтобы реагировать.

Изменить: спасибо за все ответы, я пытался вызвать this.search, хотя предполагается, что это будет this.state.search, и это сломало мой код.


person nullnameguy    schedule 08.01.2021    source источник
comment
Это не this.search, это должно быть this.state.search. И вам нужно привязать this к функции или использовать функцию стрелки. reactjs.org/docs/handling-events.html codepen.io/gaearon/pen/xEmzGg?editors=0010   -  person Uğur Eren    schedule 08.01.2021
comment
Я попытался изменить его на функцию стрелки, и это, похоже, не сработало. Консоль функции рендеринга регистрирует состояние, и оно не определено каждый раз, когда я что-то ввожу в текстовое поле.   -  person nullnameguy    schedule 08.01.2021
comment
Можете ли вы попробовать установить значение TextInput в состояние, например: value={this.state.search}   -  person Uğur Eren    schedule 08.01.2021
comment
просто сначала установите значение по умолчанию для целей тестирования, тогда вы будете знать, что это. поиск не будет работать @UğurEren прав   -  person MUHAMMAD ILYAS    schedule 08.01.2021


Ответы (1)


Неясно, совпадает ли переменная search с переменной в состоянии. Если это так, этот код не будет работать.

onChangeText={search =>this.setState({ search})} // setting a state to itself won't work

Если это отдельная переменная, вы неправильно назвали setState. Я рекомендую изменить имя переменной. Вызов setState должен выглядеть примерно так:

onChangeText={ s => this.setState( { search: s } );

search не определено (ложно), потому что вы установили его в ' ' в своем состоянии. Для подхода React на основе классов вы можете использовать метод getDerivedStateFromProps() (если вы передаете поисковый запрос из реквизита).

person S. Dale    schedule 08.01.2021
comment
Когда пара ключ-значение одинаковая, нет необходимости записывать их оба. - person Leri Gogsadze; 08.01.2021
comment
В этом случае this.setState({ search }); работает. - person Leri Gogsadze; 08.01.2021