2017-06-10 28 views
7

Tôi đang triển khai một cơ sở tìm kiếm từ trong ứng dụng React Native. Tôi có một cửa hàng MobX, wordStore. Mỗi thay đổi văn bản sẽ kích hoạt truy vấn cơ sở dữ liệu thông qua hành động setFilter. Điều này tất cả các công trình theo mui xe như tôi có thể nhìn thấy từ giao diện điều khiển gỡ lỗi đầu ra.Thành phần biến mất khi cập nhật

Tuy nhiên, thành phần WordList dường như biến mất ngay khi mọi cập nhật được kích hoạt, tức là nếu tôi đặt chuỗi bộ lọc mặc định, nó sẽ hiển thị các mục phù hợp trong danh sách, nhưng ngay sau khi bất kỳ thay đổi văn bản nào biến mất.

Tôi có thiếu điều gì không? Điều kỳ lạ là phương pháp WordList.render() được thực hiện ngay cả khi nó không hiển thị.

EDIT: Rendering phương pháp của mảng .toString() hoạt động tốt từ các thành phần có chứa, nhưng kỳ lạ iterating qua mảng cũng hiển thị các hành vi tương tự, biến mất trên bản cập nhật.

Các thành phần chứa:

const WordSearch = observer(class WordSearch extends React.Component { 

    constructor(props) { 
     super(props); 
    } 


    render() { 
     let words = wordStore.getWords(); // For debugging 
     return (
     <View> 
      <TextInput 
      style={styles.textInput} 
      onChangeText={(filter) => wordStore.setFilter (filter)} 
      value={wordStore.filter} 
      /> 
      <Text>{words.toString()}</Text> <!-- This works --> 
      <View style={{flex:1}} key={wordStore.filter}> <!-- This disappears too --> 
      {words.map((word, i) => { 
      console.log ('word: '+word); 
      return <View style={{flex:1}} key={i}> 
       <Text>{word}</Text> 
      </View> 
      })} 
      </View> 
      <WordList {...this.props} /> 
     </View> 
    ); 

    } 
    // ... 
}); 

và thành phần Wordlist:

const WordList = observer(class WordList extends Component { 

    constructor(props) { 
    super(props); 
    this.dataSource = new ListView.DataSource({ 
     rowHasChanged: (row1, row2) => row1 !== row2 
    }) 
    } 

    componentWillReact() { 
    console.log("I will re-render, since the words have changed!"); 
    } 

    componentWillUpdate() { 
    console.log("Will update") 

    let words = wordStore.getWords(); 
    this.dataSource = this.dataSource.cloneWithRows(words); 
    console.log ("words:"); 
    console.log (words); 
    } 

    render() { 
    return (
     <View style={styles.container}> 
     <ListView 
      key={wordStore.words} 
      dataSource={this.dataSource} 
      renderRow={this.renderWordRow} 
      style={styles.listView} 
     /> 
     </View> 
    ) 
    } 

    renderWordRow = (word, sectionID, rowID) => { 
    console.log ('rendering word row: '+word) 
    return (
     <TouchableHighlight 
      underlayColor="grey"> 
      <View style={styles.rowContainer}> 
      <Text style={styles.title}>{word}</Text> 
      </View> 
     </TouchableHighlight> 
    );  
    } 
}); 

export default WordList; 
+0

Cửa sổ bảng điều khiển trông như thế nào sau khi khởi động ứng dụng, sau đó thay đổi bộ lọc? Bạn đã xác minh rằng 'getWords()' đang hoạt động đúng không? – Glubus

+0

@Glubus có nó tất cả các công trình như nó phải, đầu ra giao diện điều khiển cho thấy kết quả cập nhật, và cũng là đầu ra của 'words.toString()' trong thành phần có chứa được cập nhật như mong đợi – Adamski

Trả lời

9

Đây là một sai lầm ngớ ngẩn. Đó là do flex không được đặt trong chế độ xem có chứa. Mã đúng cho ví dụ trên:

<View style={{flex:1}}> 
     <TextInput 
     style={styles.textInput} 
     onChangeText={(filter) => wordStore.setFilter (filter)} 
     value={wordStore.filter} 
     /> 
     <WordList {...this.props} /> 
    </View> 
+0

Cảm ơn. Tôi đã có một vấn đề tương tự mà một thành phần không được trả lại bởi vì một trong những cha mẹ của nó trong hệ thống phân cấp không có một 'flex: 1'. –

Các vấn đề liên quan