React Native 之 setNativeProps

在React Native 中,改變組件的布局樣式等可以通過props或者state來實(shí)現(xiàn)任内,但由于性能瓶頸,我們不得不放棄通過觸發(fā)render的方式來改變樣式趋距,而是通過setNativeProps來直接更改原生組件的樣式屬性來達(dá)到相同的效果节腐。

這里的setNativeProps方法等價(jià)于直接操作DOM節(jié)點(diǎn)的方法翼雀。使用這種方法修改View狼渊、Text等react Native自帶的組件,并且不會觸發(fā)組件的componentWillReceiveProps 狈邑、 shouldComponentUpdate官地、 componentWillUpdate 等組件生命周期中的方法驱入。但它不應(yīng)該經(jīng)常被使用亏较,一般建議在不得不頻繁刷新而又遇到了性能瓶頸時(shí)使用掩缓。建議在使用此方法之前優(yōu)先考慮setState和shouldComponentUpdate方法來解決問題你辣。

setNativeProps 與 TouchableOpacity

TouchableOpacity這個(gè)組件就在內(nèi)部使用了setNativeProps方法來更新其子組件的透明度:

setOpacityTo: function(value) {
  // Redacted: animation related code
  this.refs[CHILD_REF].setNativeProps({
    opacity: value
  });
},

由此我們可以寫出下面這樣的代碼:子組件可以響應(yīng)點(diǎn)擊事件舍哄,更改自己的透明度表悬。而子組件自身并不需要處理這件事情,也不需要在實(shí)現(xiàn)中做任何修改温治。

<TouchableOpacity onPress={this._handlePress}>
  <View style={styles.button}>
    <Text>Press me!</Text>
  </View>
</TouchableOpacity>

如果不使用setNativeProps這個(gè)方法來實(shí)現(xiàn)這一需求熬荆,那么一種可能的辦法是把透明值保存到state中惶看,然后在onPress事件觸發(fā)時(shí)更新這個(gè)值:

getInitialState() {
  return { myButtonOpacity: 1, }
},

render() {
  return (
    <TouchableOpacity onPress={() => this.setState({myButtonOpacity: 0.5})}
                      onPressOut={() => this.setState({myButtonOpacity: 1})}>
      <View style={[styles.button, {opacity: this.state.myButtonOpacity}]}>
        <Text>Press me!</Text>
      </View>
    </TouchableOpacity>
  )
}

比起之前的例子纬黎,這一做法會消耗大量的計(jì)算 —— 每一次透明值變更的時(shí)候React都要重新渲染組件結(jié)構(gòu)本今,即便視圖的其他屬性和子組件并沒有變化主巍。一般來說這一開銷也不足為慮孕索,但當(dāng)執(zhí)行連續(xù)的動畫以及響應(yīng)用戶手勢的時(shí)候搞旭,只有正確地優(yōu)化組件才能提高動畫的流暢度肄渗。

將setNativeProps傳遞給子組件

具體要做的就是在我們的自定義組件中再封裝一個(gè)setNativeProps方法翎嫡,其內(nèi)容為對合適的子組件調(diào)用真正的setNativeProps方法惑申,并傳遞要設(shè)置的參數(shù)。

var MyButton = React.createClass({
  setNativeProps(nativeProps) {
    this._root.setNativeProps(nativeProps);
  },

  render() {
    return (
      <View ref={component => this._root = component} {...this.props}>
        <Text>{this.props.label}</Text>
      </View>
    )
  },
});

這里我們使用了ref回調(diào)語法,我們向下傳遞props時(shí)使用了{(lán)...this.props}語法啼肩,(這一用法的說明請參考對象的擴(kuò)展運(yùn)算符)祈坠,這是因?yàn)閺?fù)合組件除了要求在子組件上執(zhí)行setNativeProps意外矢劲,還要求子組件對觸摸事件進(jìn)行處理芬沉,因此會傳遞多個(gè)props.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹋艺,一起剝皮案震驚了整個(gè)濱河市捎谨,隨后出現(xiàn)的幾起案子憔维,更是在濱河造成了極大的恐慌业扒,老刑警劉巖程储,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件致板,死亡現(xiàn)場離奇詭異咏窿,居然都是意外死亡集嵌,警方通過查閱死者的電腦和手機(jī)根欧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門酥泛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呆躲,你說我怎么就攤上這事插掂「ㄉ” “怎么了燎竖?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵谢揪,是天一觀的道長拨扶。 經(jīng)常有香客問我患民,道長垦梆,這世上最難降的妖魔是什么托猩? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任赦肃,我火速辦了婚禮他宛,結(jié)果婚禮上欠气,老公的妹妹穿的比我還像新娘预柒。我一直安慰自己,他們只是感情好遮怜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布适贸。 她就那樣靜靜地躺著拜姿,像睡著了一般蕊肥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上批狱,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音爪膊,去河邊找鬼推盛。 笑死谦铃,一個(gè)胖子當(dāng)著我的面吹牛驹闰,可吹牛的內(nèi)容都是我干的疮方。 我是一名探鬼主播骡显,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼壁顶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了许蓖?” 一聲冷哼從身側(cè)響起膊爪,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赃额,沒想到半個(gè)月后叫确,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竹勉,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桨啃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了析命。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹃愤。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡软吐,死狀恐怖凹耙,靈堂內(nèi)的尸體忽然破棺而出肖抱,到底是詐尸還是另有隱情意述,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站槐壳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏带兜。R本人自食惡果不足惜吨灭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一无畔、第九天 我趴在偏房一處隱蔽的房頂上張望浑彰。 院中可真熱鬧郭变,春花似錦涯保、人聲如沸夕春。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脆侮。三九已至靖避,卻和暖如春幻捏,著一層夾襖步出監(jiān)牢的瞬間篡九,已是汗流浹背醋奠。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工沛善, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留金刁,地道東北人尤蛮。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓产捞,卻偏偏與公主長得像轧葛,于是被迫代替她去往敵國和親尿扯。 傳聞我的和親對象是個(gè)殘疾皇子衷笋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,051評論 2 35
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記空幻,個(gè)人覺得該教程講解深入淺出秕铛,比目前大...
    leonaxiong閱讀 2,813評論 1 18
  • 前言 本文 有配套視頻,可以酌情觀看供置。 文中內(nèi)容因各人理解不同芥丧,可能會有所偏差娄柳,歡迎朋友們聯(lián)系我討論寓辱。 文中所有內(nèi)...
    珍此良辰閱讀 11,898評論 23 111
  • 溪水在彈奏小鳥在歌唱 花草在跳舞樹木是觀眾 你在其中游走
    心花園子閱讀 215評論 0 2
  • 在以十年、二十年诱鞠、三十年乃至更久的時(shí)間尺度上挎挖,伴隨一餅新茶從青澀到甘醇,從濃烈到敦厚航夺,它陪伴你完成了一生的醇化與升...
    茶雲(yún)澗閱讀 343評論 0 0