Использование границ лени, приостановки и ошибок в React
lazy
lazy
даreact
Возможности предоставленных компонентов ленивы, и в чиновке нет поддержкиlazy
раньше, вreact
Обычно мы используемreact-loadable
Чтобы добиться возможности ленивой загрузки компонентов, но,lazy
Он не поддерживает рендеринг на стороне сервера (SSR
), поэтому в случае использования ssrlazy
Временно недоступен
React.lazy
Принимает функцию, которая вызывается внутриimport()
Динамический импорт. он должен вернутьPromise
,ДолженPromise
нужноresolve
Одинdefalut export
изReact
компоненты.
Как его использовать, смотрите в примере ниже
import React, { lazy } from 'react'
const AppTitle = lazy(() => import('./title'))
class App extends React.Component {
render () {
return (
<AppTitle></AppTitle>
)
}
}
export default App
Когда мы запустили этот код, мы обнаружили, что программа сообщила об ошибке
Error: A React component suspended while rendering, but no fallback UI was specified.
Add a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.
in Unknown (at lazy/index.jsx:8)
in App (at src/index.js:7)
На этот раз вам нужноreact
Встроенные компонентыSuspense
Suspense
fallback
атрибут, который может поддерживать передачу в разделеjsx
или экземпляр компонента, например<Loading></Loading>
import React, { lazy, Suspense } from 'react'
const AppTitle = lazy(() => import('./title.jsx'))
class App extends React.Component {
render () {
return (
<Suspense fallback={<div>Loading</div>}>
<AppTitle></AppTitle>
</Suspense>
)
}
}
export default App
когда мы используемlazy
После этого мы можем открытьchrome
изnetwork
затем выберитеjs
Для наблюдения за инициированным запросом мы обнаружили, что на этот раз появится1.chunk.js
который начинается с числаjs
Файл, на самом деле каждый.js
Это соответствует каждому из наших компонентов, когда нам нужно указать каждый упакованный асинхронный компонент.js
имя файла, нам просто нужноimport()
добавлено в функцию/* webpackChunkName: "title" */
В этом комментарии webpack будет автоматически использовать имя, которое мы указываем в качестве имени файла при упаковке.
import React, { lazy, Suspense } from 'react'
const AppTitle = lazy(
() => import(/* webpackChunkName: "title" */'./title.jsx')
)
class App extends React.Component {
render () {
return (
<Suspense fallback={<div>Loading</div>}>
<AppTitle></AppTitle>
</Suspense>
)
}
}
export default App
Если при асинхронной загрузке компонента загрузкаjs
файл, сетевая ошибка, невозможно загрузитьjs
файл, затемreact
Это покажет, что это
Error: Loading chunk 3 failed.
(error: http://192.168.4.183:3000/static/js/title.chunk.js)
很明显,Suspense
не может обработать это состояние ошибки, вreact
Есть граница ошибки(Error Boundaries)
концепция, используемая для решения этой проблемы, это использованиеreact
жизненный циклcomponetDidCatch
метод обработки
Есть два пути, один из них — жизненный циклcomponentDidCatch
Для обработки ошибок также существует статический методstatic getDerivedStateFromError
обрабатывать ошибки,
Официальный сайт рекомендуется
Используйте static getDerivedStateFromError() для отображения альтернативного пользовательского интерфейса и используйте componentDidCatch() для печати сообщений об ошибках.
import React, { lazy, Suspense } from 'react'
const AppTitle = lazy(
() => import(/* webpackChunkName: "title" */'./title.jsx')
)
class App extends React.Component {
state = {
isError: false
}
static getDerivedStateFromError(error) {
return { isError: true };
}
componentDidCatch (err, info) {
console.log(err, info)
}
render () {
if (this.state.isError) {
return (<div>error</div>)
}
return (
<div>
<Suspense fallback={<div>Loading</div>}>
<AppTitle></AppTitle>
</Suspense>
</div>
)
}
}
export default App
Примечание: используйтеcreate-react-app
Проект, созданный в среде разработки, даже если он используетсяcomponentDidCatch
илиgetDerivedStateFromError
, ошибка все равно будет выдаваться, вbuild
react 16
React
UI
Ссылаться на:
кодовый адрес
реагировать на другую документацию
- Использование контекста в React)
- Использование оптимизации производительности, памятки, PureComponent, shouldComponentUpdate в React
Если это поможет вам, как это точка