一起学React--组件定义和组件通讯
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í)行下面的生命周期
最比較常用的除了 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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CAD看图王如何开启命令面板?CAD看图
- 下一篇: 文件操作模式扩展、游标操作