Escribir una API para React Components, Parte 5: solo use la composici贸n

Escribir una API para componentes React, parte 1: no cree accesorios conflictivos

Escribir una API para React Components, Parte 2: Dar nombres al comportamiento, no a la interacci贸n

Escribir una API para componentes React, parte 3: el orden de los accesorios es importante

Escribir una API para React Components, Parte 4: 隆Cuidado con el Apropacalypse!

Escribir una API para React Components, Parte 5: solo use la composici贸n

Escribimos API para componentes React, parte 6: creamos comunicaci贸n entre componentes

Tenemos un componente de icono:


insignia-1


<Badge count={12} /> 

Los viste en varias aplicaciones, muestran la cantidad de objetos como un n煤mero.


github-1


La insignia del cosmos (icono) tiene varios colores para cada contexto espec铆fico (informaci贸n, peligro, etc.)


insignia-2


 <Badge count={12} appearance="information" /> <Badge count={12} appearance="success" /> <Badge count={12} appearance="default" /> <Badge count={12} appearance="warning" /> <Badge count={12} appearance="danger" /> 

Esta interfaz de usuario tiene otro componente similar: Label .


github-2


Tambi茅n tiene varios colores para cada contexto:


etiqueta-2


 <Label text="private" appearance="information" /> <Label text="private" appearance="success" /> <Label text="private" appearance="default" /> <Label text="private" appearance="warning" /> <Label text="private" appearance="danger" /> 

Mire estos dos componentes y diga una cosa buena y otra mala sobre su API (sobre sus accesorios)


juntos 2


 <Badge count={12} appearance="information" /> <Label text="private" appearance="information" /> 

Que bueno


Ambos componentes tienen el mismo accesorio para la apariencia: appearance , eso es genial. Adem谩s, 隆tienen las mismas opciones para este accesorio! Si sabe c贸mo usar la appearance en Badge , entonces ya sabe c贸mo usar la appearance en Label


Esforzarse por apoyos consistentes entre componentes

Consejo # 2 de Escribir una API para Reaccionar Componentes, Parte 2: Dar nombres al comportamiento, no a la interacci贸n

Lo que es malo


La forma en que toman sus significados es diferente. Ambos tienen su propia opci贸n.


Contar, count tiene sentido dentro del marco del componente Badge , pero teniendo en cuenta el resto de sus componentes, esta es una API adicional que su equipo y los usuarios (desarrolladores) tendr谩n que recordar.


Mejoremos esta API


Para ser coherente, llamar茅 a este content utiler铆a, este es el nombre m谩s com煤n que se me ocurri贸, m谩s general que solo la etiqueta, el texto o el valor.


juntos 2


 <Badge content="12" appearance="information" /> <Label content="private" appearance="information" /> 

Perdimos algunos detalles, pero obtuvimos mucha consistencia. Todav铆a podemos establecer el tipo de valor con prop-types , as铆 que creo que este es un buen compromiso.


Pero espera, en React ya hay un accesorio de content multiprop贸sito, se llama children , un ni帽o.


No reinvente los props.children.

Si ha definido accesorios que aceptan datos arbitrarios que no se basan en una estructura de datos, probablemente sea mejor usar composici贸n - Brent Jackson

Aqu铆 est谩 el consejo de este art铆culo: al elegir entre una composici贸n y accesorios, elija una composici贸n .


Refactoricemos esta API con children , hijos:


juntos 2


 <Badge appearance="information">12 </Badge> <Label appearance="information">Private </Label> 

Se ve genial


Bonificaci贸n: cuando usa children lugar de utiler铆a, el desarrollador que usa este componente obtiene m谩s flexibilidad sin tener que cambiar el componente.


Por ejemplo, aqu铆 , en 茅l, quiero agregar un 铆cono delante del texto.


alerta


Utilizando children puedo agregar un icono a este sin volver a este componente o cambiarlo.


 //  -     <Alert type="warning" icon="warning" text="This is an important message!" /> //  <Alert type="warning"> <Icon name="warning" /> This is an important message! </Alert> 

Casualmente, cuando escrib铆 este texto, vi un tweet de Brad Frost :


Hola, reacciona amigos, necesito un poco de ayuda. Contin煤o encontr谩ndome con este patr贸n donde ciertos componentes (especialmente listas) pueden dividirse en componentes m谩s peque帽os o controlarse al pasar un objeto. 驴Qu茅 opci贸n es mejor?

codigo


驴Te resulta familiar?


En primer lugar, no usemos text apoyo y usemos children lugar.


 //  : <Breadcrumb text="Home" href="/child" /> //  : <Breadcrumb href="/child">Home</Breadcrumb> 

Ahora que hemos resuelto esto, hablemos de estas dos opciones de API.


Como no es dif铆cil de adivinar, me gusta el primero.


  1. No necesita pensar en c贸mo se llama el text apoyo? label ? Estos son solo children .
  2. Puede agregar su className u target si es necesario. Para la segunda opci贸n, debe asegurarse de que admite estas propiedades o simplemente las pasa al elemento base.
  3. Esto le permite ajustar el elemento secundario en un contexto o en un componente de nivel superior.

Excepci贸n a la regla:


驴Qu茅 sucede si Brad quiere evitar que el desarrollador realice las configuraciones que mencion茅 anteriormente? 隆Entonces dar al desarrollador m谩s flexibilidad, en su caso, ser铆a un error!


Aqu铆 est谩 mi respuesta a Brad .


M谩s ejemplos


Aqu铆 hay algunos ejemplos m谩s de c贸mo este consejo puede mejorar su c贸digo, mi 煤ltimo favorito.


Los formularios son un gran ejemplo de uso, queremos controlar el dise帽o del formulario, mostrar errores, etc. Pero al mismo tiempo, no queremos perder oportunidades de expansi贸n.


 // #1  <FormTextInput type="text" label="Name" id="name-input" /> //     id, //  label   input? // #2  <FormField> <Label>Field label</Label> <TextInput id="name-input" type="text" placeholder="What's your name?" /> </FormField> // #3    <FormField label="Field label"> <TextInput id="name-input" type="text" placeholder="What's your name?" /> </FormField> 

El 煤ltimo ejemplo es particularmente interesante.


A veces necesita un componente que se utilizar谩 en situaciones muy diferentes. No es f谩cil crear un componente que sea flexible y que a煤n tenga una API simple.


Aqu铆 es donde la inversi贸n de control viene al rescate: deje que el usuario del componente decida qu茅 renderizar. En el mundo React, este patr贸n se llama render prop pattern .


El componente render prop toma una funci贸n que devuelve un elemento React y lo llama en lugar de implementar su propio render.

de la documentaci贸n de React Render-props

Uno de los ejemplos m谩s populares de accesorios de renderizado es la API de contexto oficial.


En el siguiente ejemplo, el componente App controla los datos, pero no controla su representaci贸n; pasa este control al componente Counter .


 //    const MyContext = React.createContext() //    //    function App() { return ( <MyContext.Provider value="5"> <Counter /> </MyContext.Provider> ) } //    //   function Counter() { return ( <MyContext.Consumer> {value => ( <div className="counter">the count is: {value}</div> )} </MyContext.Consumer> ) } 

驴Has notado algo interesante en esta API del Consumer ?


隆En lugar de crear una nueva API, usa children para aceptar una funci贸n que le dice c贸mo renderizar!


 //  <Consumer render={value => ( <div className="counter">the count is: {value}</div> )} /> //  <Consumer> {value => ( <div className="counter">the count is: {value}</div> )} </Consumer> 

Regrese a su c贸digo y busque el componente que acepte cualquier accesorio cuando pueda usar children f谩cilmente.

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


All Articles