React-native – 将数据从一个屏幕传递到另一个屏幕

我正在尝试学习如何使用react-native,所以我建立了一个小应用程序,从服务器获取用户列表,将其显示在列表视图中,按下一行打开一个显示用户数据的屏幕.

我设置了一个导航器,从一个屏幕到另一个屏幕.按下行时我可以打开一个新屏幕,但我无法想象如何将数据传递到这个新屏幕.

我在index.android.js中设置了一个导航器

import React from 'react';
import {
  AppRegistry,Navigator,} from 'react-native';

import ContactList from './src/containers/ContactList.js';

function MyIndex() {
  return (
    <Navigator
      initialRoute={{ name: 'index',component: ContactList }}
      renderScene={(route,navigator) => {
        if (route.component) {
          return React.createElement(route.component,{ navigator });
        }

        return undefined;
      }}
    />
  );
}

AppRegistry.registerComponent('reactest',() => MyIndex);

首先,我显示一个带有按钮和空列表视图的屏幕(ContactList.js),按下按钮后,我获取了一些用于更新列表视图的JSON数据:

import React,{ Component,PropTypes } from 'react';
import {
  Text,View,TouchableOpacity,TouchableHighlight,ListView,Image,} from 'react-native';

import styles from '../../styles';
import ContactDetails from './ContactDetails';

const url = 'http://api.randomuser.me/?results=15&seed=azer';

export default class ContactList extends Component {
  static propTypes = {
    navigator: PropTypes.object.isRequired,}
  constructor(props) {
    super(props);

    const datasource = new ListView.DataSource({ rowHasChanged: (r1,r2) => r1 !== r2 });
    this.state = {
      jsonData: datasource.cloneWithRows([]),ds: datasource,};
  }
  _handlePress() {
    return fetch(url)
      // convert to json
      .then((response) => response.json())
      // do some string manipulation on json
      .then(({ results }) => {
        const newResults = results.map((user) => {
          const newUser = {
            ...user,name: {
              title: `${user.name.title.charAt(0).toUpperCase()}${user.name.title.slice(1)}`,first: `${user.name.first.charAt(0).toUpperCase()}${user.name.first.slice(1)}`,last: `${user.name.last.charAt(0).toUpperCase()}${user.name.last.slice(1)}`,},};

          return newUser;
        });

        return newResults;
      })
      // set state
      .then((results) => {
        this.setState({
          jsonData: this.state.ds.cloneWithRows(results),});
      });
  }
  renderRow(rowData: string) {
    return (
      <TouchableHighlight
        onPress={() => {
          this.props.navigator.push({
            component: ContactDetails,});
        }}
      >
        <View style={styles.listview_row}>
          <Image
            source={{ uri: rowData.picture.thumbnail }}
            style={{ height: 48,width: 48 }}
          />
          <Text>
            {rowData.name.title} {rowData.name.first} {rowData.name.last}
          </Text>
        </View>
      </TouchableHighlight>
    );
  }
  render() {
    const view = (
      <View style={styles.container}>
        <TouchableOpacity
          onPress={() => this._handlePress()}
          style={styles.button}
        >
          <Text>Fetch results?</Text>
        </TouchableOpacity>
        <ListView
          enableEmptySections
          dataSource={this.state.jsonData}
          renderRow={(rowData) => this.renderRow(rowData)}
          onPress={() => this._handleRowClick()}
        />
      </View>
    );

    return view;
  }
}

当按下一行时,它会打开一个新的屏幕ContactDetails.js,它应该显示用户的数据:

import React,{
} from 'react';

import {
  Text,} from 'react-native';

import styles from '../../styles';

export default function ContactDetails() {
  return (
    <View style={styles.container}>
      <Text>{this.props.title}</Text>
      <Text>{this.props.first}</Text>
      <Text>{this.props.last}</Text>
    </View>
  );
}

此时我收到了这个错误:

undefined is not an object (evaluating ‘this.props.title’)

我尝试了很多东西,比如:

this.props.navigator.push({
    component: ContactDetails,title: rowData.name.title,first: rowData.name.first,last: rowData.name.last,});

要么

this.props.navigator.push({
    component: ContactDetails,props: {
        title: rowData.name.title,}
});

要么

this.props.navigator.push({
    component: ContactDetails,passProps: {
        title: rowData.name.title,}
});

但无济于事.

我还读到我应该使用redux.难道我做错了什么 ?

编辑:问题在这里:

<TouchableHighlight
    onPress={() => {
      this.props.navigator.push({
        component: ContactDetails,});
    }}
>

我想我应该在那里传递一些参数,但无论我在上面尝试过什么都失败了.

所以问题似乎在于:
<Navigator
  initialRoute={{ name: 'index',component: ContactList }}
  renderScene={(route,navigator) => {
    if (route.component) {
      return React.createElement(route.component,{ navigator });
    }

    return undefined;
  }}
/>

在renderScene函数中,您确实收到了路由(并使用route.component),但是您没有传递route.props或route.passProps或者您想要调用它的内容!从我在Navigator的源代码中看到的那一刻起,你应该在创建它时拥有完整的路径对象.所以你应该能够传递你的道具.

例如:

<Navigator
  initialRoute={{ name: 'index',{ navigator,...route.props });
    }

    return undefined;
  }}
/>

// push
<TouchableHighlight
  onPress={() => {
    this.props.navigator.push({
      component: ContactDetails,props: { /* ... */ }
    });
  }}
>

您也可以设置redux,但这不是必需的.虽然如果您的应用程序变大,您应该考虑使用外部商店!

更新:

还有另一个问题.

您使用功能组件.功能组件没有这个.他们在参数中接收道具.

所以它应该是这样的:

export default function ContactDetails(props) {
  return (
    <View style={styles.container}>
      <Text>{props.title}</Text>
      <Text>{props.first}</Text>
      <Text>{props.last}</Text>
    </View>
  );
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom