原文連接:https://ssshooter.com/2019-01...javascript
前面說過基本功能已經添加完了,可是生成目錄依然是我 TODO 的頭號問題。今天終於把這個問題解決了,原本覺得要本身解釋 md 文件,沒想到自帶的插件就有這個功能我卻沒發現。css
生成目錄首先要獲取目錄數據,此功能由插件 gatsby-transformer-remark
提供,請務必先安裝。html
安裝後在你須要獲取目錄的頁面的 graphQL 查詢代碼中添加 tableOfContents
。tableOfContents
後面的 pathToSlugField 用於生成錨點連接地址,默認值爲當前文章的 slug
。在例子中就把地址的前綴改爲 md 文件提供的 path 了。這個位置就看你原本的地址怎麼配置,若是原本就是 slug 則不用修改,直接寫 tableOfContents 不用後面括號的部分。(不過我在實踐中發現改了以後地址也不會變,緣由未明,谷歌也搜索不到相似的狀況)前端
{ markdownRemark(fields: { slug: { eq: $slug } }) { id excerpt html tableOfContents(pathToSlugField: "frontmatter.path") frontmatter { title tags date(formatString: "MMMM DD, YYYY") } } }
接着你就能獲得像這樣的目錄字符串:vue
"<ul> <li><a href="/2019-01-08-understand-mvvm/#%E5%89%8D%E8%A8%80">前言</a></li> <li><a href="/2019-01-08-understand-mvvm/#mvvm-%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF">MVVM 基本信息</a></li> <li><a href="/2019-01-08-understand-mvvm/#mvvm-%E7%BB%93%E6%9E%84%E5%88%9D%E8%A7%81">MVVM 結構初見</a></li> <li> <p><a href="/2019-01-08-understand-mvvm/#mvvm-%E4%B8%8E-mvc-%E7%9A%84%E5%AF%B9%E6%AF%94">MVVM 與 MVC 的對比</a></p> <ul> <li><a href="/2019-01-08-understand-mvvm/#vue-%E7%9A%84-mvvm">Vue 的 MVVM</a></li> <li><a href="/2019-01-08-understand-mvvm/#%E5%89%8D%E7%AB%AF-mvc">前端 MVC</a></li> </ul> </li> <li><a href="/2019-01-08-understand-mvvm/#%E6%8B%93%E5%B1%95%EF%BC%9Areact-%E5%8F%AA%E6%98%AF-mvc-%E7%9A%84-v%EF%BC%9F">拓展:React 只是 MVC 的 V?</a></li> <li><a href="/2019-01-08-understand-mvvm/#%E7%90%86%E8%A7%A3%E3%80%81%E4%BA%A4%E6%B5%81">理解、交流</a></li> </ul>"
參考連接:https://www.gatsbyjs.org/pack...java
你可能以爲上面的字符串塞到網頁就大功告成……嗯我當時也這麼想。react
如今你即便有這麼一個帶 url 的目錄,點擊缺不會跳轉到對應位置。由於 markdown 轉換到 html 以後並無注入錨點。爲解決這個問題要引入一個新插件 gatsby-remark-autolink-headers。npm
npm install --save gatsby-remark-autolink-headers
安裝後進行以下配置sass
// In your gatsby-config.js module.exports = { plugins: [ { resolve: `gatsby-transformer-remark`, options: { plugins: [`gatsby-remark-autolink-headers`], }, }, ], }
若是是看過以前的教程的話必定知道個人事例項目用了 prismjs,prismjs 插件與 autolink 有迷之衝突,必定要把 autolink 放前,prismjs 放後:bash
// good { resolve: `gatsby-transformer-remark`, options: { plugins: [ `gatsby-remark-autolink-headers`, `gatsby-remark-prismjs`, ], }, } // bad { resolve: `gatsby-transformer-remark`, options: { plugins: [ `gatsby-remark-prismjs`, // should be placed after `gatsby-remark-autolink-headers` `gatsby-remark-autolink-headers`, ], }, }
添加成功後由 md 文件轉換獲得的 html 字符串裏的標題就會都帶上 id,這樣錨連接就能正常使用啦!
參考連接:https://www.gatsbyjs.org/pack...
如下是個人樣式代碼,由於框架的全局樣式對 ul 和 li 的影響挺大的,因此很多代碼是用於修復的。另外是用媒體查詢在大屏時把目錄固定到左下角。
.css-toc { color: $titleColor; padding: 15px; background: #fcfaf2; margin-bottom: 25px; > ul { padding-left: 16px; } ul { list-style-type: square; list-style-position: outside; margin-bottom: 0; p { vertical-align: top; display: inline-block; } } li { margin-bottom: 0; } li > p { margin-bottom: 0; } li > ul { margin-top: 0; } } @media screen and (min-width: 1045px) { .css-toc { position: fixed; bottom: 0; right: 0; width: 200px; max-height: 400px; overflow: scroll; font-size: 14px; li > ul { margin-left: 1rem; } } }