Я хочу вызвать функцию, используя имя ключа из массива компонента 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",
}
}
]
что-то не так с кодом, который я сделал?
В вашем случае вы хотите использовать 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}/>
});
Я обновил свой код, чтобы он был таким, но появляются новые ошибки.
Я обновил свой код, чтобы он был таким, но появляются новые ошибки. Ошибка Неожиданный токен на указателе: const TabComponent = компоненты [item.admintab.label];
Я хочу показать вам весь свой код, но этот ответ на сообщение ограничен.
Я пропустил return
раньше Tab.Screen
. Я обновил свой ответ.
Появляющаяся ошибка все та же. Я обновил код на странице вопроса последним.
@satt У тебя 2 tabnavigator
имени,
Измените const tabnavigator =
на другое имя.
Или переименовать tabnavigator = async () => {
.
Также обновите код следующим образом: .map((item, index) => {
. Вы забыли фигурные скобки. Смотрите мой ответ.
Хороший. Счастливый день :))
Вы не можете передать строку вместо компонента.