为什么我不能输入本机搜索栏?

时间:2019-11-27 20:19:41

标签: javascript react-native searchbar

键入时,搜索栏中没有任何内容,但它知道我正在键入(通过updateSearch函数中的打印语句)。从对react-native searchBar的理解来看,甚至不需要做任何事情就可以在此处显示文本,因此我真的不知道该如何解决这个问题。这是一个较大项目的一部分。.但是我祈祷这个问题与其余项目无关。

import React, { Component } from "react";
import {
  View,
  Text,
  FlatList,
  ActivityIndicator,
  SafeAreaView,
  StyleSheet
} from "react-native";
import Header from "../components/Header";
import { SearchBar, List, ListItem } from 'react-native-elements';

export default class Search extends React.Component {

  constructor(props) {
    super(props);

    this.state = {
      query: "",
      data: []
    };

  }

  renderHeader = () => {
    return (
    <SearchBar
    placeholder="Type Here..."
    onChangeText={this.updateSearch}
    value={this.state.query}
    lightTheme={true}
    />
    );
  }

  updateSearch = text => {
    console.log("text", text);
    const formattedSearch = text.toLowerCase();
    this.setState({ query: formattedSearch });
    console.log("text", this.state.query);
  };

  render() {
    return (
      <SafeAreaView style={styles.container}>
        <Header text={"Search"} />
        <FlatList
          ListHeaderComponent={this.renderHeader}
        />
      </SafeAreaView>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: Expo.Constants.statusBarHeight
  }
});

2 个答案:

答案 0 :(得分:1)

问题出在ListHeaderComponent上。

我做了一个演示项目,看发生了什么事:

import React, { Component } from 'react'
import { SafeAreaView, FlatList, TextInput } from 'react-native'

export default class Test extends Component {
    constructor(props){
        super(props)
        this.state={value:""}
    }

    renderHeader = () =>{
        console.log("rendering") 
        return (<TextInput style={{backgroundColor:"green"}}value={this.state.value} placeholder={"Placeholder"}onChangeText={(text)=> this.setState({value : text})}></TextInput>)
    }
    render() {
        console.log(this.state.value) //Logs the value
        return (
            <SafeAreaView style={{flex:1}}>
                <FlatList
                ListHeaderComponent={this.renderHeader}
                />
            </SafeAreaView>
        )
    }

}

看起来一旦组件被渲染,它就不再更新。渲染器中的日志实际上确实会更新,但是组件不会重新渲染自己(很可能导致FlatList在完成第一次渲染后也不会更新ListHeaderComponent

我建议将SearchBar移到FlatList上方,并将所有内容括在ScrollView内。

编辑

为了确认它实际上是在更新,我创建了另一个TextInput并将其放在FlatList之外,并且可以正常工作:

import React, { Component } from 'react'
import { SafeAreaView, FlatList, TextInput } from 'react-native'

export default class Test extends Component {
    constructor(props){
        super(props)
        this.state={value:""}
    }

    renderHeader = () =>{
        console.log("rendering") 
        return (<TextInput style={{backgroundColor:"green"}}value={this.state.value} placeholder={"Placeholder"}onChangeText={(text)=> this.setState({value : text})}></TextInput>)
    }
    render() {
        console.log(this.state.value) //Logs the value
        return (
            <SafeAreaView style={{flex:1}}>
                <TextInput style={{backgroundColor:"red"}}value={this.state.value} placeholder={"Placeholder"}onChangeText={(text)=> this.setState({value : text})}></TextInput>
                <FlatList
                ListHeaderComponent={this.renderHeader}
                />
            </SafeAreaView>
        )
    }

}

答案 1 :(得分:1)

如果要使用渲染更新UI,则必须更新状态。 在FlatList组件中,您不更新状态。因此它再也不会渲染。 您必须在FlatList中使用状态。

render() {
    return (
      <SafeAreaView style={styles.container}>
        <Header text={"Search"} />
        <FlatList
          ListHeaderComponent={this.renderHeader}
          AnyProp={this.state.anyState}
        />
      </SafeAreaView>
    );
  }