Módulos JS
Em JavaScript, módulos permitem dividir um programa em arquivos separados e independentes, facilitando a organização e reutilização de código. Cada módulo pode exportar variáveis, funções, classes ou objetos, que podem ser importados por outros módulos. Isso resulta em um código mais limpo, fácil de manter e melhora a colaboração em projetos maiores. Um exemplo simples:
export function soma(a, b) {
  return a + b;
}
import { soma } from ‘./math.js’;
console.log(soma(2, 3));
Para obter mais informações, acesse:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules
Componentes
No Vue.js, existe o conceito de componente, que nada mais é do que blocos reutilizáveis de código que representam partes da interface do usuário. Eles permitem dividir uma aplicação em pedaços menores, organizados e independentes, facilitando a manutenção e a reutilização. Nesse sentido, os componentes no Vue pode ser considerados como módulos JavaScript.
Para criarmos um componente Vue em JavaScript podemos fazer o seguinte:
export default {
  name: "MyImage",
};
Esse código exporta um objeto de definição de componente do Vue. O export default { ... } diz ao Vue (e a outros arquivos que importarem) que esse objeto é um componente Vue. A propriedade name: “MyImage” define o nome interno do componente.
Para usar esse componente, inicialmente temos que fazer um import
import MyImage from "./MyImage.js";
E depois adicionar na aplicação Vue:
app.component("my-image", MyImage);
Com isso, temos uma nova tag HTML chamada my-image que renderiza esse componente.
Templates
No Vue.js, o template é a parte do componente onde você descreve a estrutura visual que será renderizada na tela.
export default {
  name: “MyImage",
  template: `
    <h1>Hello Template</h1>
  `
};
Propriedades
No Vue.js, props (propriedades) são uma forma de passar dados para um componente.
export default {
  name: "MyImage",
  props: {
    link: {
      type: String,
      required: true,
    },
    description: {
      type: String,
      required: false,
      default: "",
    },
  },
No exemplo acima, são definidas duas propriedades, link e description do tipo String sendo que apenas a primeira é obrigatória. Um exemplo mais realista do componente MyImage poderia ser escrito da seguinte maneira:
export default {
  name: "MyImage",
  props: {
    link: {
      type: String,
      required: true,
    },
    description: {
      type: String,
      required: false,
      default: "",
    },
  },
  template: `
    <div class="card">
      <div class="card-image">
        <figure class="image is-128x128">
          <img
            :src="link"
            alt="description"
          />
        </figure>
      </div>
      <div class="card-content">
        <div class="content">
          <p></p>
        </div>
      </div>
    </div>
  `,
  methods: {
  },
};
V-bind
v-bind é uma diretiva que serve para ligar (bind) atributos de elementos HTML ou props de componentes a valores dinâmicos do Vue (variáveis, expressões ou funções).
Em um componente, se você escrever <img src=“link"> o navegador irá entender que a palavra link como um texto. Porém, escrevendo <img v-bind:src=“link”> o Vue avalia a variável link do componente e coloca o valor correto no atributo src. Note que você pode utilizar : como um atalho para v-bind, por exemplo: <img :src=“link”>.
Emmissão de eventos
Em Vue.js, a emissão de eventos é uma forma de comunicação entre componentes. Um componente filho pode emitir um evento para notificar o componente pai sobre uma ação ou mudança de estado. Isso é feito usando o método $emit.
@click="$emit('image-clicked', description)"
No exemplo acima, quando o elemento é de um componente é clicado ele emite um evento chamado image-clicked, passando a descrição da imagem como argumento.
No componente pai, você pode ouvir esse evento usando a diretiva v-on ou o atalho @. Por exemplo:
<my-image
  link="https://vuejs.org/images/logo.png"
  description="Vue.js Logo"
  @image-clicked="showDescription"
></my-image>
O método showDescription no componente pai é usado para lidar com o evento emitido do componente <my-image>:
methods: {
  showDescription(description) {
    alert(description);
  }
}
Assim, quando a imagem é clicada, o evento image-clicked é emitido pelo componente filho, e o método showDescription no componente pai é chamado, exibindo um alerta com a descrição da imagem.
Exemplo
Para obter um exemplo funcional acesse o endereço:
https://github.com/rodrigoprestesmachado/cpw2/tree/main/exemplos/vue-components
Referências 📚
- Vue.js - The Progressive JavaScript Framework

CC BY 4.0 DEED