Desenvolvimento para dispositivos móveis

Notas de aula do prof. Eduardo da disciplina de Desenvolvimento para Dispositivos Móveis (curso técnico)

View on GitHub

Criando um composable de responsividade

Embora já tenhamos o composable useScreen, faremos um novo para não interferir no que já foi feito. O objetivo é que você entenda como criar um composable e como ele pode ser usado em diferentes situações.

Então, criaremos um arquivo chamado monitor.js na pasta src/composables e o conteúdo desse arquivo será:

import {
  defineAsyncComponent,
  onMounted,
  onUnmounted,
  ref,
  shallowRef,
} from 'vue';

export function useMonitor() {
  const breakpoint = ref('sm');
  const menu = shallowRef(
    defineAsyncComponent(() => import('../components/MenuSuperiorXs.vue')),
  );

  const updateBreakpoint = () => {
    const width = window.innerWidth;
    if (width < 576) {
      breakpoint.value = 'xs';
      menu.value = defineAsyncComponent(() =>
        import('../components/MenuSuperiorXs.vue'),
      );
    } else if (width < 768) {
      breakpoint.value = 'sm';
      menu.value = defineAsyncComponent(() =>
        import('../components/MenuSuperiorSm.vue'),
      );
    } else if (width < 992) {
      breakpoint.value = 'md';
      menu.value = defineAsyncComponent(() =>
        import('../components/MenuSuperiorMd.vue'),
      );
    } else if (width < 1200) {
      breakpoint.value = 'lg';
      menu.value = defineAsyncComponent(() =>
        import('../components/MenuSuperiorLg.vue'),
      );
    } else {
      breakpoint.value = 'xl';
      menu.value = defineAsyncComponent(() =>
        import('../components/MenuSuperiorXl.vue'),
      );
    }
  };

  onMounted(() => {
    updateBreakpoint();
    window.addEventListener('resize', updateBreakpoint);
  });

  onUnmounted(() => {
    window.removeEventListener('resize', updateBreakpoint);
  });

  return {
    breakpoint,
    menu,
  };
}

Neste arquivo, criamos um composable chamado useMonitor que tem como objetivo monitorar o tamanho da tela e atualizar o componente do menu superior de acordo com o tamanho da tela. Para isso, usamos o window.innerWidth para obter a largura da tela e, com base nesse valor, atualizamos o componente do menu superior.

Contudo, é importante ressaltar que inserimos alguns conceitos novos nesse arquivo, que vamos entender a seguir.

Função defineAsyncComponent

A função defineAsyncComponent é uma função do Vue que permite carregar um componente de forma assíncrona. Isso é útil para carregar componentes apenas quando eles são necessários, o que pode melhorar o desempenho do aplicativo. Esse é um conceito relacionado ao lazy loading que mencionamos anteriormente.

Função ShallowRef

A função shallowRef é uma função do Vue que cria uma referência reativa a um valor. A diferença entre ref e shallowRef é que shallowRef não cria uma reatividade profunda. Isso significa que, se o valor passado para shallowRef for um objeto ou um array, as alterações internas desse objeto ou array não serão reativas. Isso é útil para evitar problemas de desempenho em situações em que a reatividade profunda não é necessária. Quando usamos o conceito de componentes dinâmicos, o uso do shallowRef é indicado pela documentação da linguagem.

< Editando o HomeView Finalizando o uso dos componentes dinâmicos >