Desenvolvimento Web II

Notas de aula do prof. Eduardo da disciplina de Desenvolvimento Web II (curso técnico)

View on GitHub

Listando filmes

Vamos agora listar os filmes ao clicar no gênero. Para isso, vamos alterar o componente MoviesView.vue para que ele liste os filmes ao clicar no gênero. Inicialmente, vamos adicionar um listener ao evento click do elemento li que contém o gênero. Para isso, vamos alterar o bloco template do arquivo MoviesView.vue para o seguinte conteúdo:

<template>
  ... 
  <li
    v-for="genre in genres"
    :key="genre.id"
    @click="listMovies(genre.id)"
    class="genre-item"
  >
    {{ genre.name }}
  </li>
   ...
</template>

Note que adicionamos o listener ao evento click do elemento li que contém o gênero. Esse listener chama o método listMovies passando o id do gênero como parâmetro. Além disso, as demais partes do código permanecem inalteradas. Agora, vamos adicionar o método listMovies no bloco script do arquivo MoviesView.vue:

<script setup>
  ...
  const movies = ref([]);

  const listMovies = async (genreId) => {
      const response = await api.get('discover/movie', {
          params: {
              with_genres: genreId,
              language: 'pt-BR'
          }
      });
      movies.value = response.data.results
  };
  ...
</script>

Neste exemplo, criamos uma variável reativa movies que armazena a lista de filmes. Além disso, criamos o método listMovies que recebe o id do gênero como parâmetro (chamado de genreId). Esse método faz uma requisição para a rota discover/movie da API do TMDB passando o genreId como parâmetro. Em seguida, o método atribui a lista de filmes retornada pela API à variável reativa movies. As demais partes do código permanecem inalteradas. Agora, vamos alterar o bloco template do arquivo MoviesView.vue, adicionando o seguinte conteúdo, depois de fechar a tag </ul>:

<div class="movie-list">
  <div v-for="movie in movies" :key="movie.id" class="movie-card">
    
    <img
      :src="`https://image.tmdb.org/t/p/w500${movie.poster_path}`"
      :alt="movie.title"
    />
    <div class="movie-details">
      <p class="movie-title">{{ movie.title }}</p>
      <p class="movie-release-date">{{ movie.release_date }}</p>
      <p class="movie-genres">{{ movie.genre_ids }}</p>
    </div>
    
  </div>
</div>

Neste caso, criamos um elemento div com a classe movie-list que contém um elemento div para cada filme (comportamento garantido pelo v-for). Cada elemento div com a classe movie-card contém:

Agora, vamos adicionar o seguinte estilo no bloco style do arquivo MoviesView.vue:

.movie-list {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}

.movie-card {
  width: 15rem;
  height: 30rem;
  border-radius: 0.5rem;
  overflow: hidden;
  box-shadow: 0 0 0.5rem #000;
}

.movie-card img {
  width: 100%;
  height: 20rem;
  border-radius: 0.5rem;
  box-shadow: 0 0 0.5rem #000;
}

.movie-details {
  padding: 0 0.5rem;
}

.movie-title {
  font-size: 1.1rem;
  font-weight: bold;
  line-height: 1.3rem;
  height: 3.2rem;
}

Neste caso, definimos 5 regras de estilos CSS:

Por fim, faremos uma pequena alteração na definação de estilo da classe .genre-list para adicionar uma margem inferior, como segue:

.genre-list {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: 2rem;
  list-style: none;
  margin-bottom: 2rem;
}

Note que nesse caso adicionamos a propriedade margin-bottom com o valor 2rem para definir uma margem inferior de 2 vezes o tamanho da fonte.

Exercícios

Fazer a listagem de programas de TV ao clicar no gênero. Note que no caso dos programas de TV, a rota da API é discover/tv e o parâmetro para filtrar por gênero é with_genres. Além disso, o nome do campo que contém o título do programa de TV é name, o nome original é original_name e o nome do campo que contém a data de lançamento é first_air_date.

< TMDB: ajustes nos estilos TMDB: Visualizar como carregando >