Reaccionar perezoso? Pero, 驴y si no tienes un componente?

Este c贸digo de divisi贸n, honestamente, ya est谩 un poco cansado. Todos caminamos y caminamos en c铆rculos, y este es el principal problema.

La divisi贸n de c贸digo comenz贸 como separaci贸n en el nivel de M贸dulo y termin贸 como separaci贸n en el nivel de Componente.

Y el problema aqu铆 est谩 exclusivamente en la cabeza: React.lazy es bueno, pero la importaci贸n no ha desaparecido ... Entonces, 驴por qu茅 el c贸digo se divide solo sobre los componentes?

React.lazy, React-Loadable, Loadable-Components, Imported-component: en el mundo hay muchas bibliotecas que envuelven la carga del m贸dulo en algo de az煤car, solo para procesar un poco m谩s f谩cil de usar y cargarlo. El c贸digo m铆nimo para el cargador as铆ncrono.

const loadable = (loaderFunction) => class AsyncComponent extends React.Component { state = { ResultComponent: null, error: false, }; componentWillMount() { loaderFunction .then(result => this.setState({ ResultComponent: result.default || result})) // "es6" default export .catch(() => this.setState({ error: true }); } render() { const { error, ResultComponent } = this.state; // Display loaded component return ResultComponent ? <ResultComponent {...this.props}/> : (error ? <ErrorComponent /> : <LoadingComponent />) } } 

Suspense y React.lazy son solo otra forma de trabajar con el estado. Nada mas.

Pero, 驴y si no tienes un componente?


Parece que no hay problema con esto: importar ("someStuff"). Luego ('continuar') . Pero aqu铆 nuevamente comienzan las preguntas sobre c贸mo colocarlo correctamente en el ciclo de vida de React, qu茅 hacer, si la promesa se resolvi贸 despu茅s de la muerte del componente, y as铆 sucesivamente. Y todos en la cabeza son un componente.

Realic茅 una mini encuesta: NADIE usa esta versi贸n m谩s antigua de divisi贸n de c贸digo. No sabe c贸mo comerlo en condiciones modernas. Y en general, todo es malo.
Hay una soluci贸n, y nuevamente en 4 l铆neas - renderProps

Todo es muy simple, a pesar de que el objeto de la divisi贸n del c贸digo no es el Componente sino el M贸dulo, el Componente seguir谩 siendo el lugar de la operaci贸n.

 const loadableModule = (loaderFunction) => class AsyncComponent extends React.Component { state = { ResultComponent: null, error: false, }; componentWillMount() { loaderFunction .then(result => this.setState({ module: result.default || result})) // "es6" default export .catch(() => this.setState({ error: true }); } render() { const { error, module } = this.state; return module // pass it as a render prop! ? this.props.children(module) // pass it as a render prop! : (error ? <ErrorComponent /> : <LoadingComponent />) } } 

El mismo patr贸n, solo gir贸 en la direcci贸n de cargar el c贸digo y "proporcionar" este c贸digo como renderProps.

Funciona fuera de la caja:


  • componentes cargables ( loadable.lib )

     import loadable from '@loadable/component' const Moment = loadable.lib(() => import('moment')) function FromNow({ date }) { return ( <div> <Moment fallback={date.toLocaleDateString()}> {({ default: moment }) => moment(date).fromNow()} </Moment> </div> ) } 
  • reaccionar-lodable ( react-loadable-library )

     import {importedLibraryDefault} from 'react-loadable-library'; const Moment = importedLibraryDefault( () => import('momentjs')); <Moment> { (momentjs) => <span> {momentjs(date).format(FORMAT)}</span> } </Moment> 
  • reaccionar-importado-componente ( reaccionar-importado-biblioteca )

     //    react-loadable-library,   Suspense 

Barato y muy enojado. Esto me permiti贸 reducir un 20% adicional. Pero, lo m谩s importante, permiti贸 configurar de manera declarativa la divisi贸n de c贸digo, que cargar谩 solo lo que se necesita y cuando es necesario.

Ahora tu movimiento,% username%.
驴Y qui茅n reescribir谩 esto en ganchos?

Source: https://habr.com/ru/post/443124/


All Articles