当前位置: 首页 > Web前端 > HTML

React组件间通信方式总结(下)

时间:2023-03-28 00:08:28 HTML

1.鐢╮eact鍐欎竴涓椂閽熷啓涓€涓彲浠ユ瘡绉掓洿鏂扮殑鏃堕挓}//瀵硅薄浣滀负React瀛愬璞℃棤鏁堬紙鍙戠幇鏃堕棿锛?019骞?鏈?鏃ユ槦鏈熸棩20:34:51GMT+0800锛堜腑鍥芥爣鍑嗘椂闂达級锛夈€傚鏋滄偍鎵撶畻娓叉煋瀛愰泦鍚堬紝璇锋敼鐢ㄦ暟缁勩€?/newDate()鏄竴涓璞℃暟鎹被鍨嬬殑鍊硷紝React鍏冪礌涓嶆帴鍙楀璞′綔涓轰粬浠殑瀛╁瓙ReactDOM.render(ele,document.querySelector('#root'))}tick()setInterval(tick,1000)//濡傛灉涓嶅寘瑁瑰湪鍑芥暟涓紝鏃堕挓涓嶄細姣忕鏇存柊涓€娆★紝浣嗘槸React鍜孷ue閮芥槸鏁版嵁椹卞姩鐨勶紝浣嗘槸杩欐鍜屾暟鎹┍鍔ㄦ棤鍏筹紝姣?绉掗噸鏂板垱寤轰竴涓猠le锛岀劧鍚庡憟鐜板埌椤甸潰锛岃鍥惧彂鐢熷彉鍖栵紱涓轰簡浣跨敤鏁版嵁椹卞姩锛屾垜浠渶瑕佷娇鐢≧eact缁勪欢2.React缁勪欢React缁勪欢涓紝jsx鍏冪礌锛堜篃鍙玶eact鍏冪礌锛夋槸react涓粍浠剁殑鍩烘湰缁勪欢锛屽畾涔夌粍浠舵湁涓ょ鏂瑰紡锛氬嚱鏁帮紙function锛夊畾涔夌粍浠剁被锛坈lass锛夊畾涔夌粍浠跺畾涔夌粍浠惰姹傦細缁勪欢鍚嶇О棣栧瓧姣嶅繀椤诲ぇ鍐欙紝浠ヤ究鍐檍sx鏃跺尯鍒嗗師鐢焗tml鏍囩缁勪欢瀹氫箟濂藉悗锛屽彲浠ヤ綔涓轰竴涓爣绛句娇鐢ㄥ湪jsx璇硶涓娇鐢ㄣ€傚鏋滀娇鐢ㄥ嚱鏁板畾涔夌粍浠讹紝鍒欏繀椤昏繑鍥炰竴涓猨sx鍏冪礌銆?.1React鐨勫嚱鏁扮粍浠秗eact浣跨敤鍑芥暟瀹氫箟缁勪欢灏辨槸澹版槑涓€涓嚱鏁帮紱璇ュ嚱鏁版帴鏀朵竴涓猵rops鍙傛暟锛沺rops鏄竴涓璞★紝鏄覆鏌撴垨閫氳繃鐖剁粍浠?Property)浼犻€掔殑鏁版嵁锛涘嚱鏁拌繑鍥炰竴涓猨sx鍏冪礌锛岀粍浠朵腑闇€瑕佺殑鏁版嵁鍙互閫氳繃props浼犲叆锛?/1.鍑芥暟瀹氫箟缁勪欢鍑芥暟Welcome(props){//props鏄竴涓璞★紝鐢变娇鐢ㄧ粍浠舵椂鍐欏湪缁勪欢琛屼腑鐨勫睘鎬у拰灞炴€у€肩粍鎴愶紱锛沜onsole.log(data)杩斿洖(

{props.data.name};{props.data.age}

{props.x}

)}ReactDOM.render(,document.querySelector('#root'));ReactDOM.render()浼氭墽琛屼笉鍚岀殑鎿嶄綔鏍规嵁绗竴涓弬鏁扮殑绫诲瀷锛涘鏋滄槸缁勪欢锛屽湪鎵цrender鏃讹紝灏嗗綋鍓嶇粍浠剁殑鍐呰仈灞炴€ф墦鍖呭皝瑁呮垚涓€涓璞★紝灏嗚瀵硅薄浼犻€掔粰缁勪欢鍑芥暟锛屾墽琛岀粍浠跺嚱鏁拌幏鍙栧搴旂殑铏氭嫙DOM瀵硅薄锛屽皢铏氭嫙DOM杞崲涓虹湡瀹濪OM瀵硅薄锛屾彃鍏ュ埌鐪熷疄DOM涓?.2React绫荤粍浠堕€氳繃class瀹氫箟缁勪欢閫氳繃class瀹氫箟缁勪欢锛岄渶瑕佸湪React涓婄户鎵緾omponent銆傝繖涓被鍦ㄥ畾涔夌殑缁勪欢鍘熷瀷涓婂繀椤绘湁涓€涓猺ender鍑芥暟锛宺ender鍑芥暟闇€瑕佽繑鍥炰竴涓《灞傜殑jsx鍏冪礌鈥斺€旂湅馃尠classHeaderextendsComponent{constructor(){super()}render(){//鍦╮ender鍑芥暟涓€氳繃this.props璁块棶propsreturn(
{this.props.content}
)}}classHelloextendsComponent{constructor(props){super()//娉ㄦ剰this.props涓嶈兘鏄湪鏋勯€犲嚱鏁颁腑璁块棶锛宲rops浼氫綔涓哄舰鍙備紶鍏render(){return(

{this.props.data.toLocaleString()}

)}}//浣跨敤璇ョ粍浠禦eactDOM.render(,document.getElementById('root'));ReactDOM.render()娓叉煋绫诲0鏄庣殑缁勪欢鐨勮繃绋嬶細鎵惧埌缁勪欢瀵瑰簲鐨勭被锛岀劧鍚巒ewthisClass锛屽緱鍒拌繖涓被鐨勪竴涓疄渚嬶紝閫氳繃瀹炰緥鎵惧埌褰撳墠绫诲師鍨嬩笂鐨剅ender鍑芥暟锛岃render鎵ц骞舵帴鏀跺畠杩斿洖鐨勮櫄鎷烡OM锛屽皢涓婁竴姝ョ殑铏氭嫙DOM杞寲涓虹湡瀹炵殑DOM,骞舵彃鍏ュ埌椤甸潰涓?.3绫诲拰鍑芥暟瀹氫箟鐨勭粍浠舵湁浠€涔堝尯鍒玆eact涔熸槸鏁版嵁椹卞姩鐨勶紝褰撴暟鎹彂鐢熷彉鍖栨椂锛岃鍥句細鑷姩鍙戠敓鍙樺寲锛堣鍥炬槸鏁版嵁鐨勪竴涓槧灏勶級銆傜粍浠朵腑鏈変袱涓暟鎹潵婧愶細props鍜宻tate锛屽叾涓璸rops鏄粍浠朵娇鐢ㄦ椂鏀跺埌鐨刬nline灞炴€э紝鏄粠澶栭儴浼犲叆鐨勬暟鎹紝state鏄粍浠剁殑绉佹湁鏁版嵁锛岄渶瑕佸湪瀹氫箟缁勪欢鏃跺垱寤猴紱绫诲畾涔夌粍浠朵腑鏈塼his銆乻tate銆乴ifecyclehook锛岃€宖unction澹版槑鐨勭粍浠跺彧鏈塸rops锛?.鏁版嵁鏄犲皠瑙嗗浘3.1灞炴€э紙props锛夋槧灏勮鍥惧睘鎬э紙prop锛変篃鏄粍浠剁殑鏁版嵁锛岃鍥炬槸鏁版嵁鐨勬槧灏勶紝褰撴暟鎹彂鐢熷彉鍖栨椂锛岀粍浠朵細鑷姩閲嶆柊娓叉煋鈥斺€旇馃尠functionWelcome(props){return
{props.time.toLocaleString()}
}setInterval(()=>{//姣忎竴绉抧ewDate鐨勫€奸兘浼氬彉鍖栵紝鍗砏elcome鐨勬椂闂磒rop灞炴€т細鍙樺寲,瑙嗗浘浼氳嚜鍔ㄦ敼鍙榣etnow=newDate()ReactDOM.render(,document.querySelector('#root'))},1000)-鐪嬸煂伴€氳繃灞炴€х粰鍒嗙粍浼犳暟鎹紝璇︾粏绛旈鍔熻兘鍙傝€冨墠绔珮绾ч潰璇曢User(props){console.log(props)璁﹞name,age}=props;return

{name}

{age}

}letdata={name:'mabin',age:18}//ReactDOM.render(<鐢ㄦ埛鍚?{data.name}age={data.age}/>,document.getElementById('root'))ReactDOM.render(,document.getElementById('root'))//鍙互浣跨敤灞曞紑杩愮畻绗﹀皢涓€涓璞′紶閫掔粰缁勪欢鐨刾rops锛岀浉褰撲簬涓婇潰鐨勫啓娉?.2鐘舵€侊紙state锛夋槧灏勮鍥緍eact缁勪欢鏁版嵁鏈変袱绉嶆潵婧愶細props鍜宻tate灞炴€э紙props锛夛細鏄埗缁勪欢浼犻€掕繃鏉ョ殑鐘舵€侊紙state锛夛細鏄粍浠惰嚜宸辨帶鍒剁殑鐘舵€侊紝state鏄粍浠剁殑绉佹湁鏁版嵁銆?.2.1浣跨敤state濡傛灉鍦≧eact涓娇鐢╯tate锛屽垯蹇呴』浣跨敤绫诲垱寤虹粍浠讹紱鍦ㄦ瀯閫犲嚱鏁颁腑鍒濆鍖栦竴涓姸鎬侊紱閫氳繃灏嗗璞″垎閰嶇粰this.state杩涜鍒濆鍖栵紱鐘舵€佷腑鐨勬暟鎹笉鑳界洿鎺ヤ慨鏀广€傚鏋滆鏇存柊鏁版嵁锛岄渶瑕佽皟鐢╯etState鏂规硶锛屼細鍚堝苟銆俿etState鏈変袱绉嶅啓娉曪紝涓€绉嶆槸瀵硅薄鍐欐硶锛屽彟涓€绉嶆槸鍑芥暟鍐欐硶銆傚鏋滀笅涓€涓姸鎬佷緷璧栦簬涓婁竴涓姸鎬侊紝鎴戜滑闇€瑕佷娇鐢ㄥ嚱鏁扮殑褰㈠紡鍑芥暟锛歵his.setState((prevState)=>{})瀵硅薄锛歵his.setState({num:5})鐘舵€佹敼鍙樺苟瑙﹀彂娓叉煋鍑芥暟鏇存柊DOM3.2.2缁戝畾浜嬩欢閲嶆柊鍙嶅簲act缁戝畾浜嬩欢鏃讹紝闇€瑕佷娇鐢ㄩ┘宄颁簨浠剁殑浜嬩欢鍚峯nClick={浜嬩欢澶勭悊鍑芥暟}瀹氫箟浜嬩欢鍑芥暟鏃讹紝涓€鑸湪鍘熷瀷涓婂0鏄庝簨浠跺嚱鏁帮紝缁戝畾浜嬩欢鏃讹紝閫氳繃璁块棶杩欎釜浜嬩欢鍑芥暟this.add渚嬪瓙锛氭垜浠啓涓€涓鏁板櫒鏉ヤ綋楠孯eact鐨勬暟鎹┍鍔ㄧ被CountextendsComponent{constructor(){super()//鍦ㄦ瀯閫犲嚱鏁颁腑鍒濆鍖栦竴涓猻tate;閫氳繃灏嗗璞″垎閰嶇粰this.state杩涜鍒濆鍖栵紱//鍙娇鐢ㄧ被鍙湁澹版槑鐨勭粍浠舵墠鏈夌姸鎬乼his.state={num:1,x:2}//this.add=this.add.bind(this)}add=()=>{//濡傛灉浣犳兂淇敼react涓殑state鍙兘閫氳繃this.setState()鏂规硶鏉ヤ慨鏀?/setState鏂规硶浼氱粨鍚堛€俿etState鏈変袱绉嶅啓娉曪紝涓€绉嶆槸瀵硅薄锛屼竴绉嶆槸鍑芥暟//1.setState鍙互鎺ュ彈涓€涓洖璋冿紝鍥炶皟闇€瑕佽繑鍥炰竴涓柊鐨勭姸鎬佸璞★紝杩欎釜鏂扮殑瀵硅薄鍙渶瑕佸寘鍚睘鎬у嵆鍙淇敼銆傛瘮濡傝繖閲屾垜浠淇敼num锛岃繑鍥炲璞″彧闇€瑕佸寘鍚玭um涓嶅寘鍚玿锛宺eact浼氳嚜鍔ㄥ悎骞?/濡傛灉涓嬩竴涓姸鎬佷緷璧栦簬涓婁竴涓姸鎬侊紝鎴戜滑闇€瑕佷娇鐢ㄥ嚱鏁?*鐨勫舰寮弔his.setState((prevState)=>{console.log(prevState);//prevState涔嬪墠鐨勭姸鎬佸璞eturn{num:prevState.num+1}})*///2.setState涔熸槸鍙互鎺ュ彈鐨勫璞″寘鍚鏇存柊鐨勭姸鎬佸睘鎬э紱this.setState({num:this.state.num+1})//鎴戜滑鍙戠幇鎴戜滑鏇存柊鏁版嵁鍚庯紝椤甸潰涓娇鐢╪um鐨勫湴鏂圭殑鍊艰嚜鍔ㄨ窡鐫€鏀瑰彉浜嗭紱//react涔熸槸鏁版嵁椹卞姩鐨勶紝褰撴垜浠皟鐢╯etState淇敼state锛宺eact浼氶噸鏂拌皟鐢╮ender鍑芥暟鑾峰彇铏氭嫙DOM鐒跺悗璋冪敤DOM-diff绠楁硶閲嶆柊娓叉煋淇敼閮ㄥ垎锛泒render(){//react缁戝畾浜嬩欢鏃堕渶瑕佷娇鐢ㄩ┘宄颁簨浠跺悕onClick={Eventhandlerfunction}//瀹氫箟浜嬩欢鍑芥暟鏃讹紝涓€鑸湪鍘熷瀷涓婂0鏄庝簨浠跺嚱鏁帮紝褰撶粦瀹氫竴涓簨浠讹紝閫氳繃this.addreturn(

NUM:{this.state.num}

X:{this.state.x}

add1tonum
)}}ReactDOM.render(,document.getElementById('root'))4.灞炴€э紙props锛夐獙璇丷eact鐨刾rops鍜孷ue鐨刾rops涓€鏍凤紝涔熸敮鎸侀獙璇侊紱React鐨刾rops楠岃瘉闇€瑕佷笁鏂瑰簱prop-types4.1瀹夎prop-typesyarnaddprop-types--save4.2瑕佷娇鐢ㄧ被鍨嬮獙璇侊紝闇€瑕佸湪绫讳腑鍒涘缓缁勪欢鏃跺垱寤洪潤鎬佸睘鎬ropTypes銆傚€兼槸涓€涓璞★紝瀵硅薄鐨勫睘鎬у氨鏄渶瑕佹牎楠岀殑灞炴€с€傝鍊煎搴擵alidationrules锛涚湅绫诲瀷楠岃瘉馃尠staticpropTypes={name:PropType.string.isRequired,//瑕佹眰name涓哄瓧绗︿覆绫诲瀷isRequired琛ㄧず蹇呴』閫氳繃age:PropType.number.isRequired//瑕佹眰age涓烘暟瀛楃被鍨嬶紝isRequired琛ㄧずRequired鍙﹀锛屼綘杩樺彲浠ヤ负prop璁剧疆榛樿鍊硷紝涔熸槸閫氳繃绫荤殑闈欐€佸睘鎬ф潵璁剧疆鐨勩€傚垱寤虹粍浠舵椂闇€瑕侀厤缃甦efaultProps闈欐€佸睘鎬э紱璇ュ睘鎬х殑鍊兼槸涓€涓璞★紝瀵硅薄涓殑灞炴€ф槸璁剧疆prop鐨勯粯璁ゅ€硷紝鍊间负prop鐨勯粯璁ゅ€約taticdefaultProps={name:'MountEverest',age:10}Complete馃尠importReact,{Component}from'react'importReactDOMfrom'react-dom'importPropTypefrom'prop-types'//React鐨刾rops涔熷彲浠ラ獙璇侊紝浣嗘槸闇€瑕佺涓夋柟Libraryprop-typesclassUserextendsComponent{constructor(props){super()console.log(props)//瀵硅薄锛屽皢鍐呰仈灞炴€у皝瑁呭埌涓€涓璞′腑//props.name=123//濡傛灉瑕佷慨鏀筽rops锛屽畠鍙互鍦ㄦ瀯閫犲嚱鏁颁腑淇敼}staticpropTypes={name:PropType.string.isRequired,//瑕佹眰name涓哄瓧绗︿覆绫诲瀷isRequired琛ㄧず蹇呴』閫氳繃age:PropType.number.isRequired//瑕佹眰age涓烘暟瀛楃被鍨?isRequiredmeansmustpass}//璁剧疆props鐨勯粯璁ゅ€約taticdefaultProps={name:'浜笢',age:19}render(){return(

{this.props.name}}

{this.props.age}

)}}letobj={name:'寮犱笁',age:18};ReactDOM.render(,document.querySelector('#root'));5.鐖跺瓙缁勪欢閫氫俊5.1Parent-to-child鍦≧eact涓紝鐖剁粍浠跺悜瀛愮粍浠朵紶閫掓暟鎹紝浠嶇劧鏄€氳繃props锛?鍙傝馃尠importReact,{Component}from'react'importReactDOMfrom'react-dom'classHeaderextendsComponent{render(){return(

{this.props.data}

)澶嶅埗浠g爜}}//姝ゆ椂Panel涓虹埗缁勪欢锛孒eader涓哄瓙缁勪欢銆傜埗瀛愮粍浠堕€氫俊鏃讹紝parent浼犻€抍hild锛屼緷鐒舵槸閫氳繃props浼犻€掔殑class銆侾anelextendsComponent{render(){return(

{this.props.news}

)}}letdata={news:'椹笂涓嬭',min:'鎷栧嚑鍒嗛挓'}ReactDOM.render(,document.getElementById('root'))淇敼鐖剁粍浠剁殑鏁版嵁銆傜埗缁勪欢鍦ㄤ娇鐢ㄥ瓙缁勪欢鏃讹紝浼氫紶閫抪rops缁欏瓙缁勪欢锛岀敤鏉ヤ慨鏀圭埗缁勪欢鐨勬柟娉曘€傚綋瀛愮粍浠堕渶瑕佷慨鏀圭埗缁勪欢鐨勬暟鎹椂锛岄€氳繃this.props鎵惧埌杩欎釜鏂规硶锛屽苟鎵ц瀵瑰簲鐨勬柟娉曘€傛柟娉?鍙傝馃尠importReact,{Component}from'react'importReactDOMfrom'react-dom'import'bootstrap/dist/css/bootstrap.css'classPanelextendsComponent{staticdefaultProps={a:1}constructor(){瓒呯骇锛堬級杩欎釜銆傜姸鎬?{棰滆壊锛?鎴愬姛'}}changeColor=(color)=>{this.setState({color})}render(){return({this.props.head}
{this.props.body}
{/*閫氳繃modifyColorthisprops灏哖anel缁勪欢鐨刢hangeColor鏂规硶浼犻€掔粰Footer缁勪欢*/}
)}}classFooterextendsComponent{change=()=>{this.props.modifyColor('danger')}render(){return(棰滆壊鍙樺寲)}}ReactDOM.render(,document.getElementById('root'))//React涔熸槸鍗曞悜鏁版嵁娴侊紝鍗虫暟鎹彧鑳戒粠鐖剁粍浠舵祦鍚戝瓙缁勪欢//鎵€浠ュ鏋滃瓙缁勪欢瑕佷慨鏀圭埗缁勪欢鐨勬暟鎹紝褰撶埗缁勪欢浣跨敤瀛愮粍浠舵椂锛屼紶閫抪rops缁欏瓙缁勪欢淇敼鐖剁粍浠剁殑鏂规硶锛屽綋瀛愮粍浠堕渶瑕佷慨鏀圭埗缁勪欢鐨勬暟鎹椂锛岄€氳繃鎵惧埌杩欎釜鏂规硶this.props骞舵墽琛岀浉搴旂殑鏂规硶銆?/p>