iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
Modern Web

Full Stack Web Development 網站實作系列 第 16

Day 16 使用Next.js, Tailwind CSS 和 Supabase 做一個影像畫廊 image gallery app (8) -- 顯示 Supabase 資料在螢幕上

  • 分享至 

  • xImage
  •  

繼續加其他文字資料到圖卡上,增加圖片 title 到圖卡上。
在 /components/ImageCard.js 加上下列指令。

<div className="px-6 py-2">
  <div className="font-bold text-xl mb-l">{twimg.title}</div>
</div>

https://ithelp.ithome.com.tw/upload/images/20221001/201295846oBxoUcV4b.png
顯示 title (紅框部分):
https://ithelp.ithome.com.tw/upload/images/20221001/20129584Z9bZalnpqt.png

修改圖卡在螢幕上的排列方式,大螢幕一列將顯示五張圖卡,手機一列顯示一張圖卡。
在 /components/PostImage.js,加上一個設定螢幕大小與每列圖卡數的 grid container,把 ImageCard 元件,放進這個 container。

<div className="grid gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5">
  {twimgs.map(twimg => <ImageCard twimg={twimg} key={twimg.id} />)}
</div>

https://ithelp.ithome.com.tw/upload/images/20221001/201295845FGIAH1GIF.png
大螢幕:
https://ithelp.ithome.com.tw/upload/images/20221001/20129584mCMQrm7XgN.png
手機螢幕:
https://ithelp.ithome.com.tw/upload/images/20221001/20129584DQHJYuxO4g.png

接下來,增加點選圖卡,能進入看到單張圖卡詳細內容的網頁:
(1) 修改 /components/ImageCard.js,加入 Link 元件,設定單張圖卡路徑。將圖卡內容放入 Link 元件內。

import Image from "next/image";
import Link from "next/link";

const ImageCard = ({ twimg }) => {
  return (
    <Link href={`/twimg/${twimg.id}`}>
      <div className="bg-white shadow-sm rounded-md cursosr-pointer">
       ...
      </div>
    </Link>

點選圖卡:
https://ithelp.ithome.com.tw/upload/images/20221001/20129584hkztWVtAZW.png

(2)接下來,到 pages 目錄,新增 twimg 目錄,在 twimg 目錄下新增 [id] 目錄,最後在 [id] 目錄下,新增 index.js 檔案。

(3) /pages/twimg/[id]/index.js 程式中,使用 getStaticProps() 和 getStaticPaths() 元件存取資料, getStaticProps() 中 props 回傳的資料,將會在 build time 時 預先提交資料給網頁。

import { supabaseAdmin } from "../../../client";
import Image from "next/image"

const Twimg = ({ twimg }) => {
  return (
    <div className="container max-w-4xl mx-auto pt-6">
      <div className="px-3">
        <Image src={twimg.imageSrc} width={960} height={540} className="rounded-md" />
        <h1 className="fond-bold text-xl my-2">{twimg.title}</h1>
        <p className="text-gray-600 mt-4">{twimg.description}</p>
      </div>
    </div>
  );
};

export async function getStaticProps(context) {
  const { id } = context.params;
  const { data } = await supabaseAdmin
    .from('images')
    .select( )
    .filter('id', 'eq', id)
    .single()
  const twimg = data
  return {
    props: { twimg }
  }
}

export async function getStaticPaths() {
  const { data } = await supabaseAdmin.from('images').select('*');
  const twimg = data

  const ids = twimg.map(twimg => twimg.id);
  const paths = ids.map(id => ({ params: { id: id.toString() } }));

  return {
    paths,
    fallback: false
  }
}

export default Twimg;

點選圖片,看明細內容。
https://ithelp.ithome.com.tw/upload/images/20221001/201295841UWee44oUe.png


上一篇
Day 15 使用Next.js, Tailwind CSS 和 Supabase 做一個影像畫廊 image gallery app (6) -- 顯示 Supabase 資料在螢幕上
下一篇
Day 17 使用Next.js, Tailwind CSS 和 Supabase 做一個影像畫廊 image gallery app (9) -- Head 元件
系列文
Full Stack Web Development 網站實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言