目錄
啟動博客
熟悉內容模型
向類別類型添加slug
關於Sanity 源插件如何工作的簡短說明
在Gatsby 中添加類別頁面模板
Category: {title}
Posts
創建分類頁面!
首頁 web前端 css教學 如何用蓋茨比和理智製作分類頁面

如何用蓋茨比和理智製作分類頁面

Apr 06, 2025 am 10:24 AM

How to Make Taxonomy Pages With Gatsby and Sanity.io

本教程將介紹如何使用Gatsby 和Sanity.io 的結構化內容創建分類頁面。您將學習如何使用Gatsby 的節點創建API 向Gatsby 的GraphQL API 中的內容類型添加字段。具體來說,我們將為Sanity 的博客啟動器創建類別頁面。

需要注意的是,此處介紹的內容與Sanity 本身無關。無論您使用哪個內容源,都可以執行此操作。我們只是為了演示而使用Sanity.io。

啟動博客

如果您想使用您自己的Gatsby 項目學習本教程,請跳過在Gatsby 中創建新頁面模板的部分。否則,請訪問sanity.io/create 並啟動Gatsby 博客啟動器。它會將Sanity Studio 和Gatsby 前端的代碼放入您的GitHub 帳戶中,並在Netlify 上為兩者設置部署。所有配置(包括示例內容)都已就緒,以便您可以直接開始學習如何創建分類頁面。

項目啟動後,請確保將新的GitHub 存儲庫克隆到本地,並安裝依賴項:

 git clone [email protected]:username/your-repository-name.git
cd your-repository-name
npm i
登入後複製

如果您想在本地同時運行Sanity Studio(CMS)和Gatsby 前端,則可以從項目根目錄的終端運行命令npm run dev 。您也可以進入web文件夾,並使用相同的命令運行Gatsby。

您還應該安裝Sanity CLI 並從終端npm i -g @sanity/cli && sanity login login 。這將為您提供與Sanity 項目交互的工具和有用的命令。您可以添加--help標誌以獲取有關其功能和命令的更多信息。

我們將對gatsby-node.js文件進行一些自定義。要查看更改的結果,請重新啟動Gatsby 的開發服務器。這在大多數係統中都是通過在終端中按CTRL C 並再次運行npm run dev來完成的。

熟悉內容模型

查看/studio/schemas/documents文件夾。這裡有我們主要內容類型的架構文件:作者、類別、站點設置和帖子。每個文件都導出一個JavaScript 對象,該對象定義了這些內容類型的字段和屬性。在post.js中是類別的字段定義:

 {
  name: 'categories',
  type: 'array',
  title: 'Categories',
  of: [
    {
      type: 'reference',
      to: [{
        type: 'category'
      }]
    }
  ]
},
登入後複製

這將創建一個具有對類別文檔的引用對象的數組字段。在博客的工作室中,它將如下所示:

向類別類型添加slug

轉到/studio/schemas/documents/category.js 。類別有一個簡單的內容模型,它由標題和描述組成。現在我們正在為類別創建專用頁面,擁有slug 字段也很方便。我們可以在架構中這樣定義它:

 // studio/schemas/documents/category.js
export default {
  name: 'category',
  type: 'document',
  title: 'Category',
  fields: [
    {
      name: 'title',
      type: 'string',
      title: 'Title'
    },
    {
      name: 'slug',
      type: 'slug',
      title: 'Slug',
      options: {
        // 添加一個按鈕以根據標題字段生成slug
        source: 'title'
      }
    },
    {
      name: 'description',
      type: 'text',
      title: 'Description'
    }
  ]
}
登入後複製

現在我們已經更改了內容模型,我們需要更新GraphQL 架構定義。通過在studio 文件夾中執行npm run graphql-deploy (或者sanity graphql deploy )來執行此操作。您將收到有關重大更改的警告,但由於我們只是添加了一個字段,因此您可以繼續進行而無需擔心。如果您希望該字段在Netlify 上的工作室中可用,請將更改檢入git(使用git add . && git commit -m"add slug field" )並將其推送到您的GitHub 存儲庫( git push origin master )。

現在我們應該瀏覽類別並為它們生成slug。請記住點擊“發布”按鈕才能使Gatsby 訪問這些更改!如果您正在運行Gatsby 的開發服務器,則也需要重新啟動它。

關於Sanity 源插件如何工作的簡短說明

在開發中啟動Gatsby 或構建網站時,源插件將首先從Sanity 部署的GraphQL API 獲取GraphQL 架構定義。源插件使用它來告訴Gatsby 哪些字段應該可用,以防止它在某些字段的內容消失時中斷。然後,它將訪問項目的導出端點,該端點將所有可訪問的文檔流式傳輸到Gatsby 的內存數據存儲中。

換句話說,整個站點都是通過兩個請求構建的。運行開發服務器還將設置一個偵聽器,該偵聽器會實時將來自Sanity 的任何更改推送到Gatsby,而無需執行其他API 查詢。如果我們向源插件提供具有讀取草稿權限的令牌,我們將立即看到更改。這也可以通過Gatsby 預覽體驗到。

在Gatsby 中添加類別頁面模板

現在我們已經準備好GraphQL 架構定義和一些內容,我們可以開始在Gatsby 中創建類別頁面模板了。我們需要做兩件事:

  • 告訴Gatsby 為類別節點(這是Gatsby 的“文檔”術語)創建頁面。
  • 為Gatsby 提供一個模板文件來生成包含頁面數據的HTML。

首先打開/web/gatsby-node.js文件。這裡已經存在可以用來創建博客帖子頁面的代碼。我們將主要利用這段代碼,但用於類別。讓我們一步一步來:

createBlogPostPages函數和以exports.createPages開頭的行之間,我們可以添加以下代碼。我已經在這裡添加了註釋來解釋正在發生的事情:

 // web/gatsby-node.js

// ...

async function createCategoryPages (graphql, actions) {
  // 獲取Gatsby 創建新頁面的方法const {createPage} = actions
  // 查詢Gatsby 的GraphAPI 以獲取來自Sanity 的所有類別// 您可以在http://localhost:8000/___graphql 上查詢此API
  const result = await graphql(`{
    allSanityCategory {
      nodes {
        slug {
          current
        }
        id
      }
    }
  }
  `)
  // 如果查詢中存在任何錯誤,則取消構建並告訴我們if (result.errors) throw result.errors

  // 讓我們優雅地處理allSanityCatgogy 為null 的情況const categoryNodes = (result.data.allSanityCategory || {}).nodes || []

  categoryNodes
    // 循環遍歷類別節點,但不返回任何內容.forEach((node) => {
      // 解構每個類別的id 和slug 字段const {id, slug = {}} = node
      // 如果沒有slug,我們什麼也不做if (!slug) return

      // 使用當前slug 創建URL
      const path = `/categories/${slug.current}`

      // 使用URL 路徑和模板文件創建頁面,並傳遞我們可以用來在模板文件中查詢正確類別的id
      createPage({
        path,
        component: require.resolve('./src/templates/category.js'),
        context: {id}
      })
    })
}
登入後複製

最後,此函數需要在文件的底部:

 // /web/gatsby-node.js

// ...

exports.createPages = async ({graphql, actions}) => {
  await createBlogPostPages(graphql, actions)
  await createCategoryPages(graphql, actions) // 
}
登入後複製

現在我們已經有了創建類別頁面節點的機制,我們需要添加一個模板來顯示它在瀏覽器中的實際外觀。我們將基於現有的博客帖子模板來獲得一些一致的樣式,但在過程中保持相當簡單。

 // /web/src/templates/category.js
import React from 'react'
import {graphql, Link} from 'gatsby'
import Container from '../components/container'
import GraphQLErrorList from '../components/graphql-error-list'
import SEO from '../components/seo'
import Layout from '../containers/layout'
import {getBlogUrl} from '../lib/helpers'


export const query = graphql`
  query CategoryTemplateQuery($id: String!) {
    category: sanityCategory(id: {eq: $id}) {
      title
      description
      posts {
        _id
        title
        publishedAt
        slug {
          current
        }
      }
    }
  }
`

const CategoryPostTemplate = props => {
  const {data = {}, errors} = props
  const {title, description, posts} = data.category || {}

  return (
    <layout>
      <container>
        {errors &&<graphqlerrorlist errors="{errors}"></graphqlerrorlist> }
        {!data.category &&<p> No category data</p> }
        <seo title="{title}" description="{description}"></seo>
        <h1 id="Category-title">Category: {title}</h1>
        <p>{description}</p>
        {posts && (
          
            <h2 id="Posts">Posts</h2>
            <ul>
              {posts.map(post => (
                <li key="{post._id}">
                  <link to="{getBlogUrl(post.publishedAt," post.slug.current>{post.title}
                </li>
              ))}
            </ul>
          >
        )}
      </container>
    </layout>
  )
}

export default CategoryPostTemplate
登入後複製

這段代碼將生成一個簡單的類別頁面,其中包含鏈接帖子的列表——就像我們想要的那樣!

創建分類頁面!

我們剛剛完成了在Gatsby 中使用自定義頁面模板創建新頁麵類型的過程。我們介紹了Gatsby 的一個節點API,名為createResolver ,並用它向類別節點添加了一個新的posts字段。

這應該為您提供創建其他類型的分類頁面所需的內容!您的博客上有多個作者嗎?您可以使用相同的邏輯來創建作者頁面。 GraphQL 過濾器的有趣之處在於,您可以使用它來超越使用引用建立的顯式關係。它還可以用於使用正則表達式或字符串比較來匹配其他字段。它非常靈活!

以上是如何用蓋茨比和理智製作分類頁面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1253
24
靜態表單提供商的比較 靜態表單提供商的比較 Apr 16, 2025 am 11:20 AM

讓我們嘗試在這裡造成一個術語:“靜態表單提供商”。你帶上html

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow dom 每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow dom Apr 17, 2025 am 10:55 AM

在本週的平台新聞綜述中,Chrome引入了一個用於加載的新屬性,Web開發人員的可訪問性規範以及BBC Move

帶有HTML對話框元素的一些動手 帶有HTML對話框元素的一些動手 Apr 16, 2025 am 11:33 AM

這是我第一次查看HTML元素。我已經意識到了一段時間,但是尚未將其旋轉。它很酷,

紙張形式 紙張形式 Apr 16, 2025 am 11:24 AM

購買或建造是技術的經典辯論。自己構建東西可能會感覺更便宜,因為您的信用卡賬單上沒有訂單項,但是

'訂閱播客”鏈接應在哪裡? '訂閱播客”鏈接應在哪裡? Apr 16, 2025 pm 12:04 PM

有一段時間,iTunes是播客中的大狗,因此,如果您將“訂閱播客”鏈接到喜歡:

它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭 它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭 Apr 15, 2025 am 11:01 AM

該文檔負責人可能不是網站上最迷人的部分,但是其中所處的內容對於您的網站的成功也一樣重要

託管您自己的非JavaScript分析的選項 託管您自己的非JavaScript分析的選項 Apr 15, 2025 am 11:09 AM

有很多分析平台可幫助您跟踪網站上的訪問者和使用數據。也許最著名的是Google Analytics(廣泛使用)

See all articles