react自定義組件中使用ref

一榕订、自定義組件使用ref并且透傳子組件ref

自定義組件中使用ref需要用到react的2個hooks:
1.forwardRef
2.useImperativeHandle

  • useImperativeHandle 可以讓你在使用 ref 時自定義暴露給父組件的實例值
  • useImperativeHandle 應當與 forwardRef 一起使用

自定義組件:

const FancyInput = React.forwardRef((props, ref) => {
  const inputRef = useRef();

  useImperativeHandle(ref, () => ({
    focus: () => {
      // 這里可以加自己的邏輯哦
      inputRef.current.focus();
    }
  }));

 return (
  <div>
    <input ref={inputRef} type="text" />
    <div>我是自定義的函數(shù)式組件</div>
  </div>
 )
});

使用:

import FancyInput from '@/components/FancyInput ';
const App = props => {
  const fancyInputRef = useRef();
  return (
    <div>
      <FancyInput ref={fancyInputRef} />
      <button onClick={() => {fancyInputRef.current.focus()}}>
        調(diào)用FancyInput組件的 focus方法
      </button>
    </div>
  )
}

ReactDOM.render(<App />, root);
二、React.forwardRef和connect的聯(lián)合使用問題

先使用 React.forwardRef;再使用 connect 包一層會使 ref 屬性漏掉贩幻,導致 內(nèi)部實例無法傳到外部两嘴;
正確的操作方式要調(diào)整高階組件的順序,先用connect包裹憔辫,然后再用React.forwardRef包裹贰您。

const VerificationCode = (props: VerificationCodeType) => {
  useImperativeHandle(props.refInstance, () => ({  // 導出ref屬性字段
    myFunction(){
      console.log('myFunction');
    }
  }));
  return <></>;
};

const ConnectVerificationCode = connect(  // 鏈接dva
  ({ models }: { models: ModelsType }) => ({
    models,
  }),
)(VerificationCode);

export default forwardRef((props: VerificationCodeType, ref) => (  // 包裹forwardRef
  <ConnectVerificationCode
    {...props}
    refInstance={ref}
  ></ConnectVerificationCode>
));

這樣就可以同時使用2個高階組件了拢操。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舶替,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顾瞪,更是在濱河造成了極大的恐慌,老刑警劉巖惕橙,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钉跷,死亡現(xiàn)場離奇詭異,居然都是意外死亡惶凝,警方通過查閱死者的電腦和手機犬钢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來混滔,“玉大人歹颓,你說我怎么就攤上這事∥】福” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵吠昭,是天一觀的道長胧瓜。 經(jīng)常有香客問我,道長蒲肋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任强胰,我火速辦了婚禮妹沙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘距糖。我一直安慰自己,他們只是感情好恩脂,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布趣斤。 她就那樣靜靜地躺著,像睡著了一般玉凯。 火紅的嫁衣襯著肌膚如雪联贩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天盲厌,我揣著相機與錄音祸泪,去河邊找鬼。 笑死没隘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的微王。 我是一名探鬼主播品嚣,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钧大,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了眶诈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浴骂,失蹤者是張志新(化名)和其女友劉穎宪潮,沒想到半個月后溯警,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狡相,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡尽棕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伊诵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片回官。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浙炼,靈堂內(nèi)的尸體忽然破棺而出唯袄,到底是詐尸還是另有隱情,我是刑警寧澤恋拷,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布蔬顾,位于F島的核電站,受9級特大地震影響诀豁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舷胜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翻伺。 院中可真熱鬧,春花似錦拉宗、人聲如沸辣辫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至单料,卻和暖如春点楼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掠廓。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工蟀瞧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悦污。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像彻坛,于是被迫代替她去往敵國和親踏枣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

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