分頁(yè)器的頁(yè)面數(shù)量)
Hugo PagerSize 方法詳解讀取每個(gè)分頁(yè)器的頁(yè)面數(shù)量【免費(fèi)下載鏈接】hugoThe world’s fastest framework for building websites.項(xiàng)目地址: https://gitcode.com/gh_mirrors/hu/hugo導(dǎo)讀在 Hugo 中PagerSize是Pager對(duì)象上的一個(gè)方法用于返回每個(gè)分頁(yè)器pager中包含的頁(yè)面數(shù)量。它服務(wù)于博客、新聞?wù)尽⑽臋n站等場(chǎng)景下的列表分頁(yè)導(dǎo)航——當(dāng)模板把一長(zhǎng)串文章拆分成多頁(yè)展示時(shí)PagerSize可以讓你精確獲知每頁(yè)容納多少條目。閱讀完本文你將掌握PagerSize的調(diào)用語(yǔ)法、其數(shù)值的來(lái)源與覆蓋規(guī)則并結(jié)合 Hugo 源碼理解分頁(yè)尺寸在底層是如何被解析和應(yīng)用的從而寫(xiě)出更可靠的分頁(yè)模板。一、PagerSize 是什么在 Hugo 的分頁(yè)機(jī)制中術(shù)語(yǔ)約定如下見(jiàn) 分頁(yè)模板文檔paginate把列表頁(yè)拆分為兩個(gè)或多個(gè)子集pager分頁(yè)過(guò)程中產(chǎn)生的一個(gè)對(duì)象包含頁(yè)面集合的一個(gè)子集以及跳轉(zhuǎn)到其他 pager 的導(dǎo)航鏈接paginator一系列 pager 的集合。PagerSize就是掛在 pager 上的只讀屬性它表示當(dāng)前分頁(yè)器中每頁(yè)容納的元素?cái)?shù)量。無(wú)論當(dāng)前處于第幾頁(yè)P(yáng)agerSize返回的都是同一個(gè)固定值——即分頁(yè)時(shí)設(shè)定的每頁(yè)條數(shù)。二、語(yǔ)法與返回值PagerSize是Pager對(duì)象的方法無(wú)需參數(shù)返回類(lèi)型為intPAGER.PagerSize在模板中通過(guò)分頁(yè)器對(duì)象調(diào)用典型用法如下來(lái)自 PagerSize 文檔{{ $pages : where site.RegularPages Type posts }} {{ $paginator : .Paginate $pages }} {{ range $paginator.Pages }} h2a href{{ .RelPermalink }}{{ .LinkTitle }}/a/h2 {{ end }} {{ with $paginator }} {{ .PagerSize }} {{ end }}在這個(gè)示例中用where過(guò)濾出所有Type為posts的常規(guī)頁(yè)面構(gòu)建頁(yè)面集合調(diào)用Paginate對(duì)該集合進(jìn)行分頁(yè)未顯式指定每頁(yè)條數(shù)因此使用項(xiàng)目配置的默認(rèn)值用range遍歷當(dāng)前 pager 中的頁(yè)面并輸出標(biāo)題鏈接通過(guò)with守衛(wèi)后輸出.PagerSize即每個(gè)分頁(yè)器的頁(yè)面數(shù)量。三、頁(yè)面數(shù)量由什么決定根據(jù) PagerSize 文檔每個(gè)分頁(yè)器的頁(yè)面數(shù)量按以下優(yōu)先級(jí)確定Paginate方法的可選第二個(gè)參數(shù)整數(shù)顯式覆蓋每頁(yè)條數(shù)項(xiàng)目配置中的pagerSize若未傳第二個(gè)參數(shù)則回退到 分頁(yè)配置 中的pagerSize默認(rèn)值為10。也就是說(shuō)調(diào)用{{ .Paginate $pages }}時(shí)每頁(yè)條數(shù)取配置值默認(rèn) 10調(diào)用{{ .Paginate $pages 7 }}時(shí)每頁(yè)條數(shù)被顯式覆蓋為 7。覆蓋每頁(yè)條數(shù)的完整示例參考 Paginate 方法文檔 中的layouts/section.html示例{{ $pages : where .Site.RegularPages Section articles }} {{ $pages $pages.ByTitle }} {{ range (.Paginate $pages 7).Pages }} h2a href{{ .RelPermalink }}{{ .Title }}/a/h2 {{ end }} {{ partial pagination.html . }}這里Paginate $pages 7的第二個(gè)參數(shù)7使得每個(gè) pager 恰好包含 7 個(gè)元素此時(shí){{ .Paginator.PagerSize }}將返回7。四、配置項(xiàng)詳解pagination若不在Paginate調(diào)用中顯式指定每頁(yè)條數(shù)則使用 分頁(yè)配置 中的設(shè)置。Hugo 默認(rèn)配置如下[pagination] disableAliases false pagerSize 10 path page三個(gè)配置項(xiàng)的含義配置項(xiàng)類(lèi)型默認(rèn)值說(shuō)明disableAliasesboolfalse是否禁用第一個(gè)分頁(yè)器的別名alias生成pagerSizeint10每個(gè)分頁(yè)器容納的頁(yè)面數(shù)量即PagerSize的取值來(lái)源pathstringpage每個(gè)分頁(yè)器 URL 中表示這是分頁(yè)頁(yè)的路徑段多語(yǔ)言項(xiàng)目中的分頁(yè)配置對(duì)于多語(yǔ)言項(xiàng)目可以為每種語(yǔ)言單獨(dú)定義分頁(yè)行為代碼來(lái)自 分頁(yè)配置文檔[languages.en] contentDir content/en direction ltr label English locale en-US weight 1 [languages.en.pagination] disableAliases true pagerSize 10 path page [languages.de] contentDir content/de direction ltr label Deutsch locale de-DE weight 2 [languages.de.pagination] disableAliases true pagerSize 20 path blatt在這個(gè)例子中英文站點(diǎn)每頁(yè) 10 條、分頁(yè)路徑為page德文站點(diǎn)每頁(yè) 20 條、分頁(yè)路徑為blatt。相應(yīng)地不同語(yǔ)言下模板中PagerSize的返回值也會(huì)不同。五、源碼實(shí)現(xiàn)深度解析5.1 PagerSize 的直接實(shí)現(xiàn)PagerSize的實(shí)現(xiàn)在 resources/page/pagination.go// PagerSize returns the size of each paginator page. func (p *Paginator) PagerSize() int { return p.size }從源碼結(jié)構(gòu)看Paginator結(jié)構(gòu)體resources/page/pagination.go持有size字段PagerSize()只是直接返回該字段而每個(gè)Pager通過(guò)內(nèi)嵌*Paginator繼承了這一方法。也就是說(shuō)PagerSize是分頁(yè)器整體屬性而不是某個(gè)具體分頁(yè)頁(yè)的屬性——同一分頁(yè)器下所有頁(yè)第 1 頁(yè)、第 2 頁(yè)……調(diào)用它都會(huì)得到相同的值。5.2 每頁(yè)條數(shù)的解析邏輯無(wú)論是Paginate還是Paginator方法最終都會(huì)調(diào)用ResolvePagerSize來(lái)解析每頁(yè)條數(shù)實(shí)現(xiàn)在 resources/page/pagination.gofunc ResolvePagerSize(conf config.AllProvider, options ...any) (int, error) { if len(options) 0 { return conf.Pagination().PagerSize, nil } if len(options) 1 { return -1, errors.New(too many arguments, pager size is currently the only option) } pas, err : cast.ToIntE(options[0]) if err ! nil || pas 0 { return -1, errors.New((pager size must be a positive integer)) } return pas, nil }這段代碼印證了文檔中的優(yōu)先級(jí)規(guī)則不傳第二個(gè)參數(shù)直接讀取conf.Pagination().PagerSize即項(xiàng)目配置中的pagerSize默認(rèn) 10傳一個(gè)參數(shù)通過(guò)cast.ToIntE轉(zhuǎn)為整數(shù)且必須是正整數(shù)否則報(bào)錯(cuò)pager size must be a positive integer傳兩個(gè)及以上參數(shù)直接報(bào)錯(cuò)too many arguments。配置默認(rèn)值10定義在 config/allconfig/alldecoders.go對(duì)應(yīng)配置結(jié)構(gòu)體字段位于 config/commonConfig.go。5.3 在頁(yè)面對(duì)象上的調(diào)用鏈模板中的.Paginate最終在 hugolib/page__paginator.go 中被處理func (p *pagePaginator) Paginate(seq any, options ...any) (*page.Pager, error) { var initErr error p.init.Do(func() { pagerSize, err : page.ResolvePagerSize(p.source.s.Conf, options...) if err ! nil { initErr err return } pd : p.source.targetPathDescriptor pd.Type p.source.outputFormat() paginator, err : page.Paginate(pd, seq, pagerSize) if err ! nil { initErr err return } p.current paginator.Pagers()[0] }) if initErr ! nil { return nil, initErr } return p.current, nil }可以看到調(diào)用鏈為模板Paginate→ResolvePagerSize解析每頁(yè)條數(shù)→page.Paginate按該條數(shù)切分頁(yè)面集合→ 得到 paginator其中size字段被記錄下來(lái)供后續(xù)PagerSize()讀取。切分邏輯由splitPages/splitPageGroupsresources/page/pagination.go完成它從集合起點(diǎn)開(kāi)始以size為步長(zhǎng)把頁(yè)面切成若干段每段即一個(gè) pager。六、與相關(guān) Pager 方法的配合PagerSize通常與分頁(yè)導(dǎo)航相關(guān)的其他Pager方法配合使用這些方法都定義在 resources/page/pagination.go 中方法返回值說(shuō)明PagerSizeint每個(gè)分頁(yè)器的頁(yè)面數(shù)量TotalPagesint分頁(yè)器總數(shù)TotalNumberOfElementsint所有分頁(yè)器中的元素總數(shù)NumberOfElementsint當(dāng)前分頁(yè)器中的元素?cái)?shù)量最后一頁(yè)可能少于PagerSizePageNumberint當(dāng)前頁(yè)的頁(yè)碼從 1 開(kāi)始Pages/PageGroupsPages / PagesGroup當(dāng)前分頁(yè)器包含的頁(yè)面或分組HasPrev/HasNextbool是否存在上一頁(yè) / 下一頁(yè)P(yáng)rev/Next/First/Last*Pager返回相鄰或首尾分頁(yè)器URLstring當(dāng)前分頁(yè)器的 URLPagerspagers返回全部分頁(yè)器列表用于構(gòu)建分頁(yè)菜單例如判斷當(dāng)前頁(yè)是否為最后一頁(yè)并結(jié)合PagerSize展示信息{{ with .Paginator }} {{ if .HasNext }} p第 {{ .PageNumber }} 頁(yè)共 {{ .TotalPages }} 頁(yè)每頁(yè) {{ .PagerSize }} 條。/p {{ end }} {{ end }}七、測(cè)試驗(yàn)證Hugo 的單元測(cè)試對(duì)PagerSize有明確的斷言見(jiàn) resources/page/pagination_test.goc.Assert(len(paginatorPages), qt.Equals, 5) c.Assert(paginator.TotalNumberOfElements(), qt.Equals, 21) c.Assert(paginator.PagerSize(), qt.Equals, 5) c.Assert(paginator.TotalPages(), qt.Equals, 5)該測(cè)試使用 21 個(gè)元素、每頁(yè) 5 條創(chuàng)建分頁(yè)器驗(yàn)證了PagerSize返回 5、共 5 頁(yè)、最后一頁(yè)只有 1 個(gè)元素NumberOfElements為 1見(jiàn) pagination_test.go。這從側(cè)面說(shuō)明PagerSize是每頁(yè)的容量上限而最后一頁(yè)的實(shí)際元素?cái)?shù)量可能少于它實(shí)際數(shù)量要用NumberOfElements獲取。八、使用注意事項(xiàng)分頁(yè)結(jié)果會(huì)被緩存一旦在某個(gè)列表頁(yè)模板中調(diào)用了Paginate或Paginator首次調(diào)用的結(jié)果即被緩存且不可更改對(duì)同一列表頁(yè)再次調(diào)用分頁(yè)方法會(huì)得到緩存結(jié)果后續(xù)調(diào)用不會(huì)按字面意思重新執(zhí)行見(jiàn) 分頁(yè)模板文檔 與 Paginate 方法文檔 的說(shuō)明。因此每頁(yè)條數(shù)一旦確定便保持穩(wěn)定PagerSize在同一次構(gòu)建中始終返回固定值。每頁(yè)條數(shù)必須為正整數(shù)若通過(guò)Paginate的第二個(gè)參數(shù)傳入非正整數(shù)Hugo 會(huì)報(bào)錯(cuò)pager size must be a positive integer。Paginator方法無(wú)法覆蓋每頁(yè)條數(shù)與Paginate不同Paginator方法只會(huì)按項(xiàng)目配置的pagerSize分頁(yè)不能像Paginate那樣通過(guò)第二參數(shù)覆蓋見(jiàn) 分頁(yè)模板文檔。區(qū)分PagerSize與NumberOfElementsPagerSize返回每頁(yè)容量固定值NumberOfElements返回當(dāng)前頁(yè)實(shí)際元素?cái)?shù)——最后一頁(yè)通常小于PagerSize。小結(jié)PagerSize是 Hugo 分頁(yè)模板中最常用的信息之一它告訴你每個(gè)分頁(yè)器容納多少頁(yè)面數(shù)值來(lái)源為Paginate的第二個(gè)參數(shù)或項(xiàng)目配置pagination.pagerSize默認(rèn) 10。理解其底層實(shí)現(xiàn)Paginator.size字段與ResolvePagerSize解析邏輯能幫助你準(zhǔn)確預(yù)測(cè)分頁(yè)輸出結(jié)構(gòu)并在自定義分頁(yè)導(dǎo)航組件時(shí)做出正確的邊界判斷。【免費(fèi)下載鏈接】hugoThe world’s fastest framework for building websites.項(xiàng)目地址: https://gitcode.com/gh_mirrors/hu/hugo創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考