首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在屏幕之间成功传递params?

如何在屏幕之间成功传递params?
EN

Stack Overflow用户
提问于 2021-01-03 23:27:09
回答 3查看 49关注 0票数 0

我已经阅读了很多关于SO和GitHub问题的答案,试图实现一个解决方案,但一直无法针对这种情况提出解决方案。

以下是我的代码的表示形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MeetingsScreen extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      upcomingMeeting: [],
      refreshing: false
    };
  }

  async handlePress() {
    const user = await AsyncStorage.getItem('User');
    this.props.navigation.navigate('WriteSummary', { id: user.id, type: 'submit' });
  }

  printUpcomingMeetings = () => {
    return (<View style={styles.meeting}>
            <Button
              containerStyle={styles.meetingButton}
              style={styles.meetingButtonText}
              onPress={() => this.handlePress(user.id)}
              Press me to write summary!
            </Button>
          </View>);
    }

  }

  render () {
    return (<View style={{flex:1}} key={this.state.refreshing}>
    { this.printUpcomingMeetings() }
    </View>);
  }
}

class WriteSummaryScreen extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      storageId: '',
      normalId: -1,
      type: '',
      curSummary: ''
    }
  }

  componentDidMount = () => {
    const { params } = this.props.navigation.state;
    const { id, type } = params ? params : null;
    const storageId = 'summary_' + id;
    this.setState({storageId:storageId});
    this.setState({normalId:id});
    this.setState({type:type});
    AsyncStorage.getItem(storageId).then((value) => this.setSkipValue(value));
  }

  async setSkipValue (value) {
    if (value !== null) {
      this.setState({ 'curSummary': value });
    } else {
      this.setState({ 'curSummary': '' });
    }
  }

  async saveSummary (text) {
    this.setState({'curSummary': text});
    await AsyncStorage.setItem(this.state.storageId, text);
  }

  async handleSubmit() {
    const user = await AsyncStorage.getItem('User');
    if (this.state.type === 'submit') {
      // post insert
      const postres = fetch (url + '/create-summary', {
        method: 'POST',
        body: JSON.stringify({
          AppointmentId: this.state.normalId,
          SummaryText: this.state.curSummary,
          UserId: user.Id
        }),
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json',
        }
      })
      .catch((error) => {
        console.error(error);
      });
    } else {
      // post update
      const postres = fetch (url + '/update-summary', {
        method: 'POST',
        body: JSON.stringify({
          AppointmentId: this.state.normalId,
          SummaryText: this.state.curSummary,
          UserId: user.Id
        }),
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json',
        }
      })
      .catch((error) => {
        console.error(error);
      });
    }
    this.props.navigation.navigate('Meetings');
  }

  render () {
    return <View style={{flex:1}}>
      <View>
        <View style={{height:25, backgroundColor: colors.vikingBlue}}></View>
        <View style={{height:30, backgroundColor: colors.white}}></View>
        <View style={{flexDirection:'row', backgroundColor: colors.white, alignItems:'center'}}>
          <View style={{width:5}}></View>
          <TouchableOpacity onPress={() => this.props.navigation.goBack()} activeOpacity={0.5}>
            <Image style={{width:30, height:30}} source={require('./assets/icons8-back-50.png')} />
          </TouchableOpacity>
          <View style={{width:10}}></View>
          <View style={{width:mainTitleWidth,textAlign:'center',alignItems:'center'}}>
            <Text style={{fontSize:22}}>Settings</Text>
          </View>
          <TouchableOpacity onPress={() => this.props.navigation.navigate('HelpModal')} activeOpacity={0.5}>
            <Image style={{width:30, height:30}} source={require('./assets/help.png')} />
          </TouchableOpacity>
        </View>
        <View style={{height:30, backgroundColor: colors.white}}></View>
      </View>
      <TextInput
      multiline
      numberOfLines={6}
      style={styles.summaryInput}
      onChangeText={text => saveSummary(text)}
      value={this.state.curSummary} />
      <Button
        containerStyle={styles.summaryButton}
        style={styles.summaryButtonText}
        onPress={this.handleSubmit()}>
        Submit
      </Button>
    </View>
  }
}

function HomeStack() {
  return (
    <Tab.Navigator
        <Tab.Screen name="Home" component={HomeScreen} />
        <Tab.Screen name="Meetings" component={MeetingsScreen} />
        <Tab.Screen name="Topics" component={TopicsScreen} />
    </Tab.Navigator>
  );
}

export default class AppContainer extends React.Component {

  // Main rendering function. Always begins on the SplashScreen, which checks user login status and directs to Meetings. I left it out and the other Tab navigator screens for less clutter.

  render() {
    return (
        <NavigationContainer>
          <Stack.Navigator headerMode='none' initialRouteName='Splash'>
            <Stack.Screen name='Splash' component={SplashScreen} />
            <Stack.Screen name='Main' component={HomeStack} />
            <Stack.Screen name='WriteSummary' component={WriteSummaryScreen} />
          </Stack.Navigator>
        </NavigationContainer>
    );
  }
};

在按下MeetingsScreen上的按钮并导航到WriteSummaryScreen后,我得到错误TypeError: undefined is not an object (evaluating '_this7.props.navigation.state.params)'

让我困惑的是屏幕被导航到了,所以数据应该已经被传递了。我遗漏了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-04 00:29:21

如果参数是基于类的组件,你可以像下面这样访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class WriteSummaryScreen extends React.Component {
     const {id, type} = this.props.route.params;
//........

对于功能组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const WriteSummaryScreen =({navigation, route})=>{
    const {id, type} = route.params;

//..........
}
票数 1
EN

Stack Overflow用户

发布于 2021-01-04 00:08:04

您可以使用getParam函数访问从屏幕传递的参数。

所以你可以使用下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const id = this.props.navigation.getParam("id");
const type = this.props.navigation.getParam("type");
票数 0
EN

Stack Overflow用户

发布于 2021-01-04 00:28:51

最终对我起作用的是以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const id = this.props.route.params.id;
const type = this.props.route.params.type;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65555980

复制
相关文章
React向路由组件传递params参数
通过路由传递params参数,可以将动态数据传递给路由组件。这些参数通常用于根据不同的参数值呈现不同的内容或执行不同的操作。在React中,我们可以使用路由库(如react-router-dom)来定义带有参数的路由,并在组件中访问这些参数。
堕落飞鸟
2023/05/20
1K0
开发 | 如何在小程序页面之间,传递数据和变量?
最近组里开发小程序,遇到了一个困扰前端很长时间的话题:页面之间,如何传递数据和变量?
知晓君
2018/08/01
1.1K0
开发 | 如何在小程序页面之间,传递数据和变量?
Activity之间传递参数
发送 intent.setClass(Bmi.this, Report.class); Bundle bundle = new Bundle(); bundle.putString("KEY_HEIGHT", field_height.getText().toString()); bundle.putString("KEY_WEIGHT", field_weight.getText().toString()); intent.putExtras(bundle); startActivity(intent);
用户1075292
2018/01/23
5960
React路由传递params、search、state参数的相关处理
路由传递参数基本都分为三个步骤:传递参数、声明接收参数、获取参数 传递params参数 <!-- 传递参数 --> <Link to={`/路径/${value}/${value}`} <!-- 声明接收参数 --> <Route path="/路径/:key/:key" /> //获取参数 console.log(this.props.match.params) 传递state参数 <!-- 传递参数 --> <Link to={{pathname: '/路径', state: {key: value
peng_tianyu
2022/12/15
1.1K0
前端页面之间传递参数
跨页面传递参数 这里有假如传递一个参数,在另一个页面接收时,只需要js中写入如下代码: localhost:8080/index.jsp?id=1 function showWindowHref
微醺
2019/01/17
1.2K0
各组件之间的参数传递
通过子组件的props部分,来指明可以接受的参数,父组件通过在标签中写明参数的键值对来传递参数。
Swingz
2020/12/18
9550
各组件之间的参数传递
Jenkins不同job之间传递参数
在A项目配置面板中Post-build Actions选项中选择Trigger parameterized build on other projects 我选择的参数为预定义参数,如果想知道有哪些与定义参数,可以在Build模块下选择Execute shell
流柯
2018/09/11
1.8K0
Jenkins不同job之间传递参数
Python 模块之间传递变量
最近在做实验时发现个问题,我想在一个模块中调用另一个模块的变量,首先想到了用return 
py3study
2020/01/10
3.8K0
linux和windows之间传递文件
依赖于pscp文件,而windows系统下,一般没有安装。所以,需要先安装pscp应用程序。 pscp 下载pscp 放入windows的system32 文件夹下; 传送文件 windows从ubuntu服务器下载文件 背景一:假设要将ubuntu服务器下的/home/fresh/finalproject.tar下载windows下E:盘下,假设linux机器的端口是22,用户名是:fresh; 解决方法: 在Windows的cmd中输入 pscp -P 22 fresh@serverIP:/ho
用户1631856
2018/07/03
1.7K0
Activity之间传递大数据问题
Android开发人员都知道,Intent适用于在不同的Activity之间传递数据,包括参数、字符串、以及序列化的对象等。但是笔者所做的项目用到了使用Intent 传递Bitmap图片对象,图片的数据量相对来说是比较大的,那么intent能否胜任传递图片的任务呢? 首先很明显bitmap实现了Android中的Parcelable接口,可以序列化。因此理所当然能够通过intent传递,然而图片的大小有没有限制呢? Bitmap extends Object implements Parcelable 答
xiangzhihong
2018/02/01
2.7K0
Linux/Unix shell sql 之间传递变量
       灵活结合Linux/Unix Shell 与SQL 之间的变量传输,极大程度的提高了DBA的工作效率,本文针对Linux/Unix shell sql 之间传递变量给出几个简单的示例以供参考。
Leshami
2018/08/14
1.2K0
javascript表单之间的数据传递
  今天有朋友问我关于用javascript来进行页面各表单之间的数据传递的问题,我以前也写过,不过从来没有注意,今天总结了一下,希望能够给大家一些帮助,也帮助我总结以前学过,用过的知识。
Java架构师必看
2021/03/22
8760
[android] 在不同的activity之间传递数据
添加<TextView/>控件,设置控件内容水平居中,android:gravity=”center_horizontal”
唯一Chat
2019/09/10
2.3K0
[android] 在不同的activity之间传递数据
android fragement之间互相传递参数
在Activity中加载Fragment的时候、有时候要使用多个Fragment切换、并传值到另外一个Fragment、也就是说两个Fragment之间进行参数的传递、查了很多资料、找到两种方法、一种是通过共同的Activity传递、这种方法是在Activity里面添加一个字段、来临时保存要一些值。
再见孙悟空_
2023/02/10
6450
Android Activity之间的数据传递
在Android中,如果我们要通过一个Activity来启动另一个Activity,可以使用 startActivity(Intent intent)方法来传入一个Intent对象,这个Intent对象我们可以精确的指定我们需要跳转的Activity上,或者通过Intent对象来指定我们要完成的一个action操作,同时我们可以通过intent来携带一些值,进而来Activity见跳转的时候也可以把值传过去。
233333
2021/04/09
1.8K0
Android Activity之间的数据传递
1.02-get-params
import urllib.request import urllib.parse import string def get_method_params(): url = "http:/
hankleo
2020/09/17
4490
如何管理一个成功的CNCF项目(如Linkerd)
CNCF 项目对于整个开发者生态系统来说,尤其是对于基于云的社区来说,就像一缕清新的空气。它们代表了社区建设的精神,已经成为在许多不同领域鼓励集体创新的非常强大的工具。
CNCF
2021/04/21
4810
[答疑]序列图片段之间的消息传递
这个图来自EA的帮助文件。但是。。。。。图上看起来挺好,还有阴影?EA里面的操作却不是那么一回事,Gate和引用片段粘不起来(至少目前我不会)。Visual Paradigm就做得很好,如下图
用户6288414
2019/09/23
5180
[答疑]序列图片段之间的消息传递
点击加载更多

相似问题

在屏幕、route.params、React原生导航之间传递数据

122

在屏幕之间传递数据,React本机日历,导航route.params。

17

如何在屏幕之间传递数据

31

如何在屏幕之间传递数据?

219

如何在KivyMD屏幕之间传递争论?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文