Нарушение инварианта: обратный вызов геттера просмотра конфигурации для компонента `Home` должен быть функцией (получено `undefined`)

Я хочу вызвать функцию, используя имя ключа из массива компонента tab.screen. мой код такой:

import React from 'react';
import { Text, View, TouchableOpacity, Modal } from 'react-native';
import AsyncStorage from '@react-native-community/async-storage';
import Icon from 'react-native-vector-icons/FontAwesome5';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import Home from '../mainscreen/GeneralScreen';
import Core from '../mainscreen/CoreScreen';
import Docs from '../mainscreen/GeneralScreen';
import ESS from '../mainscreen/GeneralScreen';
import General from '../mainscreen/GeneralScreen';
import HR from '../mainscreen/GeneralScreen';
import Payroll from '../mainscreen/GeneralScreen';
import Server from '../mainscreen/CoreScreen';


const Tab = createBottomTabNavigator();
const tabcomponents = {
  "Home" : Home,
  "Core" : Core,
  "Docs" : Docs,
  "ESS" : ESS,
  "General" : General,
  "HR" : HR,
  "Payroll" : Payroll,
  "Server" : Server
};

class TabNavigator extends React.Component {

  constructor() {
      super();    
      this.state = {
         dashboardtab:[],                 
      }
      this.tabnavigatorasync();      
    }

  tabnavigatorasync = async () => {
    try {
      const dashboardtab = await AsyncStorage.getItem('dashboardtab');    
      const dashboardtabParse = JSON.parse(dashboardtab);      
      this.setState({dashboardtab: dashboardtabParse});
      //console.info('isi dari tab navigator: ', this.state.dashboardtab);                              
      //console.info('------------------------------------------------'); 
      //console.info('isi dari tab navigator 2: ', this.state.dashboardtab2[0].label);                             
    } catch (error) {      
    }
  }

  render(){
    //console.info('dashboardtab', this.state.dashboardtab);
    const tabnavigatorRender = this.state.dashboardtab.map((item, index) =>
      const tabcomponentsrender = tabcomponents[item.admintab.label];    
      return <Tab.Screen name = {item.admintab.label} component = {tabcomponentsrender} key = {index}/>                         
    );

    return(
          <Tab.Navigator>
            {tabnavigatorRender}            
          </Tab.Navigator>
        )
  }
}

export default TabNavigator;

в результате появляется такая ошибка: Нарушение инварианта: обратный вызов получателя конфигурации View для компонента Home должен быть функцией (получен undefined)

Это содержимое массива:

[
    {
        "tab_id": "home",
        "order": 10,
        "admintab": {
            "label": "Home",                        
        }
    },
    {
        "tab_id": "core",
        "order": 1,
        "admintab": {
            "label": "Core",                        
        }
    },
    {
        "tab_id": "docs",
        "order": 2,
        "admintab": {
            "label": "Docs",                        
        }
    },
    {
        "tab_id": "ess",
        "order": 50,
        "admintab": {
            "label": "ESS",                        
        }
    },
    {
        "tab_id": "general",
        "order": 45,
        "admintab": {
            "label": "General",                        
        }
    },                
    {
        "tab_id": "hr",
        "order": 40,
        "admintab": {
            "label": "HR",                        
        }
    },
    {
        "tab_id": "payroll",
        "order": 42,
        "admintab": {
            "label": "Payroll",                        
        }
    },
    {
        "tab_id": "server",
        "order": 70,
        "admintab": {
            "label": "Server",                        
        }
    }
]

что-то не так с кодом, который я сделал?

Вы не можете передать строку вместо компонента.

Leri Gogsadze 21.12.2020 06:34
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
1 538
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В вашем случае вы хотите использовать Dynamic Component Names.

  • Прежде всего, импортируйте вкладки.
import Home from 'path_to_your_tab_component/Home';
import Core from 'path_to_your_tab_component/Core'; // and so on
  • Затем передайте их в объект и дайте им ключ на основе их имен.
const components = {
    "Home": Home
    "Core": Core // and so on
}
  • Внутри карты создайте компонент из этого объекта.
const tabnavigator = this.state.dashboardtab.map((item, index) => {
    const TabComponent = components[item.admintab.label];   
    return <Tab.Screen name = {item.admintab.label} component = {TabComponent} key = {index}/>                         
});

Я обновил свой код, чтобы он был таким, но появляются новые ошибки.

satt 21.12.2020 08:27

Я обновил свой код, чтобы он был таким, но появляются новые ошибки. Ошибка Неожиданный токен на указателе: const TabComponent = компоненты [item.admintab.label];

satt 21.12.2020 08:41

Я хочу показать вам весь свой код, но этот ответ на сообщение ограничен.

satt 21.12.2020 08:43

Я пропустил return раньше Tab.Screen. Я обновил свой ответ.

Leri Gogsadze 21.12.2020 08:51

Появляющаяся ошибка все та же. Я обновил код на странице вопроса последним.

satt 21.12.2020 08:59

@satt У тебя 2 tabnavigator имени,

Leri Gogsadze 21.12.2020 09:04

Измените const tabnavigator = на другое имя.

Leri Gogsadze 21.12.2020 09:05

Или переименовать tabnavigator = async () => {.

Leri Gogsadze 21.12.2020 09:07

Также обновите код следующим образом: .map((item, index) => {. Вы забыли фигурные скобки. Смотрите мой ответ.

Leri Gogsadze 21.12.2020 09:10

Хороший. Счастливый день :))

Leri Gogsadze 21.12.2020 09:27

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