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

React中Portals與錯誤邊界處理實現(xiàn)

 更新時間:2021年07月21日 16:47:12   作者:suressk  
本文主要介紹了React中Portals與錯誤邊界處理實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Portals

可以說是 插槽,但 不同于 Vue 中的 slot,它指的是將一個 React 元素渲染到指定的容器 (真實 DOM) 中

比如說,Modal 組件一般默認(rèn)直接作為 body 的真實結(jié)構(gòu)的子元素渲染出來,那么我們就可以借助 ReactDOM.createPortal(ReactElement, RealDOM container) 創(chuàng)建一個 React 元素,示例代碼:

import React from 'react'
import ReactDOM from 'react-dom'
import Modal from './components/Modal'

const PortalModal = ReactDOM.createPortal(<Modal />, document.body)

export default function App() {
    return <div className="app-container">
        <PortalModal />
    </div>
}

我們可以在瀏覽器控制臺中看到,真實的 Modal 組件其實是作為 body 的直接子元素渲染出來的,但通過 React 開發(fā)者工具,我們可以看到 Modal 組件在虛擬 DOM 樹的結(jié)構(gòu)中依舊在 App 組件下,類名為 app-container 的 div 中

所以,我們可以得出結(jié)論:React 組件虛擬 DOM 樹結(jié)構(gòu)與真實 DOM 樹結(jié)構(gòu)可以是不一致的

因而需要注意事件冒泡

  • React 中的事件其實是經(jīng)過包裝的
  • 它的事件冒泡是根據(jù)虛擬 DOM 樹的結(jié)構(gòu)來冒泡的,而不是真實 DOM 樹的冒泡機制

錯誤邊界處理

默認(rèn)情況下,若一個組件在渲染期間 (render) 發(fā)生錯誤,那么就會導(dǎo)致整個組件樹全部被卸載
錯誤邊界:就是一個組件,用于捕獲 渲染期間 子組件發(fā)生的錯誤,并有能力阻止錯誤繼續(xù)向父組件傳播

讓某個組件捕獲錯誤 (類組件):

使用靜態(tài)方法 static getDerivedStateFromError,子組件渲染錯誤時會觸發(fā)此函數(shù)

  • 靜態(tài)方法,所以不能使用 this
  • 此函數(shù)返回值 (對象) 會與 state 混合覆蓋狀態(tài)
  • 觸發(fā)時間點為:渲染子組件發(fā)生錯誤后,在更新頁面之前
  • 只有子組件渲染發(fā)生錯誤,才會觸發(fā) (即自身組件發(fā)生錯誤或其兄弟組件、父組件發(fā)生錯誤均不會觸發(fā))
import React, {PureComponent} from 'react'

export default class ErrorBoundary extends PureComponent {
    state = {
        isError: false
    }
    static getDerivedStateFromError(error) {
        console.log('Rendering Error: ', error)
        return {
            isError: true
        }
    }
    render() {
        if (this.isError) {
            return <span>Something Wrong...</span>
        }
        return this.props.children
    }
}

使用 componentDidCatch(error, info) 函數(shù)

  • 是個實例方法
  • 運行時機在渲染子組件發(fā)生錯誤后,且頁面更新之后 (更改狀態(tài)會導(dǎo)致組件樹卸載完之后又重新構(gòu)建組件樹,比較浪費效率)
  • 通常該函數(shù)用于往后臺傳遞并記錄錯誤信息
import React, {PureComponent} from 'react'

export default class ErrorBoundary extends PureComponent {
    state = {
        isError: false
    }
    componentDidCatch(error, info) {
        // info 即為錯誤的摘要信息
        console.log('Rendering Error: ', error)
        console.log('Rendering info: ', info)
        this.setState({
            isError: true
        })
    }
    render() {
        if (this.isError) {
            return <span>Something Wrong...</span>
        }
        return this.props.children
    }
}

如果沒有使用錯誤邊界會怎樣?

自 React 16 起,任何未被錯誤邊界捕獲的錯誤將會導(dǎo)致整個 React 組件樹被卸載。

經(jīng)驗告訴我們,完全移除比保留錯誤UI更好。例如,在類似 Messenger 的產(chǎn)品中,把異常的 UI 展示給用戶可能會導(dǎo)致用戶將信息錯發(fā)給別人。

增加錯誤邊界能夠讓你在應(yīng)用發(fā)生異常時提供更好的用戶體驗。例如,F(xiàn)acebook Messenger 將側(cè)邊欄、信息面板、聊天記錄以及信息輸入框包裝在單獨的錯誤邊界中。如果其中的某些 UI 組件崩潰,其余部分仍然能夠交互。

注意點

某些錯誤,錯誤邊界組件不會捕獲

自身組件的錯誤

異步的錯誤 (如 setTimeout 中拋出的錯誤)

import React, {PureComponent} from 'react'

// ErrorBoundary.jsx
export default class ErrorBoundary extends PureComponent {
    state = {
        isError: false
    }
    /* 此函數(shù)不會運行 */
    static getDerivedStateFromError(error) {
        console.log('Rendering Error: ', error)
        return {
            isError: true
        }
    }
    render() {
        if (this.isError) {
            return <span>Something Wrong...</span>
        }
        return this.props.children
    }
}

// Comp.jsx Comp 組件
export default funtion Comp() {
    setTimeout(() => {
        throw new Error('setTimeout error')
    }, 1000)
    return <div>Comp</div>
}

// App.jsx 使用
export default function App() {
    return <>
        <ErrorBoundary>
            <Comp />
        </ErrorBoundary>
    </>
}

事件中拋出的錯誤

即:僅處理渲染子組件期間的同步錯誤

到此這篇關(guān)于React中Portals與錯誤邊界處理實現(xiàn)的文章就介紹到這了,更多相關(guān)React Portals與錯誤邊界處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 詳解關(guān)于react-redux中的connect用法介紹及原理解析

    詳解關(guān)于react-redux中的connect用法介紹及原理解析

    本篇文章主要介紹了詳解關(guān)于react-redux中的connect用法介紹及原理解析,非常具有實用價值,需要的朋友可以參考下
    2017-09-09
  • 使用react遍歷對象生成dom

    使用react遍歷對象生成dom

    這篇文章主要介紹了使用react遍歷對象生成dom問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用React實現(xiàn)一個簡單的待辦事項列表的示例代碼

    使用React實現(xiàn)一個簡單的待辦事項列表的示例代碼

    這篇文章我們將詳細(xì)講解如何建立一個這樣簡單的列表,文章通過代碼示例介紹的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-08-08
  • React實現(xiàn)虛擬滾動的三種思路詳解

    React實現(xiàn)虛擬滾動的三種思路詳解

    在??web??開發(fā)的過程中,或多或少都會遇到大列表渲染的場景,為了解決大列表造成的渲染壓力,便出現(xiàn)了虛擬滾動技術(shù),本文主要介紹虛擬滾動的三種思路,希望對大家有所幫助
    2024-04-04
  • 利用React高階組件實現(xiàn)一個面包屑導(dǎo)航的示例

    利用React高階組件實現(xiàn)一個面包屑導(dǎo)航的示例

    這篇文章主要介紹了利用React高階組件實現(xiàn)一個面包屑導(dǎo)航的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 淺談React + Webpack 構(gòu)建打包優(yōu)化

    淺談React + Webpack 構(gòu)建打包優(yōu)化

    本篇文章主要介紹了淺談React + Webpack 構(gòu)建打包優(yōu)化,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • React 路由懶加載的幾種實現(xiàn)方案

    React 路由懶加載的幾種實現(xiàn)方案

    這篇文章主要介紹了React 路由懶加載的幾種實現(xiàn)方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • React中的for循環(huán)解讀

    React中的for循環(huán)解讀

    這篇文章主要介紹了React中的for循環(huán)解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • React不能將useMemo設(shè)置為默認(rèn)方法原因詳解

    React不能將useMemo設(shè)置為默認(rèn)方法原因詳解

    這篇文章主要為大家介紹了React不能將useMemo設(shè)置為默認(rèn)方法原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-07-07
  • 解決React報錯`value` prop on `input` should not be null

    解決React報錯`value` prop on `input` should&

    這篇文章主要為大家介紹了React報錯`value` prop on `input` should not be null解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評論

西平县| 元谋县| 佛学| 方山县| 德惠市| 临泽县| 白朗县| 吴川市| 岳池县| 民勤县| 玉山县| 诸暨市| 泗洪县| 阿城市| 东兰县| 广西| 石柱| 缙云县| 新巴尔虎右旗| 洱源县| 永康市| 湟源县| 大丰市| 辽阳市| 田东县| 洞头县| 宜宾县| 和平区| 泰顺县| 济南市| 寿宁县| 通江县| 清河县| 辽宁省| 宁河县| 常熟市| 兴海县| 班玛县| 新邵县| 宁远县| 福州市|