logologo
Empezar
Manual
Desarrollo
Plugins
API
Inicio
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Empezar
Manual
Desarrollo
Plugins
API
Inicio
logologo
Descripción general de RunJS
Importación de módulos
Renderizado en contenedor

Variables globales

window
document
navigator

ctx

ctx.blockModel
ctx.collection
ctx.collectionField
ctx.dataSource
ctx.dataSourceManager
ctx.element
ctx.exit()
ctx.exitAll()
ctx.filterManager
ctx.form
ctx.getModel()
ctx.getValue()
ctx.getVar()
ctx.i18n
ctx.importAsync()
ctx.initResource()
ctx.libs
ctx.location
ctx.logger
ctx.makeResource()
ctx.message
ctx.modal
ctx.model
ctx.notification
ctx.off()
ctx.on()
ctx.openView()
ctx.render()
ctx.request()
ctx.requireAsync()
ctx.resource
ctx.route
ctx.router
ctx.setValue()
ctx.sql
ctx.t()
ctx.view
Previous Pagectx.openView()
Next Pagectx.request()
Aviso de traducción IA

Este documento ha sido traducido por IA. Para información precisa, consulte la versión en inglés.

#ctx.render()

Renderiza elementos de React, cadenas HTML o nodos DOM en un contenedor especificado. Si no se proporciona un container, por defecto se renderiza en ctx.element y hereda automáticamente el contexto de la aplicación, como ConfigProvider y los temas.

#Casos de uso

EscenarioDescripción
JSBlockRenderizar contenido personalizado de bloques (gráficos, listas, tarjetas, etc.)
JSField / JSItem / JSColumnRenderizar visualizaciones personalizadas para campos editables o columnas de tablas
Bloque de detallesPersonalizar el formato de visualización de los campos en las páginas de detalles

Nota: ctx.render() requiere un contenedor de renderizado. Si no se pasa un container y ctx.element no existe (por ejemplo, en escenarios de lógica pura sin interfaz de usuario), se lanzará un error.

#Definición de tipos

render(
  vnode: React.ReactElement | Node | DocumentFragment | string,
  container?: Element | DocumentFragment
): ReactDOMClient.Root | null;
ParámetroTipoDescripción
vnodeReact.ReactElement | Node | DocumentFragment | stringContenido a renderizar
containerElement | DocumentFragment (Opcional)Contenedor de destino para el renderizado, por defecto es ctx.element

Valor de retorno:

  • Al renderizar un elemento de React: Devuelve ReactDOMClient.Root, lo que facilita llamar a root.render() para actualizaciones posteriores.
  • Al renderizar una cadena HTML o un nodo DOM: Devuelve null.

#Descripción del tipo vnode

TipoComportamiento
React.ReactElement (JSX)Se renderiza utilizando createRoot de React, proporcionando todas las capacidades de React y heredando automáticamente el contexto de la aplicación.
stringEstablece el innerHTML del contenedor después de la limpieza con DOMPurify; cualquier raíz de React existente se desmontará primero.
Node (Element, Text, etc.)Se añade mediante appendChild después de vaciar el contenedor; cualquier raíz de React existente se desmontará primero.
DocumentFragmentAñade los nodos hijos del fragmento al contenedor; cualquier raíz de React existente se desmontará primero.

#Ejemplos

#Renderizado de elementos de React (JSX)

const { Button, Card } = ctx.libs.antd;

ctx.render(
  <Card title={ctx.t('Título')}>
    <Button type="primary" onClick={() => ctx.message.success(ctx.t('Clic realizado'))}>
      {ctx.t('Botón')}
    </Button>
  </Card>
);

#Renderizado de cadenas HTML

ctx.render('<h1>Hola Mundo</h1>');

// Combinación con ctx.t para internacionalización
ctx.render('<div style="padding:16px">' + ctx.t('Contenido') + '</div>');

// Renderizado condicional
ctx.render(hasData ? `<ul>${items.map(i => `<li>${i}</li>`).join('')}</ul>` : '<span style="color:#999">' + ctx.t('Sin datos') + '</span>');

#Renderizado de nodos DOM

const div = document.createElement('div');
div.textContent = 'Hola Mundo';
ctx.render(div);

// Primero se renderiza un contenedor vacío y luego se entrega a una biblioteca de terceros (como ECharts) para su inicialización
const container = document.createElement('div');
container.style.width = '100%';
container.style.height = '400px';
ctx.render(container);
const chart = echarts.init(container);
chart.setOption({ ... });

#Especificación de un contenedor personalizado

// Renderizar en un elemento DOM específico
const customEl = document.getElementById('my-container');
ctx.render(<div>Contenido</div>, customEl);

#Las llamadas múltiples reemplazarán el contenido

// La segunda llamada reemplazará el contenido existente en el contenedor
ctx.render(<div>Primera vez</div>);
ctx.render(<div>Segunda vez</div>);  // Solo se muestra "Segunda vez"

#Notas

  • Las llamadas múltiples reemplazarán el contenido: Cada llamada a ctx.render() reemplaza el contenido existente en el contenedor en lugar de añadirlo.
  • Seguridad de las cadenas HTML: El HTML pasado se limpia mediante DOMPurify para reducir los riesgos de XSS, pero aun así se recomienda evitar la concatenación de entradas de usuario no confiables.
  • No manipule ctx.element directamente: ctx.element.innerHTML está en desuso; en su lugar, debe utilizarse ctx.render() de forma consistente.
  • Pase el contenedor cuando no exista uno por defecto: En escenarios donde ctx.element es undefined (por ejemplo, dentro de módulos cargados a través de ctx.importAsync), se debe proporcionar explícitamente un container.

#Relacionado

  • ctx.element - Contenedor de renderizado por defecto, se utiliza cuando no se pasa un contenedor a ctx.render().
  • ctx.libs - Bibliotecas integradas como React y Ant Design, utilizadas para el renderizado de JSX.
  • ctx.importAsync() - Se utiliza en conjunto con ctx.render() después de cargar bibliotecas externas de React o componentes bajo demanda.