• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    React優化子組件render的使用

    來源:懂視網 責編:小采 時間:2020-11-27 21:57:14
    文檔

    React優化子組件render的使用

    React優化子組件render的使用:在react中,父組件的重新render會引發子組件的重新render,但是一些情況下我們會覺得這樣做有些多余,比如: 父組件并未傳遞props給子組件 新傳遞的props渲染結果不變 class A extends React.Component { render() { console
    推薦度:
    導讀React優化子組件render的使用:在react中,父組件的重新render會引發子組件的重新render,但是一些情況下我們會覺得這樣做有些多余,比如: 父組件并未傳遞props給子組件 新傳遞的props渲染結果不變 class A extends React.Component { render() { console

    在react中,父組件的重新render會引發子組件的重新render,但是一些情況下我們會覺得這樣做有些多余,比如:

    1. 父組件并未傳遞props給子組件
    2. 新傳遞的props渲染結果不變
    class A extends React.Component {
     render() {
     console.log('render')
     return <div>這是A組件</div>
     }
    }
    
    class Main extends React.Component {
     render() {
     return (
     <div>
     // 點擊button會讓A不斷調用render
     <button onClick={() => this.setState({ a: 1 })}>Main</button>
     <A />
     </div>
     )
     }
    }

    為了解決這個問題,需要分為ES6類組件和函數式組件兩種:

    類組件

    使用shouldComponentUpdate來對props和state進行判斷以此決定是否進行render

    class A extends React.Component {
     shouldComponentUpdate(nextProps, nextState) {
     //兩次props對比
     return nextProps.a === this.props.a ? false : true
     }
     render() {
     console.log('render')
     return <div>這是A組件</div>
     }
    }
    
    class Main extends React.Component {
     // ...
     render() {
     return (
     <div>
     <button onClick={() => this.setState({ a: 1 })}>Main</button>
     <A a={this.state.a} />
     </div>
     )
     }
    }

    通過返回false來跳過這次更新

    使用React.PureComponent,它與React.Component區別在于它已經內置了shouldComponentUpdate來對props和state進行淺對比,并跳過更新

    //PureComponent
    class A extends React.PureComponent {
     render() {
     console.log('render')
     return <div>這是A組件</div>
     }
    }
    
    class Main extends React.Component {
     state = {
     a: 1
     }
     render() {
     return (
     <div>
     <button onClick={() => this.setState({ a: 1 })}>Main</button>
     <A a={this.state.a} />
     </div>
     )
     }
    }

    函數組件

    使用高階組件React.memo來包裹函數式組件,它和類組件的PureComponent類似,也是對對props進行淺比較決定是否更新

    const A = props => {
     console.log('render A')
     return <div>這是A組件</div>
    }
    // React.memo包裹A
    const B = React.memo(A)
    
    const Main = props => {
     const [a, setA] = useState(1)
     console.log('render Main')
    
     return (
     <div>
     // 通過setA(a + 1)讓父組件重新render
     <button onClick={() => setA(a + 1)}>Main</button>
     // 一直傳入相同的props不會讓子組件重新render
     <B a={1} />
     </div>
     )
    }

    它的第二個參數接受一個兩次props作為參數的函數,返回true則禁止子組件更新

    其他

    上面提到的淺比較就是根據內存地址判斷是否相同:

    // extends React.Component
    class A extends React.Component {
     render() {
     console.log('render A')
     console.log(this.props)
     return <div>這是組件A</div>
     }
    }
    
    class Main extends React.Component {
     test = [1, 2, 3]
     render() {
     console.log('render Main')
     return (
     <div>
     <button
     onClick={() => {
     // 父組件render
     this.setState({})
     this.test.push(4)
     }}
     >
     Main
     </button>
     <A test={this.test} />
     </div>
     )
     }
    }

    結果是:

    使用React.component:


    使用React.PureComponent:

    使用React.component,點擊之后子組件重新render。改為React.PureComponent之后,點擊button子組件并不會render。也因此,PureComponent根據前后內存地址判斷是否相等,所以向子組件傳遞函數作為props時,使用內聯箭頭函數的形式將會導致子組件的重新render;所以可以用箭頭函數作為成員變量的形式再將函數引用作為props傳遞。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    React優化子組件render的使用

    React優化子組件render的使用:在react中,父組件的重新render會引發子組件的重新render,但是一些情況下我們會覺得這樣做有些多余,比如: 父組件并未傳遞props給子組件 新傳遞的props渲染結果不變 class A extends React.Component { render() { console
    推薦度:
    標簽: 優化 React render
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久国产精品一区二区| 99精品人妻少妇一区二区| 国产精品成人va在线观看| 麻豆国产高清精品国在线| 国产精品哟女在线观看| 国产精品区免费视频| 亚洲国产精品人人做人人爽| 日韩精品免费在线视频| 国产精品禁18久久久夂久| 在线观看国产精品日韩av| 精品久久久久久国产三级| 国内精品在线视频| 婷婷久久精品国产| 国产A级毛片久久久精品毛片 | 惠民福利中文字幕人妻无码乱精品| 99久久er这里只有精品18| 无码精品久久久久久人妻中字| 久久夜色撩人精品国产小说| 国产伦精品一区二区免费| 成人精品一区二区久久| 久久精品国产亚洲欧美| 国产精品国产三级专区第1集| 久久精品国产亚洲av麻豆色欲| 亚洲精品字幕在线观看| 一本之道av不卡精品| 日韩精品无码永久免费网站 | 2021国产三级精品三级在专区| 999国内精品永久免费视频| 久久精品国产99久久无毒不卡| 亚洲国产成人精品无码区在线观看| 久久久久亚洲精品男人的天堂| 国产三级精品三级| 国产欧美精品一区二区色综合| 国产精品无码一区二区在线观一 | 呦交小u女国产精品视频| 香蕉国产精品麻豆亚洲欧美日韩精品自拍欧美v国 | 国内精品久久久久久久影视麻豆 | 欧美在线精品永久免费播放| 欧美激情精品久久久久久久| 欧美精品人人做人人爱视频| 日产国产精品亚洲系列|