reactNative 之组件传值和反向传值

在项目中我们经常会遇到传值,传值有正向传值和反向传值,比如
1.正向传值:从A组件push到B组件传值
2.反向传值:从A组件push到B组件,然后在B组件修改数据之后,想要在A组件更新显示,这时候就需要反向传值告诉A组件。
实现反向传值:在A组件进行this.props.navigation.navigate()的时候传参数增加一个函数getName就像这样:

this.props.navigation.navigate('MNickName',
                                    {
                                        name:that.state.subtitles[i],
                                        getName:function(name){
                                        console.log(that.state.subtitles);
                                        let subtitls= that.state.subtitles.splice(0,1,name);
                                        console.log(that.state.subtitles);
                                        that.setState({name:name,subtitles:that.state.subtitles})
                                    }}
                                    )

然后在B组件需要返回传值的时候调用getName方法就可以传值过来了:

 static navigationOptions = ({navigation}) => ({

        headerTitle: '修改用户名',
        headerLeft: (
            <NavigationItem
                icon={require('../../img/Public/back.png')}
                onPress={() => navigation.goBack()}
            />
        ),
        headerRight: (
            <Button
                style={{color: color.theme, fontSize: 15, marginRight: 10, fontWeight: 'bold'}}
                title="确定"
                onPress={() => {
                    const {params} = navigation.state;
                    params.getName(_this.state.text);
                    navigation.goBack()
                }}
            />
        ),
        headerStyle: {backgroundColor: 'white'}
    })

下面展示下反向传值:


ezgif.com-gif-to-apng.gif

下面附上源码:
A组件为个人信息:
MineInfo

import React, { PureComponent } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    Image,
    Dimensions,
    TextInput,
    ScrollView,
    FlatList,
    SectionList,
    RefreshControl,
    TouchableOpacity,
    ActionSheetIOS,

} from 'react-native';
import NavigationItem from '../../widget/NavigationItem';
import  color from '../../widget/color';
import MineItemAvatar from './MineItemAvatar';
import MineBaseInfo from './MineBaseInfo';

export default class  MineInfo extends PureComponent{
    static navigationOptions = ({navigation})=>({
        headerTitle:'个人信息',
        headerLeft:(
            <NavigationItem
                icon={require('../../img/Public/back.png')}
                onPress={()=>{
                    navigation.goBack();
                }}
            />
        ),

    })

    // 构造
      constructor(props) {
        super(props);
        // 初始状态
        this.state = {
            titles:['昵称','生日','收货地址'],
            subtitles:['123','19900101','上海市'],
            name:''
        };

      }


    render(){
        let that = this;
        return(
            <ScrollView>
                <MineItemAvatar
                    title='头像'
                    icon={require('../../img/Mine/avatar.png')}
                    onPress={()=>{
                        ActionSheetIOS.showActionSheetWithOptions({
                                options: ['拍照', '从手机相册选择', '取消'],
                                cancelButtonIndex:2
                            },(buttonIndex)=>{
                            alert(buttonIndex);
                            }
                        )
                    }}
                />
                {this.state.titles.map((title,index)=>(
                    <MineBaseInfo
                        title={title}
                        subtitle={this.state.subtitles[index]}
                        key={index}
                        selectedIndex={index}
                        onPress={(i)=>{
                            if(i==0){
                         {this.props.navigation.navigate('MNickName',
                                    {
                                        name:that.state.subtitles[i],
                                        getName:function(name){

                                        console.log(that.state.subtitles);
                                        let subtitls= that.state.subtitles.splice(0,1,name);
                                        console.log(that.state.subtitles);
                                        that.setState({name:name,subtitles:that.state.subtitles})
                                    }}


                                    )}
                            }


                        }}
                    />
                ))}
            </ScrollView>
        );
    }
}

由于下面三行是重复部分 抽出出来
MineBaseInfo代码如下:


import React, { PureComponent } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    Image,
    Dimensions,
    TextInput,
    ScrollView,
    FlatList,
    SectionList,
    RefreshControl,
    TouchableOpacity,

} from 'react-native';
import NavigationItem from '../../widget/NavigationItem';
import  color from '../../widget/color';
import {Heading1} from '../../widget/Text';
import {Heading2,Paragraph} from '../../widget/Text';
import Seprator from '../../widget/Separator';
export default class MineBaseInfo extends PureComponent{
    render(){
        let index = this.props.selectedIndex;
        return(
            <TouchableOpacity onPress={()=>this.props.onPress(index)}>
                <View style={styles.container} >
                    <Heading2 style={{marginLeft:15}}>{this.props.title}</Heading2>
                    <View style={styles.rightContainer}>
                        <Paragraph>{this.props.subtitle}</Paragraph>
                        <Image source={require('../../img/Public/cell_arrow.png')} style={styles.arrow}/>
                    </View>
                </View>
                <Seprator/>
            </TouchableOpacity>
        );
    }
}
const styles = StyleSheet.create({
    container:{
        backgroundColor:'white',
        flexDirection:'row',
        // justifyContent:'center',
        alignItems:'center',
        paddingVertical:20

    },
    rightContainer:{
        flex:1,
        flexDirection:'row',
        alignItems:'center',
        justifyContent:'flex-end',
        marginRight:15,
    }
    ,
    avatar:{
        width:30,
        height:30,
        borderRadius:15,
        marginRight:5
    },
    arrow:{
        width:10,
        height:10
    }
})

第一行显示头像的组件
MineItemAvatar源码如下:


import React, { PureComponent } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    Image,
    Dimensions,
    TextInput,
    ScrollView,
    FlatList,
    SectionList,
    RefreshControl,
    TouchableOpacity,

} from 'react-native';
import NavigationItem from '../../widget/NavigationItem';
import  color from '../../widget/color';
import {Heading1} from '../../widget/Text';
import {Heading2} from '../../widget/Text';
import Seprator from '../../widget/Separator';

export default class MineItemAvatar extends PureComponent{
    render(){
        return(
            <View>
            <TouchableOpacity style={styles.container} onPress={this.props.onPress}>
                <Heading2 style={{marginLeft:15}}>{this.props.title}</Heading2>
                <View style={styles.rightContainer}>
                    <Image source={this.props.icon} style={styles.avatar}/>
                    <Image source={require('../../img/Public/cell_arrow.png')} style={styles.arrow}/>
                </View>

            </TouchableOpacity>
                <Seprator/>
            </View>
        );
    }
}
const styles = StyleSheet.create({
    container:{
        backgroundColor:'white',
        flexDirection:'row',
        // justifyContent:'center',
        alignItems:'center',
        paddingVertical:10

    },
    rightContainer:{
        flex:1,
        flexDirection:'row',
        alignItems:'center',
        justifyContent:'flex-end',
        marginRight:15,
    }
    ,
    avatar:{
        width:30,
        height:30,
        borderRadius:15,
        marginRight:5
    },
    arrow:{
        width:10,
        height:10
    }
})

B组件源码如下:
ModifyUserNickName


import React, { PureComponent } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    Image,
    Dimensions,
    TextInput,
    ScrollView,
    FlatList,
    SectionList,
    RefreshControl,
    TouchableOpacity,
    ActionSheetIOS,

} from 'react-native';
import NavigationItem from '../../widget/NavigationItem';
import  color from '../../widget/color';
import Button from '../../widget/Button';
import {Heading1,HeadingBig} from '../../widget/Text';
import {Heading2,Paragraph} from '../../widget/Text';
import screen from '../../common/screen';
let _this ;
export default class  ModifyUserNickName extends PureComponent {
    // 构造
    constructor(props) {
        super(props);
        // 初始状态
        this.state = {
            text: '',
            color: color.border
        }
        _this = this;
    };
    static navigationOptions = ({navigation}) => ({

        headerTitle: '修改用户名',
        headerLeft: (
            <NavigationItem
                icon={require('../../img/Public/back.png')}
                onPress={() => navigation.goBack()}
            />
        ),
        headerRight: (

            <Button
                style={{color: color.theme, fontSize: 15, marginRight: 10, fontWeight: 'bold'}}
                title="确定"
                onPress={() => {
                    const {params} = navigation.state;
                    params.getName(_this.state.text);
                    navigation.goBack()
                }}
            />
        ),
        headerStyle: {backgroundColor: 'white'}
    })

    componentDidMount() {
        const {params} = this.props.navigation.state;
        this.setState({
            text:params.name,
        })
    }
    _onBlur(){


        this.setState({color:color.border});
    }
    render() {

        return (
            <ScrollView >
                <View style={[styles.container,{borderColor:this.state.color}]}>
                    <Heading1 style={{marginRight:5}}>用户名:</Heading1>
                    <TextInput
                        placeholder='请输入用户名'
                        value={this.state.text}
                        onChangeText={(text) => this.setState({text})}
                        style={{fontSize:15,padding:0,flex:1,marginRight:5}}
                        clearButtonMode='while-editing'
                        blurOnSubmit={true}
                        onFocus={()=>{this.setState({color:color.theme})}}
                        onBlur={()=>this._onBlur()}
                    />
                </View>
            </ScrollView>
        )

    }
}
const styles = StyleSheet.create({
    container:{
        flexDirection:'row',
        alignItems:'center',
        backgroundColor:'white',
        padding:15,
        margin:20,
        borderWidth:screen.onePixel,
        borderColor:color.borderColor,
        borderRadius:5,
}
})

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,335评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,259评论 25 707
  • iOS开发中,页面传值是很常见的,但是页面传值你究竟知道多少呢?笔者这篇文章就是给大家介绍一下页面传值的具体方式,...
    蒲公英少年阅读 2,133评论 10 44
  • 在工作中,有的人不管跳槽到哪一行,都能干的有声有色。可有的人,即便是在自己最拿手的领域,也很难把事情做好。对...
    景景相依阅读 261评论 0 0
  • 河神送你金斧头银斧头是你幸运,也是你诚实。公主吃了毒苹果是被巫婆毒害,王子吻她是她漂亮,二者没有关系,所有的丢失,...
    艾梦洋阅读 206评论 0 0