91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

React中Portals與錯誤邊界處理實現方法

發布時間:2021-07-21 20:34:26 來源:億速云 閱讀:142 作者:chen 欄目:開發技術

這篇文章主要講解了“React中Portals與錯誤邊界處理實現方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“React中Portals與錯誤邊界處理實現方法”吧!

目錄
  • Portals

  • 錯誤邊界處理

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

  • 注意點

Portals

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

比如說,Modal 組件一般默認直接作為 body 的真實結構的子元素渲染出來,那么我們就可以借助 ReactDOM.createPortal(ReactElement, RealDOM container) 創建一個 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 開發者工具,我們可以看到 Modal 組件在虛擬 DOM 樹的結構中依舊在 App 組件下,類名為 app-container 的 div 中

所以,我們可以得出結論:React 組件虛擬 DOM 樹結構與真實 DOM 樹結構可以是不一致的

因而需要注意事件冒泡

  • React 中的事件其實是經過包裝的

  • 它的事件冒泡是根據虛擬 DOM 樹的結構來冒泡的,而不是真實 DOM 樹的冒泡機制

錯誤邊界處理

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

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

使用靜態方法 static getDerivedStateFromError,子組件渲染錯誤時會觸發此函數

  • 靜態方法,所以不能使用 this

  • 此函數返回值 (對象) 會與 state 混合覆蓋狀態

  • 觸發時間點為:渲染子組件發生錯誤后,在更新頁面之前

  • 只有子組件渲染發生錯誤,才會觸發 (即自身組件發生錯誤或其兄弟組件、父組件發生錯誤均不會觸發)

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) 函數

  • 是個實例方法

  • 運行時機在渲染子組件發生錯誤后,且頁面更新之后 (更改狀態會導致組件樹卸載完之后又重新構建組件樹,比較浪費效率)

  • 通常該函數用于往后臺傳遞并記錄錯誤信息

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 起,任何未被錯誤邊界捕獲的錯誤將會導致整個 React 組件樹被卸載。

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

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

注意點

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

自身組件的錯誤

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

import React, {PureComponent} from 'react'

// ErrorBoundary.jsx
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
    }
}

// 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>
    </>
}

感謝各位的閱讀,以上就是“React中Portals與錯誤邊界處理實現方法”的內容了,經過本文的學習后,相信大家對React中Portals與錯誤邊界處理實現方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新余市| 雷山县| 和静县| 府谷县| 正镶白旗| 遂宁市| 稻城县| 大邑县| 武汉市| 德惠市| 独山县| 敖汉旗| 始兴县| 白银市| 宁夏| 宁波市| 丰原市| 雅安市| 临桂县| 韶关市| 德格县| 潞西市| 资溪县| 仲巴县| 金平| 旺苍县| 洛阳市| 普兰县| 唐海县| 贵溪市| 唐山市| 修水县| 阳城县| 文安县| 榕江县| 新晃| 辉南县| 房山区| 永年县| 高陵县| 廉江市|