我正在上关于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>
);
}
简短的回答是您的想法是正确的,但是当您仔细研究细节时,您会发现所建议的方法在涉及API的实际示例中不起作用。
这全都取决于应用程序的设计,要处理的数据类型以及组件需要多少数据。正如您提到的,您的讲师采用了这条路径,向您展示了如何完成事情的示例。如果他向您展示了您建议的方式,并且为您提供了获取更多数据的方案,那么您将必须找到一种方法来实现它。他可能使用他的本地数组表示API。您将必须决定所采用的方法。