我正在上react-native
的在线课程,并对老师使用的参数传递练习感到好奇。
讲师具有一个内容为DATA
的数组,每个元素都是SomeModel
类的一个实例。从AScreen
导航到BScreen
时,他通过将有效SomeModel
对象的ID作为参数提供给BScreen
方法,将其传递为参数props.navigation.navigate()
。然后,他将相同的DATA
数组导入定义BScreen
的文件中,并在find()
上使用DATA
方法检索相关对象。 (即使用通过props.navigation.getParam()
方法获得的ID)
与AScreen
一样,触发导航的特定按钮也可以访问DATA
以及特定对象(即,有一个按钮对应于每个有效对象,并且按钮在FlatList
)我想知道为什么他选择仅将id而不是整个对象作为参数传递给导航。然后,可以使用用于获取ID的同一BScreen
调用在getParam()
中获取整个相关对象,而无需调用find()
方法,从而节省了一些时间。我认为JavaScript将通过引用传递相关的SomeModel
实例,并且将ID传递给更大的对象作为参数将不会产生额外的开销。
我认为这是不正确的吗?我有没有忽略的间接费用来源?如果不是,出于某种原因单独传递ID是否是最佳做法,如果是,为什么?这对react-navigation
的机制来说是特殊的吗?
我在下面提供了示例代码片段,以帮助提供我上面描述的用例的更具体的图片。
SomeModel.js:
class SomeModel {
constructor(id, val1, val2, ...) {
this.id = id;
this.val1 = val1;
this.val2 = val2;
...
}
}
data.js:
import SomeModel from 'SomeModel'
export const DATA = [
new SomeModel('d1', '1234', '5678',...),
new SomeModel('d2', '1234', '5678',...),
...
]
SomeNavigator.js:
import { createAppContainer } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import AScreen from 'AScreen';
import BScreen from 'BScreen';
const SomeNavigator = createStackNavigator({
AScreen: AScreen,
BScreen: BScreen
});
export default createAppContainer(SomeNavigator);
AScreen.js:
import React from 'react';
import { View, FlatList, Button } from 'react-native';
import {DATA} from 'data';
const AScreen = props => {
return (
<View>
<FlatList data={DATA} renderItem={itemData => {
<Button
title='Go to Screen B!'
onPress={() => {
// There are actual buttons corresponding to SomeClass instances,
// but let's assume there is a single button passes a valid ID to an existing object
props.navigation.navigate('ScreenB', {dataID: itemData.item.id});
}}
/>
}} />
</View>
);
}
BScreen.js:
import React from 'react';
import { View, Text } from 'react-native';
import {DATA} from 'data';
const BScreen = props => {
const dataID = props.navigation.getParam('dataID');
const selectedItem = DATA.find(datum => datum.id === dataID);
return (
<View>
<Text> {selectedItem.val1} </Text>
</View>
);
}
答案 0 :(得分:0)
简短答案是您的想法是正确的,但是当您仔细研究细节时,您会发现所建议的方法在涉及API的实际示例中不起作用。
这一切都取决于应用程序的设计,要处理的数据类型以及组件需要多少数据。 正如您提到的,您的讲师采用了这条路径,向您展示了如何完成事情的示例。如果他向您展示了您建议的方式,并且为您提供了获取更多数据的方案,那么您将必须找到一种方法来实现此目的。他可能使用他的本地数组表示API。您将必须决定所采用的方法。