Componentes de mini app

Componentes da Web

Os componentes da Web começaram com a promessa de permitir que os desenvolvedores os unissem e criassem ótimos apps com base neles. Exemplos de componentes atômicos são o time-elements do GitHub, o web-vitals-element do Stefan Judis ou, sem vergonha, o interruptor de modo escuro do Google. No entanto, quando se trata de sistemas de design completos, observei que as pessoas preferem confiar em um conjunto coerente de componentes do mesmo fornecedor. Uma lista incompleta de exemplos inclui os componentes da Web UI5 da SAP, os elementos do Polymer, os elementos do Vaadin, o FAST da Microsoft, os componentes da Web Material, os componentes do AMP e muito mais. Devido a vários fatores fora do escopo deste artigo, muitos desenvolvedores também migraram para frameworks como React, Vue.js, Ember.js etc. Em vez de dar ao desenvolvedor a liberdade de escolher qualquer uma dessas opções (ou, dependendo do seu ponto de vista, forçar a fazer uma escolha tecnológica), os provedores de superapps fornecem universalmente um conjunto de componentes que os desenvolvedores precisam usar.

Componentes em miniaplicativos

Você pode pensar nesses componentes como qualquer uma das bibliotecas de componentes mencionadas acima. Para ter uma visão geral dos componentes disponíveis, navegue pela biblioteca de componentes do WeChat, componentes do ByteDance, componentes do Alipay, componentes do Baidu e componentes do Quick App.

Mostrei anteriormente que, embora o <image> do WeChat seja um componente da Web por trás dos bastidores, nem todos esses componentes são tecnicamente componentes da Web. Alguns componentes, como <map> e <video>, são renderizados como componentes integrados do SO que são sobrepostos à WebView. Para o desenvolvedor, esse detalhe de implementação não é revelado, ele é programado como qualquer outro componente.

Como sempre, os detalhes variam, mas os conceitos gerais de programação são os mesmos para todos os provedores de superapps. Um conceito importante é a vinculação de dados, como mostrado em Linguagens de marcação. Geralmente, os componentes são agrupados por função, o que facilita a busca do componente certo para a tarefa. Confira abaixo um exemplo da categorização do Alipay, que é semelhante ao agrupamento de componentes de outros fornecedores.

  • Contêineres de visualização
    • view
    • swiper
    • scroll-view
    • cover-view
    • cover-image
    • movable-view
    • movable-area
  • Conteúdo básico
    • text
    • icon
    • progress
    • rich-text
  • Componentes de formulário
    • button
    • form
    • label
    • input
    • textarea
    • radio
    • radio-group
    • checkbox
    • checkbox-group
    • switch
    • slider
    • picker-view
    • picker
  • Navegação
    • navigator
  • Componentes de mídia
    • image
    • video
  • Tela
    • canvas
  • Mapa
    • map
  • Abrir componentes
    • web-view
    • lifestyle
    • contact-button
  • Acessibilidade
    • aria-component

Confira abaixo o <image> do Alipay usado em uma diretiva a:for (consulte Renderização de lista) que faz loops em uma matriz de dados de imagem fornecida em index.js.

/* index.js */
Page({
  data: {
    array: [
      {
        mode: "scaleToFill",
        text: "scaleToFill",
      },
      {
        mode: "aspectFit",
        text: "aspectFit",
      },
    ],
    src: "https://images.example.com/sample.png",
  },
  imageError(e) {
    console.log("image", e.detail.errMsg);
  },
  onTap(e) {
    console.log("image tap", e);
  },
  imageLoad(e) {
    console.log("image", e);
  },
});
<!-- index.axml -->
<view class="page">
  <view class="page-section" a:for="{{array}}" a:for-item="item">
    <view class="page-section-demo" onTap="onTap">
      <image
        class="image"
        mode="{{item.mode}}"
        onTap="onTap"
        onError="imageError"
        onLoad="imageLoad"
        src="{{src}}"
        lazy-load="true"
        default-source="https://images.example.com/loading.png"
      />
    </view>
  </view>
</view>

Observe a vinculação de dados do item.mode ao atributo mode, o src ao atributo src e os três manipuladores de eventos onTap, onError e onLoad para as funções com o mesmo nome. Como mostrado antes, a tag <image> é convertida internamente em um <div> com um marcador de posição das dimensões finais da imagem, carregamento lento opcional, uma origem padrão etc.

As opções de configuração disponíveis do componente estão listadas na documentação. Uma prévia de componente com simulador incorporada aos documentos torna o código imediatamente tangível.

Documentação do componente Alipay com visualização de componente incorporado, mostrando um editor de código com simulador que mostra o componente renderizado em um iPhone 6 simulado.
Documentos do componente Alipay com visualização de componentes incorporados.
Visualização do componente Alipay em execução em uma guia separada do navegador mostrando um editor de código com simulador que mostra o componente renderizado em um iPhone 6 simulado.
A visualização do componente Alipay apareceu na própria guia.

Cada componente também tem um código QR que pode ser lido com o app Alipay, que abre o exemplo do componente em um exemplo mínimo independente.

O componente &quot;image&quot; do Alipay é exibido em um dispositivo real após a leitura de um código QR na documentação.
Visualização do componente <image> do Alipay em um dispositivo real depois de seguir um link do código QR nas documentações.

Os desenvolvedores podem pular da documentação diretamente para o IDE do Alipay DevTools usando um esquema de URI reservado antdevtool-tiny://. Isso permite que a documentação seja vinculada diretamente a um projeto de miniapp a ser importado para que os desenvolvedores possam começar a usar o componente imediatamente.

Componentes personalizados

Além de usar os componentes fornecidos pelo fornecedor, os desenvolvedores também podem criar componentes personalizados. O conceito existe para WeChat, ByteDance, Alipay e Baidu, além do App rápido. Por exemplo, um componente personalizado do Baidu consiste em quatro arquivos que precisam estar na mesma pasta: custom.swan, custom.css, custom.js e custom.json.

O arquivo custom.json indica o conteúdo da pasta como um componente personalizado.

{
  "component": true
}

O arquivo custom.swan contém a marcação e custom.css o CSS.

<view class="name" bindtap="tap">{{name}} {{age}}</view>
.name {
  color: red;
}

O arquivo custom.js contém a lógica. As funções do ciclo de vida do componente são attached(), detached(), created() e ready(). Além disso, o componente pode reagir a eventos do ciclo de vida da página, como show() e hide().

Component({
  properties: {
    name: {
      type: String,
      value: "swan",
    },
  },
  data: {
    age: 1,
  },
  methods: {
    tap: function () {},
  },
  lifetimes: {
    attached: function () {},
    detached: function () {},
    created: function () {},
    ready: function () {},
  },
  pageLifetimes: {
    show: function () {},
    hide: function () {},
  },
});

O componente personalizado pode ser importado em index.json. A chave da importação determina o nome (neste caso, "custom") que o componente personalizado pode usar em index.swan.

{
  "usingComponents": {
    "custom": "/components/custom/custom"
  }
}
<view>
  <custom name="swanapp"></custom>
</view>

Agradecimentos

Este artigo foi revisado por Joe Medley, Kayce Basques, Milica Mihajlija, Alan Kent e Keith Gu.