最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React Hook父組件如何獲取子組件的數(shù)據(jù)/函數(shù)

 更新時(shí)間:2022年09月15日 14:28:03   作者:c_y_yuan  
這篇文章主要介紹了React Hook父組件如何獲取子組件的數(shù)據(jù)/函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

React Hook父組件獲取子組件數(shù)據(jù)/函數(shù)

我們知道在react中,常用props實(shí)現(xiàn)子組件數(shù)據(jù)到父組件的傳遞,但是父組件調(diào)用子組件的功能卻不常用。

文檔上說(shuō)ref其實(shí)不是最佳的選擇,但是想著偷懶不學(xué)redux,在網(wǎng)上找了很多教程,要不就是hook的講的太少,要不就是父子組件傻傻分不清,于是只好再啃了一下文檔,就學(xué)了一下其它hook的api。

在這里我們需要用到useImperativeHandle這個(gè)api,其函數(shù)形式為

useImperativeHandle(ref, createHandle, [deps])

其實(shí)這個(gè)api也是ref的一種形式,但是相當(dāng)于做了一定的優(yōu)化,可以選擇讓子組件只暴露一定的api給父組件,根據(jù)在文檔和其他博客上給出的方法

一共有兩大步驟:

  • 1.將ref傳遞到子組件中
  • 2.需要使用forwardRef對(duì)子組件進(jìn)行包裝

子組件MyWorldMap

?const mapRef = useRef(null);
? ? useImperativeHandle(ref, () => {
?
? ? ? ? return {
? ? ? ? ? ? //clickSwitch是子組件暴露的函數(shù)
? ? ? ? ? ? clickSwitch() {
? ? ? ? ? ? ?
? ? ? ? ? ? ? ? if(type == 1){
? ? ? ? ? ? ? ? ? ? initChinaMap();
? ? ? ? ? ? ? ? ? ? setType(2);
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? initWordMap();
? ? ? ? ? ? ? ? ? ? setType(1);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ??
? ? ? ? ? ? }
? ? ? ? }
? ? })
?
//你的return內(nèi)容,注意ref
?
? ? return(
? ? ? ? <React.Fragment>
?
? ? ? ? ? ? <div id={"myWorldMap"} style={{ width: "800px", height: "400px" }} ?ref={mapRef}></div>
?
? ? ? ? </React.Fragment>
?
?
? ? )
}
?
?
//最后要配合forwardRef
MyWorldMap = forwardRef(MyWorldMap);
export default MyWorldMap;

注:ref是子組件聲明的時(shí)候傳進(jìn)來(lái)的,也就是

function MyWorldMap (props,ref){
//..你的代碼
}
?
//export...

其實(shí)官方文檔給出來(lái)的例子是:

function FancyInput(props, ref) {
? const inputRef = useRef();
? useImperativeHandle(ref, () => ({
? ? focus: () => {
? ? ? inputRef.current.focus();
? ? }
? }));
? return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);

兩種方法都是可以的

父組件MyTrip

const myWordMapRef = useRef();
?
return(
? //省略一些代碼,注意ref
?<MyWorldMap proData = { myMapData} handleMapClick = {handleMapClick.bind(this)} ref={myWordMapRef}>
?
?</MyWorldMap>
<div className={styles["mapButton-wrap"]}>
? ? ? ?<ButtonGroup>
? ? ? ? ? ? ? ?<Button onClick={() => myWordMapRef.current.clickSwitch()}>Switch</Button>
? ? ? ? ? ? ? ?<Button onClick={()=>clickAll() }>All</Button>
? ? ? ? </ButtonGroup>
?</div>
)

現(xiàn)在你就可以在父組件里面通過(guò)myWordMapRef.current.clickSwitch()調(diào)用函數(shù)了

React Hook父組件提交子組件form

父組件

import React, { useState, useEffect, useRef } ?from 'react';
import { Button } from 'antd';
import EditClassA from './EditClassA';
export default (): React.ReactNode => {
?? ?const [isEdit,setIsEdit] = useState<boolean>(false);
?? ?const editClassARef = useRef();
?? ?const handleSave = () => {
?? ??? ?// 調(diào)用子組件的方法
?? ??? ?editClassARef.current.changeVal();
?? ?}
?? ?return (
?? ??? ?<div>
?? ??? ??? ?{!isEdit?(
?? ??? ??? ??? ?<Button style={{marginRight:20}} onClick={()=>setIsEdit(!isEdit)}>編輯</Button>
?? ??? ??? ?):(
?? ??? ??? ??? ?<Button style={{marginRight:20}} onClick={handleSave}>保存</Button>
?? ??? ??? ?)}
?? ??? ?</div>
?? ??? ?<EditClassA isEdit={isEdit} setIsEdit={setIsEdit} ref={editClassARef}/>
?? ?)
}

子組件

import React, { useImperativeHandle, forwardRef } ?from 'react';
import { Form , Input } from 'antd';
import style from '@/pages/BackEnd/style.less';
const EditClassA = forwardRef((props, ref) => {
?? ?// props 里面有父組件的值和方法
?? ?const [form] = Form.useForm();
?? ?useImperativeHandle(ref, () => ({
?? ??? ?changeVal: () => {
?? ??? ??? ?form
?? ??? ??? ?.validateFields()
?? ??? ??? ?.then( values => {
?? ??? ??? ??? ?// 調(diào)用父組件方法,設(shè)置父組件的值
?? ??? ??? ??? ?props.setIsEdit(!props.isEdit)
?? ??? ??? ?})
?? ??? ??? ?.catch(errorInfo => {
?? ??? ??? ??? ?return false
?? ??? ??? ?})
?? ??? ?}
?? ?}));
?? ?return (
?? ?<Form form={form} name="basic" colon={false} >
?? ??? ?<Form.Item
?? ??? ??? ?label="總部名稱"
?? ??? ??? ?name="name"
?? ??? ??? ?initialValue="總部"
?? ??? ??? ?rules={[{required: true,message: '請(qǐng)輸入總部名稱',}]}>
?? ??? ??? ?<Input className={props.isEdit?'':style.disabledInput} placeholder="請(qǐng)輸入" disabled={!props.isEdit}/>
?? ??? ?</Form.Item>
?? ?</Form>
?? ?);
})
export default EditClassA
.disabledInput[disabled]{
? color: rgba(0, 0, 0, 0.85);
? background-color: transparent;
? cursor: default;
? border: unset;
? border-bottom: 1px solid #333;
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • react.js框架Redux基礎(chǔ)案例詳解

    react.js框架Redux基礎(chǔ)案例詳解

    這篇文章主要介紹了react.js框架Redux基礎(chǔ)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • react中useState使用:如何實(shí)現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù)

    react中useState使用:如何實(shí)現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù)

    這篇文章主要介紹了react中useState的使用:如何實(shí)現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解開(kāi)發(fā)react應(yīng)用最好用的腳手架 create-react-app

    詳解開(kāi)發(fā)react應(yīng)用最好用的腳手架 create-react-app

    本篇文章主要介紹了詳解開(kāi)發(fā)react應(yīng)用最好用的腳手架 create-react-app,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • React?Hooks?實(shí)現(xiàn)的中文輸入組件

    React?Hooks?實(shí)現(xiàn)的中文輸入組件

    這篇文章主要為大家介紹了React?Hooks實(shí)現(xiàn)的中文輸入組件示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 在React中如何優(yōu)雅的處理事件響應(yīng)詳解

    在React中如何優(yōu)雅的處理事件響應(yīng)詳解

    這篇文章主要給大家介紹了關(guān)于在React中如何優(yōu)雅處理事件響應(yīng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • 關(guān)于antd tree和父子組件之間的傳值問(wèn)題(react 總結(jié))

    關(guān)于antd tree和父子組件之間的傳值問(wèn)題(react 總結(jié))

    這篇文章主要介紹了關(guān)于antd tree 和父子組件之間的傳值問(wèn)題,是小編給大家總結(jié)的一些react知識(shí)點(diǎn),本文通過(guò)一個(gè)項(xiàng)目需求實(shí)例代碼詳解給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-06-06
  • React 全自動(dòng)數(shù)據(jù)表格組件——BodeGrid的實(shí)現(xiàn)思路

    React 全自動(dòng)數(shù)據(jù)表格組件——BodeGrid的實(shí)現(xiàn)思路

    表格是在后臺(tái)管理系統(tǒng)中用的最頻繁的組件之一,相關(guān)的功能有數(shù)據(jù)的新增和編輯、查詢、排序、分頁(yè)、自定義顯示以及一些操作按鈕。這篇文章主要介紹了React 全自動(dòng)數(shù)據(jù)表格組件——BodeGrid ,需要的朋友可以參考下
    2019-06-06
  • 在react中使用mockjs的方法你知道嗎

    在react中使用mockjs的方法你知道嗎

    這篇文章主要為大家詳細(xì)介紹了在react中使用mockjs的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • React利用路由實(shí)現(xiàn)登錄界面的跳轉(zhuǎn)

    React利用路由實(shí)現(xiàn)登錄界面的跳轉(zhuǎn)

    這篇文章主要介紹了React利用路由實(shí)現(xiàn)登錄界面的跳轉(zhuǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 使用webpack配置react-hot-loader熱加載局部更新

    使用webpack配置react-hot-loader熱加載局部更新

    這篇文章主要介紹了使用webpack配置react-hot-loader熱加載局部更新,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論

丽水市| 渭南市| 古浪县| 上栗县| 阳江市| 江华| 都昌县| 玛多县| 泸西县| 易门县| 湘潭市| 仁怀市| 克东县| 平远县| 资阳市| 黑水县| 个旧市| 绍兴市| 清涧县| 新疆| 麻江县| 南木林县| 永平县| 汉寿县| 凌源市| 瓦房店市| 莫力| 大安市| 托里县| 高台县| 阳西县| 民县| 兰坪| 六盘水市| 宜春市| 太和县| 长治市| 福安市| 桐庐县| 阳原县| 荣昌县|