AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79583500
Accepted
user30305347
user30305347
Asked: 2025-04-20 23:36:57 +0800 CST2025-04-20 23:36:57 +0800 CST 2025-04-20 23:36:57 +0800 CST

Componentes SVG dinâmicos dentro de um componente SVG dinâmico. Renderiza um componente para todos

  • 772

Visão geral: O usuário pode clicar em um AVpanel da lista e o panelviewer é chamado para exibir o svg do painel junto com os vários rótulos/módulos.

Em teoria, isso funciona perfeitamente. Ele carrega o painel e adiciona os rótulos dos módulos com as cores de texto/fundo. Abaixo está uma imagem do componente do painel com os rótulos. Abaixo dos rótulos, é onde os componentes do módulo são renderizados.

Imagem do componente do painel

O problema que tenho é quando se trata de adicionar os componentes do módulo ao componente do painel. Se os módulos forem todos HDMI, eles serão adicionados. Se forem todos Cat6, eles serão adicionados. Isso ocorre quando há dois tipos de módulos. Se for um módulo HDMI em shelf03modD, ele renderiza esse componente para todos os módulos. E o mesmo se for Cat6. O último da lista será renderizado para todos.

AVPanels.ts

Este arquivo é usado como catálogo/modelo para os painéis/módulos. É usado para criar e selecionar o imageComponent para o visualizador de painéis e módulos.

import dynamic from 'next/dynamic';

interface ModuleProps { 
x?: number;
y?: number;
model?: React.ComponentType<ModuleProps>;
}
interface PanelComponentProps { 
shelf01ModuleALabel?: string;
shelf01ModuleATextColor?: string;
shelf01ModuleABackgroundColor?: string;
shelf01ModuleAModel?: React.ComponentType<ModuleProps>;
}
export interface PanelTemplate {
imageComponent?: React.ComponentType<PanelComponentProps>;
}
export interface ModuleTemplate {
imageModuleComponent?: React.ComponentType<ModuleProps>;
}
export const genericPanels: PanelTemplate[] = [ {
imageComponent: dynamic(() => import('@/assets/svg/panels/1u/Generic1u4ModPanel').then(mod => mod.default as React.ComponentType<PanelComponentProps>)),
}]
export const avModules: ModuleTemplate[] = [{
imageModuleComponent: dynamic(() => import('@/assets/svg/modules/GenericHDMImodule').then(mod => mod.default as React.ComponentType<ModuleProps>)),
}]

PanelViewer.tsx

getModuleDetails obtém os adereços que os componentes devem usar.

const getModuleDetailsForShelf = (shelfPosition: string) => {
    if (!genericPanel) return {};

    const shelf = genericPanel.fibrePanelShelves.find(
      (s) => s.shelfPosition === shelfPosition
    );
    if (!shelf || shelf.genericPanelModules.length === 0) return {};

    return shelf.genericPanelModules.reduce((acc, module) => {
      const shelfNum = shelfPosition.split("_")[1].padStart(2, "0");
      const position = module.modulePosition;
      const moduleTemplate = getModuleTemplateByModel(module.moduleModel);

      const label = `shelf${shelfNum}Module${position}Label`;
      const txtColor = `shelf${shelfNum}Module${position}TextColor`;
      const bgColor = `shelf${shelfNum}Module${position}BackgroundColor`;
      const model = `shelf${shelfNum}Module${position}Model`;

      const textColor = module.moduleLabel.includes("HDMI")
        ? "green"
        : module.moduleLabel.includes("Cat6")
        ? "black"
        : "black";
      const backgroundColor = module.moduleLabel.includes("HDMI")
        ? "blue"
        : module.moduleLabel.includes("Cat6")
        ? "white"
        : "transparent";

      return {
        ...acc,
        [label]: module.moduleLabel,
        [txtColor]: textColor,
        [bgColor]: backgroundColor,
        [model]: moduleTemplate?.imageModuleComponent,
      };
    }, {});
  };

  const genericPanelTemplate = getPanelTemplateByModel(
      genericPanel.genericPanelModel
    );

  const ImageComponent = fibrePanelTemplate?.imageComponent;
  
    return (
      <div className="h-full w-full overflow-y-auto p-4 ease-linear">
        <div className="w-full">
          {image === "show" && ImageComponent && (
            <ImageComponent
              {...getModuleDetailsForShelf("Shelf_01")}
              {...getModuleDetailsForShelf("Shelf_02")}
              {...getModuleDetailsForShelf("Shelf_03")}
            />
          )}

GenericPanel.tsx

Este é o componente SVG do painel

"use client";

interface ModuleProps {
  x: number;
  y: number;
  model?: React.ComponentType<ModuleProps>;
}

const ModuleRenderer = ({ x, y, model }: ModuleProps) => {
  if (!model) {
    return null;
  }

  const ModuleComponent = model;

  return <ModuleComponent x={x} y={y} model={model} />;
};

interface GenericPanelProps {
  shelf01ModuleALabel?: string;
  shelf01ModuleATextColor?: string;
  shelf01ModuleABackgroundColor?: string;
  shelf01ModuleAModel?: React.ComponentType<ModuleProps>;
}
const Generic1u4ModPanel = ({
  shelf01ModuleAModel,
}: GenericPanelProps) => {
  return

//This contains the SVG code for the panel. Then in each each section for the modules contains this... 

<g id="s1mAlabel" transform="translate(35.163 -14.93)">
  <path
    id="path84"
    d="M0 66.642h80.514v11.311H0z"
    className="st11"
    fill={shelf01ModuleABackgroundColor}
  />
  <text
    id="text84"
    x="40.257"
    y="73.5"
    className="st12"
    fill={shelf01ModuleATextColor}
  >
    {shelf01ModuleALabel}
  </text>
</g>
<g id="s1mA" transform="translate(35.163 -2.444)">
  <ModuleRenderer model={shelf01ModuleAModel} x={0} y={30.26} />
</g>

MóduloHDMIGenérico.tsx

Cada módulo tem isso adicionado...

"use client";

interface ModuleProps {
  x?: number;
  y?: number;
}

const GenericHDMImodule = ({ x = 0, y = 0 }: ModuleProps) => {
  return (
    <g transform={`translate(${x} ${y})`} height={11.31} width={80.51}>

A dica é que o último componente do módulo na lista do array é renderizado para todos se houver 2 ou mais tipos de módulo em um painel. Eu tive o mesmo problema quando comecei com os rótulos. Resolvi isso atribuindo a cada rótulo sua própria propriedade (por exemplo, shelf01moduleAlabel, shelf01moduleBlabel). Mas isso não funciona para renderizar os componentes do módulo em si. Ele ainda usa o último da lista e o renderiza para todos os módulos, pois esses são componentes dinâmicos. Simplesmente não consigo descobrir como atribuir a cada posição uma chave exclusiva para que eles sejam renderizados.

next.js
  • 1 1 respostas
  • 41 Views

1 respostas

  • Voted
  1. Best Answer
    Danny '365CSI' Engelman
    2025-04-21T02:17:10+08:002025-04-21T02:17:10+08:00

    Muito mais fácil com os modernos componentes da Web padrão

    • Você escreve no estilo HTML5 OOP
    • Você aprimora o HTML para "Componentes da Web"
    • Adicione mais atributos HTML personalizados conforme necessário
    • Nenhuma estrutura necessária
    • Nenhuma etapa de construção necessária

    <script>
      class BaseLinkBox extends HTMLElement {
        constructor() {
          const createElement = (tag, props = {}) => Object.assign(document.createElement(tag), props);
          super().attachShadow({ mode: 'open' })
            .append(
              createElement('style', {
                textContent: `div{width:150px;height:40px;font:16px Arial;background:var(---bgcolor,beige);
                                  display:flex;align-items:center;justify-content:center}`
              }),
              this.div = createElement('div', {
                innerHTML: "<slot/>"
              }));
          this.onclick = (evt) => alert("clicked " + this.nodeName);
        }
      }
      customElements.define('white-link-box', class extends BaseLinkBox {});
      customElements.define('blue-link-box', class extends BaseLinkBox {
        constructor() {
          super();
          this.div.style.backgroundColor = 'blue';
          this.div.style.color = 'white';
        }
      });
    </script>
    <style>
      av-panel { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px }
    </style>
    <av-panel>
      <white-link-box>Cat6 link to</white-link-box>
      <blue-link-box>HDMI link to</blue-link-box>
      <white-link-box>Cat6 link to</white-link-box>
      <blue-link-box>HDMI link to</blue-link-box>
      <white-link-box>Cat6 link to</white-link-box>
      <blue-link-box>HDMI link to</blue-link-box>
      <white-link-box>Cat6 link to</white-link-box>
      <blue-link-box>HDMI link to</blue-link-box>
    </av-panel>

    • 1

relate perguntas

  • Como posso obter o nome do caminho no componente em Next.js?

  • Atualizando objeto dentro de vários formulários de array aninhados com useState

  • O upload da imagem para o servidor em Next.js 13 resulta em erro ENOENT

  • Como desabilitar os dados do cache e atualizá-los toda vez que o cliente visitar a página em Next.js

  • ReferenceError: o documento não está definido em Next.js

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve