logologo
Começar
Manual
Desenvolvimento
Plugins
API
Início
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Começar
Manual
Desenvolvimento
Plugins
API
Início
logologo
Visão geral do RunJS
Importando módulos
Renderização no contêiner

Variáveis globais

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 tradução por IA

Este documento foi traduzido por IA. Para informações precisas, consulte a versão em inglês.

#ctx.render()

Renderiza elementos React, strings HTML ou nós DOM em um contêiner especificado. Se o container não for fornecido, o padrão é renderizar no ctx.element e herdar automaticamente o contexto da aplicação, como ConfigProvider e temas.

#Cenários de uso

CenárioDescrição
JSBlockRenderiza conteúdo personalizado de blocos (gráficos, listas, cartões, etc.)
JSField / JSItem / JSColumnRenderiza exibições personalizadas para campos editáveis ou colunas de tabela
Bloco de detalhesPersonaliza o formato de exibição de campos em páginas de detalhes

Nota: ctx.render() requer um contêiner de renderização. Se o container não for passado e o ctx.element não existir (por exemplo, em cenários de lógica pura sem uma UI), um erro será lançado.

#Definição de tipo

render(
  vnode: React.ReactElement | Node | DocumentFragment | string,
  container?: Element | DocumentFragment
): ReactDOMClient.Root | null;
ParâmetroTipoDescrição
vnodeReact.ReactElement | Node | DocumentFragment | stringConteúdo a ser renderizado
containerElement | DocumentFragment (Opcional)Contêiner de renderização de destino, o padrão é ctx.element

Valor de retorno:

  • Ao renderizar um elemento React: Retorna ReactDOMClient.Root, facilitando a chamada de root.render() para atualizações subsequentes.
  • Ao renderizar uma string HTML ou nó DOM: Retorna null.

#Descrição do tipo vnode

TipoComportamento
React.ReactElement (JSX)Renderizado usando o createRoot do React, fornecendo recursos completos do React e herdando automaticamente o contexto da aplicação.
stringDefine o innerHTML do contêiner após a sanitização com DOMPurify; qualquer raiz React existente será desmontada primeiro.
Node (Element, Text, etc.)Adiciona via appendChild após limpar o contêiner; qualquer raiz React existente será desmontada primeiro.
DocumentFragmentAdiciona nós filhos do fragmento ao contêiner; qualquer raiz React existente será desmontada primeiro.

#Exemplos

#Renderizando elementos 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('Clicou'))}>
      {ctx.t('Botão')}
    </Button>
  </Card>
);

#Renderizando strings HTML

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

// Combinando com ctx.t para internacionalização
ctx.render('<div style="padding:16px">' + ctx.t('Conteúdo') + '</div>');

// Renderização condicional
ctx.render(hasData ? `<ul>${items.map(i => `<li>${i}</li>`).join('')}</ul>` : '<span style="color:#999">' + ctx.t('Sem dados') + '</span>');

#Renderizando nós DOM

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

// Renderiza um contêiner vazio primeiro, depois o entrega a uma biblioteca de terceiros (ex: ECharts) para inicialização
const container = document.createElement('div');
container.style.width = '100%';
container.style.height = '400px';
ctx.render(container);
const chart = echarts.init(container);
chart.setOption({ ... });

#Especificando um contêiner personalizado

// Renderiza em um elemento DOM específico
const customEl = document.getElementById('meu-conteiner');
ctx.render(<div>Conteúdo</div>, customEl);

#Chamadas múltiplas substituirão o conteúdo

// A segunda chamada substituirá o conteúdo existente no contêiner
ctx.render(<div>Primeira</div>);
ctx.render(<div>Segunda</div>);  // Apenas "Segunda" será exibido

#Observações

  • Chamadas múltiplas substituirão o conteúdo: Cada chamada de ctx.render() substitui o conteúdo existente no contêiner em vez de anexá-lo.
  • Segurança de strings HTML: O HTML passado é sanitizado via DOMPurify para reduzir riscos de XSS, mas ainda é recomendado evitar a concatenação de entradas de usuários não confiáveis.
  • Não manipule ctx.element diretamente: ctx.element.innerHTML está obsoleto; o ctx.render() deve ser usado de forma consistente em seu lugar.
  • Passe o contêiner quando não houver um padrão: Em cenários onde ctx.element é undefined (por exemplo, dentro de módulos carregados via ctx.importAsync), um container deve ser fornecido explicitamente.

#Relacionado

  • ctx.element - Contêiner de renderização padrão, usado quando nenhum contêiner é passado para ctx.render().
  • ctx.libs - Bibliotecas integradas como React e Ant Design, usadas para renderização JSX.
  • ctx.importAsync() - Usado em conjunto com ctx.render() após carregar bibliotecas externas de React/componentes sob demanda.