Рекурсия: как исправить ошибку «Инвариантное нарушение: текстовые строки должны отображаться внутри компонента «.

#react-native #recursion

#react-native #рекурсия

Вопрос:

Я пытаюсь написать рекурсивную функцию для отображения дерева обсуждений (диалогов и ответов).

 export default class SocialPost extends Component {
  constructor(props) {
    super(props);
  }

  replies = data => {
    return data.map(item => {
      return <View key={item._id}>{this.individualPost(item)}</View>;
    });
  };

  individualPost = data => {
    return (
      <View>
        <View style={styles.container}>
          <Text>{data.comment}</Text>
        </View>
        {data.replies.length amp;amp; this.replies(data.replies)}
      </View>
    );
  };

  render() {
    return <View>{this.individualPost(this.props.data)}</View>;
  }
}

    data = [
      {
        replies: [
          {
            replies: [],
            _id: "5cb07bb28346d729a25dfc38",
            comment: "xyz"
          }
        ],
        _id: "5cb07b8a8346d729a25dfc37",
        comment: "abc"
      }
    ];
  

но вместо этого я получаю эту ошибку: инвариантное нарушение: текстовые строки должны отображаться внутри компонента.

Что я могу сделать, чтобы решить эту проблему?

Комментарии:

1. Вы обрабатываете data как объект, но это массив объектов. Поэтому попробуйте передать объект этого массива в individualPost()

2. Это происходит только тогда, когда data.replies.length случайно равно нулю?

Ответ №1:

Проблема, вероятно, в этой строке : {data.replies.length amp;amp; this.replies(data.replies)} .

Если data.replies.length равно 0, часть после amp;amp; не будет вызвана. Это означает, что React попытается отобразить там строку «0», что запрещено вне <Text> компонента.

Решением было бы просто выполнить {this.replies(data.replies)} , а затем вернуться null из replies() функции, когда ответов нет.

Комментарии:

1. Спасибо, это работает как шарм! Я изменил свой код на {!!data.replies.length amp;amp; this.replies(data.replies)} witch, который тоже работает нормально.

Ответ №2:

data.comment не существует при первом проходе. Данные — это просто массив, поэтому реагирующие вещи, которые вы пытаетесь отобразить здесь, без их существования. Ошибка буквально говорит вам, что там может отображаться только текст. Вы пытаетесь отобразить тип данных.

 individualPost = data => {
    return (
      <View>
        <View style={styles.container}>
          <Text>{data.comment}</Text> //your problem
        </View>
        {data.replies.length amp;amp; this.replies(data.replies)}
      </View>
    );
  };
  

Комментарии:

1. Ну, я думаю, что я недостаточно ясно выразился. Массив является источником данных для плоского списка. <SocialPost /> отображается в плоском списке. В компоненте данные являются объектом.

2. <FlatList data={this.props.social.posts} keyExtractor={(item, index) => item._id} renderItem={({ item }) => ( <View>{1 === 2 amp;amp; <SocialPost data={item} />}</View> )} />