【发布时间】:2020-05-11 14:38:07
【问题描述】:
我正在参加react-native 的在线课程,我对讲师使用的参数传递练习感到好奇。
讲师有一个内容数组DATA,其中每个元素都是SomeModel 类的一个实例。当从AScreen 导航到BScreen 时,他通过将有效SomeModel 对象的id 作为参数BScreen 提供它作为props.navigation.navigate() 方法的参数来传递它。然后,他在定义BScreen 的文件中导入相同的DATA 数组,并在DATA 上使用find() 方法来检索相关对象。 (即使用通过props.navigation.getParam()方法获得的ID)
作为AScreen,触发导航的特定按钮也可以访问DATA以及特定对象(即,每个有效对象都有一个按钮对应,并且按钮在FlatList内呈现)我想知道他为什么选择只传递 id,而不是整个对象作为导航的参数。那么整个相关对象可以在BScreen 中使用与获取id 相同的getParam() 调用来获取,并且不需要调用find() 方法,节省了一些时间。我认为 JavaScript 会通过引用传递相关的 SomeModel 实例,并且将更大的对象作为参数传递不会产生额外的开销,而不仅仅是 id。
我这样想有错吗?是否有我忽略的开销来源?如果不是,出于某种原因,单独传递 ID 是否是最佳实践,如果是,为什么? react-navigation 的机制有什么特别之处吗?
我在下面提供示例代码 sn-ps,以帮助提供我上面描述的用例的更具体的图片。
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>
);
}
【问题讨论】:
标签: javascript reactjs react-native react-navigation