日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一起学React--组件定义和组件通讯

發(fā)布時(shí)間:2023/12/31 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一起学React--组件定义和组件通讯 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

React主打函數(shù)式編程,配合上JSX語法,基本上可以把每個(gè)模塊都封裝為單獨(dú)組件,用組件一時(shí)爽,一直用一直爽。

1.函數(shù)式組件

在React中最簡單的即是創(chuàng)建一個(gè)函數(shù)式,沒有生命周期的組件,這與 Vue 的單文件 .vue 一個(gè)完整生命周期組件不同,舉個(gè)例子。

// 定義weblcome 組件 function Welcome(props) {return <h1>Hello, {props.name}</h1>; } 復(fù)制代碼

這里的props屬性對(duì)象是React中組件單向數(shù)據(jù)傳遞的唯一標(biāo)示,在函數(shù)式組件中,我們可以通過 props.name 來獲取 其他組件傳遞的name 屬性,這點(diǎn)和Vue是沒有本質(zhì)區(qū)別的。

// 子組件 獲取name屬性 function Welcome(props) {return <h1>Hello, {props.name}</h1>; }// 父組件傳入name屬性 const element = <Welcome name="Sara" />; ReactDOM.render(element,document.getElementById('root') );復(fù)制代碼

2.class 組件

函數(shù)式組件由于沒有生命周期的定義,雖然簡潔,但是拓展方面較差,我們把上面的welcome,改寫為class組件

class Welcome extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;} } 復(fù)制代碼

welcome繼承自React.Component 組基類,在class組件中,作用域?yàn)楫?dāng)前組件,所以使用this對(duì)象來代替。

class組件有完整的生命周期,當(dāng)組件插入到DOM中時(shí),會(huì)依次調(diào)用生命周期函數(shù)。

render() 是class組件中必須實(shí)現(xiàn)的方法 當(dāng)每次render 被觸發(fā)是都會(huì)檢查 this.props 和this.state 的變化、 同理適用于任何class 組件的檢查方式 所以在處理函數(shù)時(shí),要考慮好應(yīng)該在組件生命周期的那一步觸發(fā),反之容易涼涼,或影響性能

3.順滑的組件抽取方式

每個(gè)class組件, 無論單獨(dú)調(diào)用,還是循環(huán)調(diào)用,都有自己的生命周期和單獨(dú)的state。

舉個(gè)實(shí)際場(chǎng)景。 比如:維護(hù)一個(gè)列表,列表中有, 全部,完成,失敗,進(jìn)行中,等狀態(tài)type。 首先想到的是維護(hù)一個(gè)type 數(shù)組,然后通過map 循環(huán)的方式來產(chǎn)生列表 好處是數(shù)據(jù)操作方便,缺點(diǎn)就是和其他 n個(gè)列表公用一個(gè)state ,沒有辦法將其中某個(gè)item的狀態(tài)區(qū)分開來

通過維護(hù)一個(gè)item組件,每個(gè)item都有自己的state,隨心所欲的操作

all in all 每個(gè)通過map 循環(huán)的item, 都可以根據(jù)業(yè)務(wù)考慮封裝為一個(gè)組件,因?yàn)槟愣x的時(shí)候就是一個(gè)變量, 不會(huì)像vue 通過v-for 指令渲染,后期抽離的成本不是很大。

Warning 如果shouldComponentUpdate 返回false 則不會(huì)render

當(dāng)組件的props 或者state 變化時(shí)會(huì)觸發(fā)更新。 會(huì)依次執(zhí)行下面的生命周期

  • static getDerivedStateFromProps()
  • shouldComponentUpdate() // 必要時(shí)來做性能優(yōu)化,在第一期提過
  • render() // 必須要用
  • getSnapshotBeforeUpdate()
  • componentDidUpdate() // 最常用的組件狀態(tài)更新判斷
  • 最比較常用的除了 componentDidMount() 之外,還有 componentDidUpdate() 來判斷組件是否需要更新。

    4.使用propTypes進(jìn)行類型檢查 propsTypes 是React友好的類型檢查,通常和組件搭配使用。

    使用方法非常簡單,上圖

    二、 組件通訊方式 在單向通信中,最常見的就是通過prop方式。

    父 - 子

    子組件定義好item參數(shù) 父組件按照propTyes進(jìn)行傳參 子組件通過 this.props.item 取值

    子 - 父

    // 子組件 HomeItem.defaultProps = {item: {},// 定義回調(diào)函數(shù)fetchData: () => {}, };HomeItem.propTypes = {item: PropTypes.object,fetchData: PropTypes.func, }; 復(fù)制代碼// 在子組件handleSuccessDel = () => {const successUrl = {url: `/xq/statuses/destroy/${this.state.uid}.json`,params: {},};const draftUrl = {url: '/xq/statuses/draft/delete.json',params: { id: this.props.item.textId },};const delUrl = this.props.item.typeName === '草稿' ? draftUrl : successUrl;httpClient.post(delUrl.url, delUrl.params).then((res) => {if (res.success) {this.setState({showModal: false,});Toast({ text: '刪除成功', type: 'success' });// 通過參數(shù)執(zhí)行父組件傳過來的callback 進(jìn)而引起父組件狀態(tài)改變this.props.fetchData();}}).catch((err) => {console.error(err);});}; 復(fù)制代碼

    轉(zhuǎn)載于:https://juejin.im/post/5ca05d176fb9a05e304a8ae6

    總結(jié)

    以上是生活随笔為你收集整理的一起学React--组件定义和组件通讯的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。