51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

hexo-pagination函数释义

相关文章阅读顺序 {#相关文章阅读顺序}

前言: {#前言:}

hexo-pagination是hexo的内部工具函数。 源码在此

这个分页函数是所有其他插件的基础,充分理解pagination函数,有助于我们随心所欲的创建自己想要的页面。
我们不关心hexo的内核是如何实现逻辑,我们更关心hexo需要什么样的数据,我们如何操控它。

开明宗义: {#开明宗义:}

pagination函数返回值类似这样:

|------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | { path: xxxDir, // 路径 layout: ['layout1', 'layout2', 'layout3', 'layout4'], //指定布局,首先找有没有1模板 没有依次往下找 data: { base: xxxDir, total: 1, current: 1, current_url: tagDir, posts: locals.posts, prev: 0, prev_link: '', next: 0, next_link: '', tags: tags } } |

以这种形式return出来的值,hexo接受后,会生成一个指定layout的,在xxxDir文件夹位置的页面,其url为localhost:4000/xxxDir,内部可调用的数据便是data里面的值。(xxxDir==base,是一开始就带入的参数)
这样一说,整体就清晰了,你可以利用pagination来创建任意路径,任意布局,带入任意的data的页面了

pagination(base, posts, [options])

| option对象 | 描述 | 缺省 | |----------|----------------------|------------------------| | perPage | 每页展示文章 | 10 | | format | URL 格式 | page/%d/ | | layout | 布局, 可以是string或array. | ['archive', 'index'] | | data | 额外的data | 无 |

示例: {#示例}

|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 | var pagination = require('hexo-pagination'); pagination('/tags/hexo', [], { perPage: 10, format: 'page/%d/', layout: ['archive', 'index'], // 同时设定了两个布局,当 archive 布局不存在时,会继续尝试 index 布局。 data: { tag: 'hexo' } }); |

这个function返回一个包含path, layout, data的数组

|---------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | if (perPage) { for (let i = 1; i <= total; i++) { result.push({ path: formatURL(i), layout, data: Object.assign(makeData(i), data) }); } } else { result.push({ path: base, layout, data: Object.assign(makeData(1), data) }); } return result; |

如果有分页 则result是一个数组集

其中data对象里面包含

| Data | Description | |-------------|-------------------| | base | Base URL | | total | 总共多少页 | | current | 当前页码 | | current_url | 当前页路径 (与path相同) | | posts | 当前页面文章数(被切割后的文章数) | | prev | 上一页(数字) | | prev_link | 上一页链接 | | next | 下一页(数字) | | next_link | 下一页链接 |

其中,data是可以扩展的,内部是用了Object.assign,除了以上的9个键,你也可以自定义键值对往里面塞,也同样会显示在页面中

源码整体释义

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | 'use strict'; const util = require('util'); function pagination(base, posts, options) { if (typeof base !== 'string') throw new TypeError('base must be a string!'); if (!posts) throw new TypeError('posts is required!'); options = options || {}; if (base && base[base.length - 1] !== '/') base += '/'; const length = posts.length; const perPage = options.hasOwnProperty('perPage') ? +options.perPage : 10; const total = perPage ? Math.ceil(length / perPage) : 1; const format = options.format || 'page/%d/'; const layout = options.layout || ['archive', 'index']; const data = options.data || {}; const result = []; const urlCache = {}; function formatURL(i) { //代入1,2,3,4..total 返回 if (urlCache[i]) return urlCache[i]; let url = base; if (i > 1) url += util.format(format, i); //node的util库方法,%d被i替换为具体数值 urlCache[i] = url; return url; } function makeData(i) { const data = { //这是i=1的情况 里面都是缺省值 base, total, current: i, current_url: formatURL(i), posts: perPage ? posts.slice(perPage * (i - 1), perPage * i) : posts, //含头不含尾的截取数组 prev: 0, prev_link: '', next: 0, next_link: '' }; if (i > 1) { //第二页开始 记录prev data.prev = i - 1; data.prev_link = formatURL(data.prev); } if (i < total) { //记录next data.next = i + 1; data.next_link = formatURL(data.next); } return data; } if (perPage) { //如果有分页 for (let i = 1; i <= total; i++) { result.push({ path: formatURL(i), layout, data: Object.assign(makeData(i), data) //合并data 让自定义字段流入 }); } //最后的结果是一个包含很多对象的数组,每个对象就代表一个页面 } else { result.push({ path: base, layout, data: Object.assign(makeData(1), data) //合并data 让自定义字段流入 }); // path用base的一个单页面 } return result; } module.exports = pagination; |

参考链接:https://www.jianshu.com/p/186fa7da9253


赞(5)
未经允许不得转载:工具盒子 » hexo-pagination函数释义