Estoy tratando de representar dinámicamente componentes en función de su tipo.
Por ejemplo:
var type = "Example";
var ComponentName = type + "Component";
return <ComponentName />;
// Returns <examplecomponent /> instead of <ExampleComponent />
Probé la solución propuesta aquí React / JSX nombres de componentes dinámicos
Eso me dio un error al compilar (usando browserify para tragar). Esperaba XML donde estaba usando una sintaxis de matriz.
Podría resolver esto creando un método para cada componente:
newExampleComponent() {
return <ExampleComponent />;
}
newComponent(type) {
return this["new" + type + "Component"]();
}
Pero eso significaría un nuevo método para cada componente que creo. Debe haber una solución más elegante para este problema.
Estoy muy abierto a sugerencias.
{...this.props}
útil pasar de manera transparente los accesorios a los componentes subtipados del padre. Me gustareturn <MyComponent {...this.props} />
Hay una documentación oficial sobre cómo manejar tales situaciones disponible aquí: https://facebook.github.io/react/docs/jsx-in-depth.html#choosing-the-type-at-runtime
Básicamente dice:
Incorrecto:
Correcto:
fuente
Debe haber un contenedor que asigne los nombres de los componentes a todos los componentes que se supone que deben usarse dinámicamente. Las clases de componentes deben registrarse en un contenedor porque, en un entorno modular, no hay un lugar único donde se pueda acceder. Las clases de componentes no se pueden identificar por sus nombres sin especificarlas explícitamente porque la función
name
se minimiza en la producción.Mapa de componentes
Puede ser objeto simple:
O
Map
instancia:El objeto simple es más adecuado porque se beneficia de la taquigrafía de la propiedad.
Módulo de barril
Un módulo de barril con exportaciones con nombre puede actuar como tal mapa:
Esto funciona bien con una clase por estilo de código de módulo.
Decorador
Los decoradores se pueden usar con componentes de clase para azúcar sintáctico, esto aún requiere especificar los nombres de clase explícitamente y registrarlos en un mapa:
Se puede usar un decorador como componente de orden superior con componentes funcionales:
El uso de propiedad no estándar en
displayName
lugar de aleatoria también beneficia la depuración.fuente
Descubrí una nueva solución. Tenga en cuenta que estoy usando módulos ES6, así que estoy requiriendo la clase. También podría definir una nueva clase React en su lugar.
fuente
default
atributo? es decir: require ('./ ExampleComponent'). default?Si sus componentes son globales, simplemente puede hacer:
fuente
Components
matriz no está definida.Para un componente de envoltura, una solución simple sería usar
React.createElement
directamente (usando ES6).fuente
En todas las opciones con mapas de componentes, no he encontrado la forma más simple de definir el mapa usando la sintaxis corta ES6:
fuente
Tener un mapa no se ve bien en absoluto con una gran cantidad de componentes. De hecho, me sorprende que nadie haya sugerido algo como esto:
Este realmente me ayudó cuando necesitaba renderizar una gran cantidad de componentes cargados en forma de matriz json.
fuente
React.createElement(MyComponent)
directamente arrojó un error. Específicamente, no quiero que el padre tenga que conocer todos los componentes para importar (en un mapeo), porque eso parece un paso adicional. En cambio, yo solíaconst MyComponent = require("path/to/component/" + "ComponentNameString").default; return <MyComponent />
.Supongamos que deseamos acceder a varias vistas con carga dinámica de componentes. El siguiente código ofrece un ejemplo práctico de cómo lograr esto mediante el uso de una cadena analizada a partir de la cadena de búsqueda de una url.
Supongamos que queremos acceder a una página 'snozberrys' con dos vistas únicas utilizando estas rutas de URL:
y
Definimos el controlador de nuestra vista de esta manera:
fuente
Supongamos que tenemos un
flag
, no diferente delstate
oprops
:Con la marca de
Compo
relleno con uno deComponentOne
oComponentTwo
y luegoCompo
puede actuar como un componente de reacción.fuente
Utilicé un enfoque un poco diferente, ya que siempre conocemos nuestros componentes reales, así que pensé en aplicar la caja del interruptor. También el número total de componentes fue de alrededor de 7-8 en mi caso.
fuente
Editar: Otras respuestas son mejores, ver comentarios.
Resolví el mismo problema de esta manera:
fuente
React.createElement
se invocará para cada componente en su objeto de búsqueda, aunque solo se represente uno de ellos a la vez. Peor aún, al colocar el objeto de búsqueda en elrender
método del componente principal, lo volverá a hacer cada vez que se muestre el elemento primario. Las mejores respuestas son una forma mucho mejor de lograr lo mismo.