React Native - 将道具从一个屏幕传递到另一个屏幕(使用选项卡导航器进行导航)

2024-02-26

我需要将数据从主屏幕传递到第二屏幕。如果我单击主屏幕上的按钮导航到 SecondScreen,有大量示例说明如何执行此操作,但找不到任何显示如何传递到 SecondScreen(如果我使用 v2 底部选项卡导航器)的内容从主屏幕到第二屏幕。我尝试过 screenprops 和其他一些方法,花了大约 8 个小时试图弄清楚,但无法让它工作。知道如何做到这一点吗?拜托,任何提示都会很棒。这是我的代码:

MainTabNavigator.js:

 const config = Platform.select({
  web: { headerMode: 'screen' },
  default: {},
});


const HomeStack = createStackNavigator(
  {
    Home: HomeScreen,

  },
  config

);

HomeStack.navigationOptions = {
  tabBarLabel: 'Home',
  tabBarIcon: ({ focused }) => (
    <MaterialIcons name="home" size={32}  />
  ),
};

HomeStack.path = '';


const SecondStack= createStackNavigator(
  {
    Second: SecondScreen,
  },
  config
);    

SecondStack.navigationOptions = {
  tabBarLabel: 'Second screen stuff',

  tabBarIcon: ({ focused }) => (
    <MaterialIcons name="SecondScreenIcon" size={32}  />
  ),
};

SecondStack.path = '';


const tabNavigator = createBottomTabNavigator({
  HomeStack,
  SecondScreen
});

tabNavigator.path = '';

export default tabNavigator;

主屏幕.js:

  class HomeScreen extends Component {

  constructor(props){
    super(props);  
  }

 componentDidMount(){

   this.setState({DataFromHomeScreen: 'my data that Im trying to send to SecondScreen'})

  }

//....

SecondScreen.js:

class SecondScreen extends Component {

      constructor(props){
        super(props);  
      }


   render()
   return(     

         <View>{this.props.DataFromHomeScreen}</View>

    )


    //....

****请在下面找到我尝试过的事情:****

HomeScreen.js:当我这样做时,它首先收到它,然后传递 null

render(){

return(
<View>
 //all of my home screen jsx
<SecondScreen screenProps={{DataFromHomeScreen : 'data im trying to pass'}}/>
</View>
)
}

MaintTabNavigator.js:当我这样做时,它首先收到它,然后传递 null

HomeStack.navigationOptions = {
  tabBarLabel: 'Home',
  tabBarIcon: ({ focused }) => (
    <MaterialIcons name="home" size={32}  />
  ),
};

<HomeStack screenProps={{DataFromHomeScreen:'data im trying to pass'}}/>


HomeStack.path = '';

我也尝试过其他 5 种方法,但现在我什至不记得了。我不想在第二个屏幕中再次调用我的数据库来获取用户信息。我认识的人没有人知道反应或反应本机。 React Native 文档位于https://reactnavigation.org/docs/en/stack-navigator.html https://reactnavigation.org/docs/en/stack-navigator.html充其量是最小的,仅显示以下内容:

const SomeStack = createStackNavigator({
  // config
});

<SomeStack
  screenProps={/* this prop will get passed to the screen components as this.props.screenProps */}
/>

即使您转到文档中的示例并搜索“screenprop”一词,您也不会在两个示例中看到任何有关 screen prop 功能的提及。我见过的所有问题都只涉及如何在单击按钮时传递道具,这很简单。我想做的事情可能吗?我确信我不是唯一一个使用选项卡导航器在主屏幕中检索数据并需要将其传递到其他屏幕的人。任何建议都有帮助。谢谢。

附: 这是我调用主屏幕的登录类:

class SignInScreen extends React.Component {
static navigationOptions = {
  title: 'Please sign in',
};


render() {
  return (


    <View
    style={styles.container}
    contentContainerStyle={styles.contentContainer}>

    <View>
    <SocialIcon
    title='Continue With Facebook'
    button
    type='facebook'
    iconSize="36"
    onPress={this._signInAsync} 
    />
    </View>
  );
}


_signInAsync = async () => {

    let redirectUrl = AuthSession.getRedirectUrl();
    let result = await AuthSession.startAsync({
      authUrl:
        `https://www.facebook.com/v2.8/dialog/oauth?response_type=token` +
        `&client_id=${FB_APP_ID}` +
        `&redirect_uri=${encodeURIComponent(redirectUrl)}`,
    });      

    var token = result.params.access_token
    await AsyncStorage.setItem('userToken', token);

    await fetch(`https://graph.facebook.com/me?fields=email,name&access_token=${token}`).then((response) => response.json()).then((json) => {

          this.props.navigation.navigate('Home',
          {
              UserName : json.name,
              FBID : json.id,
              email : json.email

          });     


    }) .catch(() => {
       console.log('ERROR GETTING DATA FROM FACEBOOK')
      });

};
 }

export default SignInScreen;

我认为您正在 HomeScreen 组件中的 componentDidMount 中调用数据库(我是对的?)并且由于同一层次结构中的另一个组件需要相同的数据,因此您应该考虑将其包装到新组件中并调用您的数据位于该父组件中,然后将数据传递给所有需要它的子组件。这是反应做事的方式 https://reactjs.org/docs/thinking-in-react.html#step-4-identify-where-your-state-should-live。 HomeScreen 的状态不应该有数据,您的数据应该位于更高层次结构的父组件中,并将数据作为 props 传递给子组件。

通过这种方式,当您创建选项卡时,您可以按照 React Native 文档的建议传递道具:

import { createBottomTabNavigator, BottomTabBar } from 'react-navigation-tabs';

const TabBarComponent = (props) => (<BottomTabBar {...props} />);

const TabScreens = createBottomTabNavigator(
{
  tabBarComponent: props =>
    <TabBarComponent
      {...props}
      style={{ borderTopColor: '#605F60' }}
    />,
 },
);

另一种解决方案可能是使用 Redux 或类似的全局状态管理。

我希望这有帮助。

Edit:

class Home extends React.Component{
 constructor(props){
   super(props);
   this.state = {data: null}
 }
 componentDidMount() {
   //get your props from navigation (your facebook credentials)
   //your call to database
   this.setState({data: yourResponseData});
 }
 render(){
   const TabNavigator = createBottomTabNavigator(
     {
       HomeScreen: props =>
         <HomeScreenStack
           {...this.state.data}
         />,
       SecondStack: props =>
         <SecondStack
           {...this.state.data}
         />,
      },
     );
   return(
     <TabNavigator />
   )
 }
}

const App = createAppContainer(Home);

export default App;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Native - 将道具从一个屏幕传递到另一个屏幕(使用选项卡导航器进行导航) 的相关文章

随机推荐

  • 修改 pandas 中的时间戳以使索引唯一

    我正在处理不定期记录的财务数据 有些时间戳是重复的 这使得分析变得棘手 这是数据示例 请注意有四个2016 08 23 00 00 17 664193时间戳 In 167 ts Out 168 last last sz bid ask da
  • Android Studio无法登录GitHub

    我在 Android Studio 上登录 GitHub 时遇到此问题 无法登录 无法获取用户信息 404 未找到 有人遇到过这个问题吗 我该如何解决这个问题 我也遇到过这个问题 尝试使用令牌登录 在浏览器上登录github com 转到设
  • vb6 调用形式,名称包含在数组中

    我有一个名为菜单的数组 它包含每个元素的表单名称 我怎样才能动态地调用它们 例如 如果菜单 1 登录 and 菜单 2 注销 我需要说 Login Show 但我想使用数组名称来执行此操作 我显然不能这样做 Menus X Show 这在V
  • 找不到语言 json 的内核 - 原子上的氢

    我发现有些人抱怨python kernel但这不是我的问题 这是错误的打印屏幕 https i stack imgur com DGvfC png 您可以在其中看到当我尝试运行 ipynb 文件时 它给我一个错误json kernel 该包
  • android EMFILE(打开文件太多)

    我实现了一个文件缓存来加载小图像以实现长网格视图 滚动一段时间后 我得到了很多libcore io ErrnoException open failed EMFILE Too many open files 我该如何避免这种情况 这是读取一
  • CodeDomProvider:LIB环境变量位于哪里?

    我正在使用一个System CodeDom Compiler CodeDomProvider CreateProvider CSharp 动态编译 C 类 最近 我从 Visual Studio 2010 切换到 Vistual Studi
  • Woot-badge 就像 PHP 中的一样

    有谁知道如何在用 PHP 编写的网站中实现某些功能 类似于堆栈溢出上的 Woot badge 和 Fanatic badge 我想奖励我的用户 如果他们连续 75 天每天访问我的网站 没有一天不访问它 我的网站使用会话进行登录 我使用 My
  • Google Maps Android API 实用程序集群管理器在创建集群之前是否有最低数量的标记?

    I am using the Google Maps Android API Utility Library to enable clustering in my app When five or more markers are co l
  • NSSpeechRecognizer 示例

    好的 所以我需要这样做 等待命令 晚安 然后运行一个动作 有人可以解释如何实现这一点吗 试试这个网站 http www cocoadev com index pl NSSpeechRecognizer http www cocoadev c
  • R 中带有 rCharts 的 nvd3 scatterPlot:增加标签的字体大小?

    我正在尝试增加使用创建的图中 x 轴和 y 轴的字体大小 NVD3 和 rCharts 这是我的情节代码 任何帮助表示赞赏 n1 lt nPlot pValues Chr data dat type scatterChart height
  • Git rebase 更改作者? [复制]

    这个问题在这里已经有答案了 所以我愚蠢地在一台未配置 git 的机器上进行了 3 次提交 没有作者或电子邮件 并且我想将这 3 次提交 尚未推送 作者更改为他们应该的内容 I know git commit amend可以换作者 但是怎么才
  • Android-按下按钮时将文本视图添加到布局

    现在我有一个文本字段 其下方有一个按钮 add 我想做到这一点 以便每次在文本字段中输入文本并按下 添加 按钮时 都会将一个新的文本视图添加到其下方的垂直布局中 并包含用户在该字段中键入的文本 我不想简单地使文本视图不可见 然后在单击时可见
  • Java 线程示例? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 谁能给出一个示例程序 以简单的方式解
  • BaseAdapter 类不会在 Asynctask 中 setAdapter - Android

    我有一个收集用户名 评论和数字的 asynctask 它将它们放入字符串中 然后调用 BaseAdapter 类 创建一个适配器 并将适配器设置为该类 但我的代码不起作用 它使应用程序崩溃 这是我的代码 public class Dashb
  • 试图根据具体情况抑制覆盖是错误的吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我明白为什么通过方法重写实现的多态性非常有用 我问的是 在某些情况下 当多态对象作为参数被接收时 而不是在定义其类时 尝试抑制它可能会出现什么问
  • 如何将 OpenSSL 密钥文件导入 Windows 证书存储区

    我有 OpenSSL 生成的 PEM 格式的 X 509 证书及其关联的密钥文件 连接到原型服务器时需要此证书进行身份验证 这在 Linux 上运行良好 我一直在使用 Microsoft SChannel API 在 Windows 平台上
  • MVC 中的点击计数器

    我正在尝试在 ASP NET MVC 中为网站的不同部分构建一个点击计数器 知道执行此操作的最佳位置在哪里 或者有一个好的方法吗 我们想要跟踪网站各个部分的点击量 根据您想要的粒度 以下是一些选项 您可以实施一个动作过滤器属性 http m
  • Android 设备监视器已禁用

    我刚刚开始 Android 开发并正在设置安卓工作室 http developer android com sdk index html在我的Mac上 按照说明here http vimeo com 113893631 当尝试运行一个简单的
  • Android 意图有时会“处理”而不是 ACTION_SEND

    我的应用程序应该处理共享文本 例如来自亚马逊应用程序的 URL 因此 我将以下意图过滤器添加到我的主要活动中
  • React Native - 将道具从一个屏幕传递到另一个屏幕(使用选项卡导航器进行导航)

    我需要将数据从主屏幕传递到第二屏幕 如果我单击主屏幕上的按钮导航到 SecondScreen 有大量示例说明如何执行此操作 但找不到任何显示如何传递到 SecondScreen 如果我使用 v2 底部选项卡导航器 的内容从主屏幕到第二屏幕