React Native 原生組件封裝:js 調(diào)用原生組件方法

注意冬阳,這篇文章討論的是原生組件(Native UI Components),而不是原生模塊(Native Modules)媳谁。其次涂滴,我會(huì)假設(shè)你已經(jīng)對(duì)原生組件封裝有基本的了解,如果還不了解晴音,請(qǐng)看官方文檔:Android 篇柔纵,iOS 篇

開始

也許你并不知道锤躁,除了 props搁料,RN 還提供另一種直接調(diào)用原生組件方法的機(jī)制,通過這種機(jī)制系羞,就可以實(shí)現(xiàn) react 組件方法(Refs and the DOM)郭计。內(nèi)置的原生組件就有這樣的實(shí)現(xiàn):ScrollView#scrollToDrawerLayoutAndroid#openDrawer椒振。然而官方文檔并沒有相關(guān)的描述昭伸,不過,我們還是可以通過研究內(nèi)置組件的實(shí)現(xiàn)代碼澎迎,作出一些總結(jié)庐杨。

廢話不多說,直接上結(jié)論夹供,下面以 ScrollView#scrollTo 為例

Component

ScrollView.js

// @flow
import React, {PureComponent} from 'react'
import {findNodeHandle, UIManager} from 'react-native'

export default class ScrollView extends PureComponent {
  _sendCommand(command: string, params?: []) {
    UIManager.dispatchViewManagerCommand(
      findNodeHandle(this),
      UIManager.RNScrollView.Commands[command],
      params,
    )
  }
  
  scrollTo(y: number) {
    this._sendCommand('scrollTo', [y])
  }
}
  1. UIManager.dispatchViewManagerCommand 用于發(fā)送命令到原生組件
  2. 第1個(gè)參數(shù)是 component ref
  3. 第2個(gè)參數(shù)是 command ref灵份,格式為 UIManager[Component].Commands[command]
  4. 第3個(gè)參數(shù)是 command params,必須是數(shù)組

Android

ScrollViewManager.java

public class ScrollViewManager extends ViewGroupManager<ScrollView> {
  public static final int SCROLL_TO = 1;
  
  @Override
  public @Nullable Map<String, Integer> getCommandsMap() {
    return MapBuilder.of("scrollTo", SCROLL_TO);
  }
  
  @Override
  public void receiveCommand(ScrollView root, int commandId, @Nullable ReadableArray args) {
    if (commandId == SCROLL_TO) {
      root.scrollTo(args);
    }
  }
}
  1. 通過 getCommandsMap 定義命令映射哮洽,這個(gè)映射也就是 js 端的 UIManager[Component].Commands[command]
  2. receiveCommand 里處理命令填渠,js 端傳過來的 params 會(huì)被轉(zhuǎn)換成 ReadableArray

iOS

ScrollViewManager.m

RCT_EXPORT_METHOD(scrollTo:(nonnull NSNumber *)reactTag y:(NSInteger)y) {
  ScrollView *scrollView = (ScrollView *) viewRegistry[reactTag];
  scrollView.scrollTo(y);
}

iOS 就更簡單了,我想已經(jīng)不需要做太多解釋袁铐。

最后

有一點(diǎn)需要注意:原生組件的命令機(jī)制不能返回?cái)?shù)據(jù)揭蜒。不過,退而求其次剔桨,可以通過事件的方式向 js 端回傳數(shù)據(jù)屉更。

如果你還是不太確定怎么實(shí)現(xiàn),那么建議你去看 RN 內(nèi)置組件的源代碼洒缀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瑰谜,一起剝皮案震驚了整個(gè)濱河市欺冀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萨脑,老刑警劉巖隐轩,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渤早,居然都是意外死亡职车,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鹊杖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悴灵,“玉大人,你說我怎么就攤上這事骂蓖』鳎” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵登下,是天一觀的道長茫孔。 經(jīng)常有香客問我,道長被芳,這世上最難降的妖魔是什么缰贝? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮筐钟,結(jié)果婚禮上揩瞪,老公的妹妹穿的比我還像新娘。我一直安慰自己篓冲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布宠哄。 她就那樣靜靜地躺著壹将,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毛嫉。 梳的紋絲不亂的頭發(fā)上诽俯,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音承粤,去河邊找鬼暴区。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辛臊,可吹牛的內(nèi)容都是我干的仙粱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼彻舰,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼伐割!你這毒婦竟也來了候味?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤隔心,失蹤者是張志新(化名)和其女友劉穎白群,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硬霍,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帜慢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唯卖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崖堤。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖耐床,靈堂內(nèi)的尸體忽然破棺而出密幔,到底是詐尸還是另有隱情,我是刑警寧澤撩轰,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布胯甩,位于F島的核電站,受9級(jí)特大地震影響堪嫂,放射性物質(zhì)發(fā)生泄漏偎箫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一皆串、第九天 我趴在偏房一處隱蔽的房頂上張望淹办。 院中可真熱鬧,春花似錦恶复、人聲如沸怜森。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽副硅。三九已至,卻和暖如春翅萤,著一層夾襖步出監(jiān)牢的瞬間恐疲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工套么, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留培己,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓胚泌,卻偏偏與公主長得像省咨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诸迟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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