Представление списка, ведущее к другому представлению списка

Есть ли у кого-нибудь пример представления списка, который ведет к другому представлению списка, например, если у меня есть представление списка, в котором есть следующие вещи:

Дом для одной семьи


Mulitplex


Дуплекс


Дом с 4 спальнями

если кто-то выбирает дом с 4 спальнями, я хочу, чтобы пользователь перешел к другому представлению списка, в котором показаны места, где доступен дом с 4 спальнями. Как я могу это сделать:

Кольцевая дорога


апельсин


River Road


Кольцевая дорога

Я использую два файла JSON для достижения того, что я пытаюсь сделать:

[

{
     "id":0,
      "House_Type": "2 Bedroom"
},
  {
    "id":1,
    "House_Type": "3 Bedroom"
  },

  {
    "id":2,
     "House_Type": "Condo"
  },
  {
    "id":3,
    "House_Type": "4 Bedroom"
  },
    {
     "id":4,
    "House_Type": "Duplex"
  },
    {
    "id":5,
    "House_Type": "Multiplex"
  }
]

Второй файл JSON

[
  {
     "id": 0,
      "PID" : 0,
      "Address": "123 Test Drive",
      "Location": "Orange",
      "Zip": 123456"
 },

  {

    "id": 1,
    "PID" : 0,
     "Address" : "234 Test Drive2",
     "Location": "Ring Road",
     "Zip": "226106"
},

{
     "id": 2,
    "PID" : 0,
     "Address" : "111 Test Drive2",
     "Location": "Bell Road",
     "Zip": "226172"
},

{
     "id": 3,
    "PID" : 0,
     "Address" : "111 Test Drive2",
     "Location": "Bell Road",
     "Zip": "226172"
},
{
     "id": 1,
    "PID" : 1,
     "Address" : "111 Test Drive2",
     "Location": "Bell Road100",
     "Zip": "226172"
},
{
     "id": 4,
    "PID" : 1,
     "Address" : "222 Test Drive3",
     "Location": "Ring Road",
     "Zip": "226173"
},
{
     "id": 5,
    "PID" : 1,
     "Address" : "333 Test Drive3",
     "Location": "Ring100 Road",
     "Zip": "221112"
},
{
     "id": 6,
    "PID" : 1,
     "Address" : "333 Test Drive3",
     "Location": "Ring100 Road",
     "Zip": "221113"
},
 {
     "id": 7,
    "PID" : 2,
     "Address" : "444 Test Drive3",
     "Location": "Shepard Road",
     "Zip": "221113"
},  
{
     "id": 8,
    "PID" : 2,
     "Address" : "555 Test Drive3",
     "Location": "Shepard1000 Road",
     "Zip": "221141"
},   

Я хочу что-то вроде этого:

Первый просмотр списка:

2 спальни


3 спальни


Кондо


4 спальни


Дуплекс


Мультиплекс


когда пользователь выбирает 2 спальни, он / она будет перенаправлен в другой вид списка, как показано ниже:

123 Test Drive
  Orange, 123456
____________________

 234 Test Drive2
  Ring Road, 226106
_____________________

111 Test Drive2
Bell Road, 226172
__________________

Все вышеперечисленное имеет родительский идентификатор (PID), равный 0, что соответствует идентификатору первого файла JSON.

если пользователь выберет 3 спальни, то он будет перенаправлен в другой вид списка, как показано ниже:

111 Test Drive2
Bell Road100, 226172
_______________________________

222 Test Drive3
Ring Road, 226173
_____________________________

333 Test Drive3
Ring100 Road, 221112
________________________

В приведенном выше случае родительский идентификатор (PID) равен 1, что соответствует идентификатору первого файла JSON.

У меня около 100 записей в моем первом файле JSON и около 300 записей во втором файле JSON. Выше я привел некоторые примерные данные.

Ниже приведен код и описание ошибки. Я получаю ошибку в коде:

import React, { Component } from 'react';
import { Text, View, StyleSheet, ListView, ActivityIndicator, TextInput, TouchableOpacity } from 'react-native';
import  initialData  from './src/screens/houses';
import  houseDetails  from './src/screens/houseDetails';

export default class Information extends Component {

  constructor(props) {
      super(props);
      this.state = {
          initialDtata: initialData(),
          subObjects: [],
          selected_topic_id: -1,
      }
   }

  listView(){
      var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
      var tabsData = ds.cloneWithRows(this.state.initialDtata)

        return(
            <View>
                <ListView
                    style = {{marginVertical: 5}}
                    enableEmptySections = {true}
                    dataSource = {tabsData}
                    renderRow = {(rowData, sectionID, rowID) => 
                      this.displayHome(rowData, rowID)}
                    />
            </View>
        )
  }

  displayHome(rowData, rowID) {
      return(
          <View style = {{flex:1}}>
              <TouchableOpacity onPress = {() => this.onHomeSelection(rowID)}>
                  <View style = {{marginVertical: 15, marginHorizontal:30, justifyContent: 'space-between', flexDirection: 'row',alignItems: 'center'}}>
                      <Text style = {{fontSize: 10, fontWeight: 'bold'}}>{rowData.House_Type}</Text>
                  </View>
              </TouchableOpacity>
              {this.state.selected_topic_id === Number(rowID) ? this.renderQuestionList(rowData.id) : null}
          </View>
      );
   }

   onHomeSelection(rowID) {
       let selected_topic_id = this.state.selected_topic_id === Number(rowID) ? -1 : Number(rowID);
        this.setState({ 
            subObjects: houseDetails(), 
            selected_topic_id: selected_topic_id, 
        })
    }

    renderQuestionList(rowID) {
        let selected_array = [];
        this.state.subObjects.map((i) => { if (i.PID === rowID) return selected_array.push(i)})

        let ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
        let tabsData = ds.cloneWithRows(selected_array)
        return(
            <View>
                <ListView
                    style = {{marginVertical: 5}} 
                    enableEmptySections = {true}
                    dataSource = {tabsData}
                    renderRow = {(rowData, sectionID, rowID) => 
                       this.renderQuestion(selected_array, rowID)} 
                />
             </View>
         )
     }

     renderQuestion(rowData, rowID) {
         let address = rowData.map((i) => {return i.Address})
         return(
             <View style = {{flex:1}}>
                 <TouchableOpacity>
                     <View style = {{marginVertical: 5, marginLeft:35, marginRight: 35}}>
                         <Text style = {{color: 'black', fontSize: 20, fontWeight: 'bold'}}>{address}</Text>
                     </View>
                 </TouchableOpacity>
              </View>
         );
     }

     render() {
         return (
             <View style = {{ flex:1, backgroundColor: 'white' }}>
                 {this.listView()}
             </View>
         );
     }
  }






module.exports = {
initialData: function() {
    return (
        initialDtata = [
            {
                "id":0,
                "House_Type": "2 Bedroom"
            },
            {
                "id":1,
                "House_Type": "3 Bedroom"
            },

            {
                "id":2,
                "House_Type": "Condo"
            },
            {
                "id":3,
                "House_Type": "4 Bedroom"
            },
                {
                "id":4,
                "House_Type": "Duplex"
            },
                {
                "id":5,
                "House_Type": "Multiplex"
            }
            ]
      );
   }
}


module.exports = {
houseDetails: function() {
    return(
        subObjects =  [
            {
              "id": 1,
              "PID" : 0,
              "Address" : "234 Test Drive2",
              "Location": "Ring Road",
              "Zip": "226106"
            },

            {
              "id": 2,
              "PID" : 0,
              "Address" : "111 Test Drive2",
              "Location": "Bell Road",
              "Zip": "226172"
          },
          {
              "id": 3,
              "PID" : 0,
              "Address" : "111 Test Drive2",
              "Location": "Bell Road",
              "Zip": "226172"
          },
          {
              "id": 1,
              "PID" : 1,
              "Address" : "111 Test Drive2",
              "Location": "Bell Road100",
              "Zip": "226172"
          },
          {
              "id": 4,
              "PID" : 1,
              "Address" : "222 Test Drive3",
              "Location": "Ring Road",
              "Zip": "226173"
          }] 
     );
   }
 }

Ниже приводится описание ошибки:

Invariant Violation: Element type is invalid: 
   expected a string (for built-in components)
   or a class/function(for composite components) but got: object.

   This error is located at:

      in RCTView (At View.js:60)
      in View(at appContainer.js:102)
      in RCTView (at View.js:60)
      in View (at Appcontainer.js:122)
      in AppContainer (at renderApplication.js:32)

любая помощь будет оценена по достоинству.

Вы используете REST или статические данные? и есть ли в "Доме с 4 спальнями" все доступные данные о местах?

HungrySoul 07.06.2018 07:23

посмотрите на это - npmjs.com/package/react-treeview

Manoz 07.06.2018 07:43

Я использую статические данные

user54967 10.06.2018 05:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы можете попробовать это:

import { initialData } from 'src/screens/houses';
import { houseDetails } from 'src/screens/housesDetails';

export default class Information extends Component {

  constructor(props: Object) {
      super(props);
      this.state = {
          initialDtata: initialData(),
          subObjects: [],
          selected_topic_id: -1,
      }
   }

  listView(){
      var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
      var tabsData = ds.cloneWithRows(this.state.initialDtata)

        return(
            <View>
                <ListView
                    style = {{marginVertical: 5}}
                    enableEmptySections = {true}
                    dataSource = {tabsData}
                    renderRow = {(rowData, sectionID, rowID) => 
                      this.displayHome(rowData, rowID)}
                    />
            </View>
        )
  }

  displayHome(rowData: Object, rowID: number) {
      return(
          <View style = {{flex:1}}>
              <TouchableOpacity onPress = {() => this.onHomeSelection(rowID)}>
                  <View style = {{marginVertical: 15, marginHorizontal:30, justifyContent: 'space-between', flexDirection: 'row',alignItems: 'center'}}>
                      <Text style = {{fontSize: 10, fontWeight: 'bold'}}>{rowData.House_Type}</Text>
                  </View>
              </TouchableOpacity>
              {this.state.selected_topic_id === Number(rowID) ? this.renderQuestionList(rowData.id) : null}
          </View>
      );
   }

   onHomeSelection(rowID) {
       let selected_topic_id = this.state.selected_topic_id === Number(rowID) ? -1 : Number(rowID);
        this.setState({ 
            subObjects: houseDetails(), 
            selected_topic_id: selected_topic_id, 
        })
    }

    renderQuestionList(rowID) {
        let selected_array = [];
        this.state.subObjects.map((i) => { if (i.PID === rowID) return selected_array.push(i)})

        let ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
        let tabsData = ds.cloneWithRows(selected_array)
        return(
            <View>
                <ListView
                    style = {{marginVertical: 5}} 
                    enableEmptySections = {true}
                    dataSource = {tabsData}
                    renderRow = {(rowData, sectionID, rowID) => 
                       this.renderQuestion(selected_array, rowID)} 
                />
             </View>
         )
     }

     renderQuestion(rowData: Object, rowID: number) {
         let address = rowData.map((i) => {return i.Address})
         return(
             <View style = {{flex:1}}>
                 <TouchableOpacity>
                     <View style = {{marginVertical: 5, marginLeft:35, marginRight: 35}}>
                         <Text style = {{color: 'black', fontSize: 20, fontWeight: 'bold'}}>{address}</Text>
                     </View>
                 </TouchableOpacity>
              </View>
         );
     }

     render() {
         return (
             <View style = {{ flex:1, backgroundColor: 'white' }}>
                 {this.listView()}
             </View>
         );
     }
  }




you can do import { initialData } from 'src/screens/houses';

module.exports = {
initialData: function() {
    return (
        initialDtata = [
            {
                "id":0,
                "House_Type": "2 Bedroom"
            },
            {
                "id":1,
                "House_Type": "3 Bedroom"
            },

            {
                "id":2,
                "House_Type": "Condo"
            },
            {
                "id":3,
                "House_Type": "4 Bedroom"
            },
                {
                "id":4,
                "House_Type": "Duplex"
            },
                {
                "id":5,
                "House_Type": "Multiplex"
            }
            ]
      );
   }
}


and import { houseDetails } from 'src/screens/housesDetails';

module.exports = {
houseDetails: function() {
    return(
        subObjects =  [
            {
              "id": 1,
              "PID" : 0,
              "Address" : "234 Test Drive2",
              "Location": "Ring Road",
              "Zip": "226106"
            },

            {
              "id": 2,
              "PID" : 0,
              "Address" : "111 Test Drive2",
              "Location": "Bell Road",
              "Zip": "226172"
          },
          {
              "id": 3,
              "PID" : 0,
              "Address" : "111 Test Drive2",
              "Location": "Bell Road",
              "Zip": "226172"
          },
          {
              "id": 1,
              "PID" : 1,
              "Address" : "111 Test Drive2",
              "Location": "Bell Road100",
              "Zip": "226172"
          },
          {
              "id": 4,
              "PID" : 1,
              "Address" : "222 Test Drive3",
              "Location": "Ring Road",
              "Zip": "226173"
          }] 
     );
   }
 }

привет @ user54967 извините за задержку

Мой выбор изменится, когда пользователь выберет Дом для одной семьи. Как мне изменить данные в this.setState ({initialDtata. Кроме того, эти данные поступают из файла JSON. Вышеуказанные данные, которые я вам дал, просто и пример. Мой файл JSON огромен. Как мне изменить intitialData на основе пользователей выбор.

user54967 07.06.2018 13:19

привет @ user54967, пожалуйста, предоставьте формат JSON, чтобы я мог писать таким образом

Sathvik Nasani 07.06.2018 13:54

Я добавил два файла JSON для основного и подробного данных, а также образцы данных. Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.

user54967 07.06.2018 17:58

если идентификатор 1-го файла JSON соответствует PID 2-го файла JSON, тогда вам нужно отобразить все связанные объекты? а эти файлы JSON ты получишь из api ryt?

Sathvik Nasani 08.06.2018 07:55

Да, когда идентификатор файла ist JSON совпадает с идентификатором PID второго файла JSON, мне нужно отобразить связанные объекты. Нет, я не получаю их через api. Они есть у меня на компьютере. Я импортирую их, используя этот оператор "импортировать дома из './houses' и 'import houseDetails from' ./houseDetails '

user54967 10.06.2018 04:23

Пожалуйста, дайте мне знать, если кому-то понадобится дополнительная информация, мне действительно нужна помощь с этим. Любая помощь будет очень признательна.

user54967 10.06.2018 05:29

Спасибо, Сатвик. Я попробую код и дам вам знать. Еще раз спасибо! Я борюсь с этим некоторое время

user54967 15.06.2018 03:36

Привет, Сатвик, я новичок в React Native. Всего один быстрый вопрос. После ввода этого оператора импортируйте {initialData} из 'src / screen / homes';), в моем коде мне не нужно делать этот модуль .exports = {initialData: function (), верно? Я не уверен, для чего нужен module.exports = {initialData: function ()?

user54967 15.06.2018 03:50

hi @ user54967 это функциональный компонент, вы должны экспортировать эту функцию, чтобы использовать эту функцию.

Sathvik Nasani 15.06.2018 07:15

Привет, Сатвик, я получаю сообщение об ошибке. Я разместил описание ошибки в своем исходном сообщении вместе с кодом, который вы мне дали. Любая помощь будет оценена по достоинству.

user54967 15.06.2018 19:51

привет @ user54967 Похоже, вы не используете последнюю версию React Native, v0.53.0, выпущенную в январе 2018 года. Можете ли вы убедиться, что эта проблема все еще может быть воспроизведена в последней версии? И вам нужно импортировать import {initialData} из 'src / screen / homes'; импортировать {houseDetails} из 'src / screen / homesDetails';

Sathvik Nasani 18.06.2018 07:53

Привет, Сатвик, я сделал это в рамках созданного мной тестового проекта: C: \ VisualStudioMobileApplication \ parentchile> react-native -v react-native-cli: 2.0.1 react-native: 0.55.4. Кажется, 0.55.4 более поздняя версия, чем 53.0

user54967 18.06.2018 17:15

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