React-native 組件間傳值

react-native中每個頁面我們都會抽取一些小的組件进肯,以便于維護和復用吕嘀,那么組件間就免不了相互的數(shù)據(jù)傳遞法褥,今天就記錄下關于組件間消息傳遞的幾種方法

父子組件間傳值

由于是父子組件那么在父組件中可以很輕松的獲取到子組件的實例历葛。數(shù)據(jù)間傳遞還是很方便的坞淮。
react-native中 不需要想我們在寫iOS一樣墨微,需要先在子類中定義好屬性道媚,在傳值 。在react-native中每個組件都有一個props屬性翘县。我們可以先設置屬性數(shù)據(jù)最域,那么設置的這個屬性數(shù)據(jù),會自動保存在props中锈麸。

  • 我們先創(chuàng)建一個子組件
// 創(chuàng)建一個子組件
class  Son extends  Component {

    render(){
        return(
            <View style={styles.sonStyle}>
            <!-- 獲取父組件中傳遞過來的數(shù)據(jù) 并顯示 -->
                <Text>我的名字叫{this.props.name}</Text>
            </View>
        )
    }
}
  • 創(chuàng)建一個父組件 在父組件中包含子組件
class  Father extends  Component {

    render(){
        return(
            <View style={styles.fatherStyle}>
            <!--添加子組件 并創(chuàng)建一個name屬性 并賦值給Son組件 -->
                <Son name= '小莊' ></Son>
            </View>
        )
    }

}

現(xiàn)在Son子組件已經(jīng)可以獲取到從父組件中傳遞的數(shù)據(jù)了镀脂,是不是 還挺簡單的。那如果我們想從Son組件傳遞數(shù)據(jù)給Father應該怎么做呢

子組件傳值給父組件(數(shù)據(jù)逆?zhèn)鳎?/h4>

我們想在父組件中獲取到子組件傳遞過來的數(shù)據(jù)忘伞。首先我們也是通過props來傳參薄翅,但是這次我們傳遞的不是數(shù)據(jù)沙兰,而是類似于block的函數(shù)作為參數(shù)傳遞給子組件。

  • 首先我們先在父控件中定義好一個函數(shù)
    // 實現(xiàn)方法接受子控件傳達的值
    getMoney(money) {
        // 獲取傳過來的值,并賦值給自己的屬性,刷新UI
        // 獲取之前的
        var  oldMoney = this.state.money
        oldMoney += money

        // 重新賦值
        this.setState({
            money: oldMoney
        })

    }

  • 現(xiàn)在我們將定義好的函數(shù)賦值給子組件的屬性翘魄。

    render(){
        return(
            <View style={styles.fatherStyle}>
                <Son name= '小莊'  money={this.getMoney.bind(this)}></Son>
                <Text>收到孩子的錢 + {this.state.money}</Text>
            </View>
        )
    }

注: this.getMoney.bind(this) 這里使用bind來指定this的指向關系鼎天,因為我們在getMoney這個方法中需要使用到 this 如果不做綁定的話,this的指向關系有可能不對(this可以理解為iOS里的self

  • 在子組件中獲取屬性熟丸,并調用训措。
class  Son extends  Component {

    // 逆向傳值
    // 定義方法
    sendMoney(){
        // 獲取props中報存的方法 并調用
        this.props.money(100)
    }

    render(){
        return(
            <View style={styles.sonStyle}>

                <Text>{this.props.name}的孩子</Text>
                <Text onPress={this.sendMoney.bind(this)}>給爹發(fā)錢</Text>
            </View>
        )
    }
}

至此在父控件中就可以收到子控件傳遞過來的100數(shù)據(jù)了。


在開發(fā)中不僅僅有父子之間的數(shù)據(jù)傳遞光羞,有時候也會涉及到绩鸣,兩個組件沒有存在直接引用關系時的數(shù)據(jù)傳遞。在iOS開發(fā)中我們一般會選用NSNotification來處理這方面的邏輯纱兑。在react-native中也提供了類似的API組件 也就是DeviceEventEmitter 它是包含在react-native庫中的呀闻,使用起來也比較方便,和iOS的通知類似潜慎。


// 1 要使用DeviceEventEmitter 首先要導入
import
{
    AppRegistry,
    StyleSheet,
    Text,
    View,
    DeviceEventEmitter
}

    from 'react-native'

    // 2 在需要傳值的組件里捡多,發(fā)送通知即可
    // sendMoney 通知名稱
    // 100 傳遞的值
    DeviceEventEmitter.emit('sendMoney',100)

  // 3 在需要獲取值的組件里 監(jiān)聽通知
  // 'sendMoney' 通知名稱
  //  this.getMoney.bind(this) 收到通知后 調用的方法
 DeviceEventEmitter.addListener('sendMoney',this.getMoney.bind(this)) 實現(xiàn)方法

關于propsState

這里說下我對propsstate的理解;

首先propsstate有一個共同點 就是他們都保存組件的屬性铐炫。

不同點是:

  • 從父組件中傳遞過來的屬性數(shù)據(jù)都保存在props中垒手,并且props中的數(shù)據(jù) 只能在父控件中修改。修改props也不會觸發(fā)重新渲染倒信。
  • state是定義在組件內部科贬,并且只有state發(fā)生改變時(也就是調用setState)才會重新渲染頁面

或者更簡單的理解為,外部傳遞過來的數(shù)據(jù)都保存在props中鳖悠,而組件內部創(chuàng)建的數(shù)據(jù)都保存在state中榜掌。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乘综,隨后出現(xiàn)的幾起案子憎账,更是在濱河造成了極大的恐慌,老刑警劉巖卡辰,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胞皱,死亡現(xiàn)場離奇詭異,居然都是意外死亡九妈,警方通過查閱死者的電腦和手機朴恳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來允蚣,“玉大人,你說我怎么就攤上這事呆贿∪峦茫” “怎么了森渐?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冒晰。 經(jīng)常有香客問我同衣,道長,這世上最難降的妖魔是什么壶运? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任耐齐,我火速辦了婚禮,結果婚禮上蒋情,老公的妹妹穿的比我還像新娘埠况。我一直安慰自己,他們只是感情好棵癣,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布辕翰。 她就那樣靜靜地躺著,像睡著了一般狈谊。 火紅的嫁衣襯著肌膚如雪喜命。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天河劝,我揣著相機與錄音壁榕,去河邊找鬼。 笑死赎瞎,一個胖子當著我的面吹牛牌里,可吹牛的內容都是我干的。 我是一名探鬼主播煎娇,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼二庵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缓呛?” 一聲冷哼從身側響起催享,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哟绊,沒想到半個月后因妙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡票髓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年攀涵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洽沟。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡以故,死狀恐怖,靈堂內的尸體忽然破棺而出裆操,到底是詐尸還是另有隱情怒详,我是刑警寧澤炉媒,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站昆烁,受9級特大地震影響吊骤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜静尼,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一白粉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鼠渺,春花似錦鸭巴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掌敬,卻和暖如春惯豆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奔害。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工楷兽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人华临。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓芯杀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雅潭。 傳聞我的和親對象是個殘疾皇子揭厚,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容