Criando Componentes no Vue.js
No Vue.js, componentes são elementos nomeados que encapsulam código e comportamento, permitindo reutilização em diferentes partes da aplicação. O framework associa um comportamento específico a esses componentes, tornando-os blocos fundamentais para a construção de interfaces modulares.
Para definir um componente, o método component(nome, opções) do objeto da aplicação Vue é utilizado. O primeiro parâmetro representa o nome do componente e o segundo define suas opções, que incluem dados e comportamento.
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Aprendendo Vue.js</title>
    <script src="https://unpkg.com/vue"></script>
  </head>
  <body>
    <div id="app">
      <hello></hello>
      <hello></hello>
    </div>
    <script>
      const app = Vue.createApp({});
      app.component("hello", {
        template: "<h2>Hello</h2>",
      });
      app.mount("#app");
    </script>
  </body>
</html>O componente hello foi definido sem que o elemento <hello> exista nativamente no HTML. O Vue renderiza o conteúdo do componente no local onde esse elemento foi declarado. Além disso, um componente não pode substituir diretamente elementos HTML nativos como <div> ou <h2>.
No JavaScript, o objeto da aplicação Vue é criado com Vue.createApp({}). Nenhum parâmetro é passado nesse exemplo, mas a aplicação pode conter dados, métodos e outras propriedades conforme necessário.
Após a criação da aplicação, o método component() registra o componente:
app.component("hello", { template: "<h2>Hello</h2>" });O primeiro argumento define o nome do componente, enquanto o segundo especifica suas opções. A propriedade template contém a estrutura HTML que será renderizada no lugar do elemento <hello></hello>.
Durante a renderização, o Vue substitui cada ocorrência do elemento <hello> pelo conteúdo definido no template. Como o componente foi registrado na aplicação Vue, ele pode ser reutilizado quantas vezes for necessário dentro do escopo gerenciado pelo Vue.

Nomeando Componentes
Há duas formas de nomear componentes no Vue: kebab-case e PascalCase.

Se um componente for registrado com kebab-case, por exemplo:
Vue.component("my-component-name", {
  /* ... */
});Ele deve ser referenciado no DOM e em templates Vue como:
<my-component-name></my-component-name>Se um componente for registrado com PascalCase, por exemplo:
Vue.component("MyComponentName", {
  /* ... */
});Ele pode ser referenciado nos templates Vue de duas formas:
<!-- Válido apenas em templates Vue -->
<MyComponentName></MyComponentName>
<!-- Válido tanto no DOM quanto em templates Vue -->
<my-component-name></my-component-name>No entanto, quando utilizado diretamente no DOM (fora de templates baseados em strings), apenas a notação kebab-case é válida, pois navegadores não reconhecem elementos com letras maiúsculas no HTML.
ℹ️ Um detalhe importante é que os componentes só podem ser utilizados dentro da árvore DOM controlada pelo Vue. O exemplo abaixo, onde o componente é usado fora do
#app, não funcionaria:
<hello></hello>
<div id="app"></div>Isso acontece porque o Vue só gerencia elementos dentro do container onde foi montado, garantindo controle total sobre a renderização e o comportamento dos componentes.
Documentação oficial: