微信小程序?qū)崿F(xiàn)動態(tài)渲染Markdown示例詳解
需求
十幾個圖文編排的介紹文章,每個頁面的結(jié)構(gòu)、內(nèi)容都不相同,
因此沒有辦法通過WXML代碼把文章結(jié)構(gòu)固定下來。
因此筆者想到的解決方案包括:
- 全部轉(zhuǎn)成長截圖,好處是代碼超級簡單,壞處是:即使只改一個字,也要重新生成、上傳截圖
- 全部用原生小程序硬編碼出來,每個介紹文章寫一個組件。雖然后期修改靈活,但過于低效且麻煩。
考慮到對于圖文編排來說,markdown的效率遠高于HTML,如果有辦法把markdown文檔渲染成小程序頁面,以上的需求就能很好的解決。
查了一下,還真有,倉庫地址:Towxml

構(gòu)建
名字非常簡單粗暴:to wxml,就是把markdown或HTML轉(zhuǎn)換成WXML。
作者說這個包不建議從NPM上獲取,而應(yīng)該自己使用源碼構(gòu)建:
// clone倉庫 git clone https://github.com/sbfkcel/towxml.git // 進入文件夾 cd towxml // 安裝依賴 npm install // 構(gòu)建 npm run build
構(gòu)建完成后,把dist文件夾復(fù)制到小程序的/miniprogram/路徑下(和app.ts、pages等目錄同級):

在小程序的app.ts中添加towxml:require('/towxml/index'):
/**
* app.ts
* TS小程序的App泛型可能和引入的組件不兼容,可以改成any
*/
App<any>({
globalData: {},
towxml:require('/towxml/index'),
onLaunch() {
},
})在需要使用的頁面json中添加組件引用:
{
"usingComponents": {
"towxml":"/towxml/towxml"
}
}頁面V層(wxml文件):
<!--index.wxml-->
<view class="container">
<towxml nodes="{{article}}"/>
</view>頁面C層(ts文件):
//獲取應(yīng)用實例
const app = getApp();
// data中添加兩個變量
Page({
data: {
isLoading: true, // 判斷是否尚在加載中
article: {} // 內(nèi)容數(shù)據(jù)
},
})使用
官方文檔鏈接:鏈接
文檔中寫到,在onload方法中初始化,就可以渲染markdown文本了,最終作用在上文寫的towxml標(biāo)簽上:
onLoad: function () {
let result = app.towxml('# Markdown', 'markdown',{
base:'https://xxx.com', // 相對資源的base路徑
theme:'light', // 主題,默認`light`
events:{ // 為元素綁定的事件方法
tap:(e)=>{
console.log('tap',e);
}
}
});
// 更新解析數(shù)據(jù)
this.setData({
article:result,
isLoading: false
});
}towxml方法的三個參數(shù):
- 文本型,必填。就是實際需要渲染的文本,上述代碼的
#Markdown渲染出來就是一級標(biāo)題 - 文本型,必填。表示類型,本文只用到markdown所以寫'markdown'即可
- 對象,必填。表示渲染時的參數(shù),具體可以看文檔,比如,主題可以改成亮色或暗色。


接下來需要解決一個問題:
上述代碼的markdown文本是直接寫在代碼里的,實際應(yīng)用肯定需要從后端獲取
因此先寫一個獲取文本的方法:
// 獲取markdown文本
getText: (url, callback) => {
wx.request({
url: url,
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: (res) => {
if (typeof callback === 'function') {
callback(res);
};
}
});
},然后改寫一下原來的onload:
onLoad: function () {
// 獲取文本,第一個參數(shù)指向后端的文件地址(你需要起一個后端)
this.getText('http://127.0.0.1:8080/test.md', res => {
// 回調(diào)函數(shù)中完成更新數(shù)據(jù)的邏輯
let result = app.towxml(res.data, 'markdown',{
base:'https://xxx.com',
theme:'light',
events:{
tap:(e)=>{
console.log('tap',e);
}
}
});
// 更新解析數(shù)據(jù)
this.setData({
article:result,
isLoading: false
});
})
}此時就可以渲染來自HTTP的markdown文件了:


最后通過參數(shù)修改請求地址就可以靈活控制頁面中的文本了。
總結(jié)
如果用傳統(tǒng)方式,真的把十幾篇二十幾篇文章做成頁面,沒個一兩天寫不完。用markdown渲染的方式一個小時應(yīng)該就能結(jié)束戰(zhàn)斗,效率起飛。
作為程序員,能動腦子的事情,絕對不用重復(fù)勞動,能用自動化解決的問題,絕對不動手。
以上就是微信小程序?qū)崿F(xiàn)動態(tài)渲染Markdown示例詳解的詳細內(nèi)容,更多關(guān)于微信小程序動態(tài)渲染Markdown的資料請關(guān)注腳本之家其它相關(guān)文章!
- python使用html2text庫實現(xiàn)從HTML轉(zhuǎn)markdown的方法詳解
- python 自動化將markdown文件轉(zhuǎn)成html文件的方法
- Python?mistune庫靈活的Markdown解析器使用實例探索
- Python自動創(chuàng)建Markdown表格使用實例探究
- uniapp中解析markdown支持網(wǎng)頁和小程序?qū)崿F(xiàn)示例
- 一款功能強大的markdown編輯器tui.editor使用示例詳解
- umi插件開發(fā)仿dumi項目加載markdown文件實現(xiàn)詳解
- unified如何處理markdown解析器詳解
- python markdown轉(zhuǎn)html自定義實現(xiàn)工具解析
相關(guān)文章
腳本吧 - 幻宇工作室用到j(luò)s,超強推薦base.js
腳本吧 - 幻宇工作室用到j(luò)s,超強推薦base.js...2006-12-12
JavaScript中實現(xiàn)最高效的數(shù)組亂序方法
這篇文章主要介紹了JavaScript中實現(xiàn)最高效的數(shù)組亂序方法,數(shù)組亂序的意思是,把數(shù)組內(nèi)的所有元素排列順序打亂,需要的朋友可以參考下2014-10-10
JavaScript中解析JSON數(shù)據(jù)的三種方法
這篇文章主要介紹了JavaScript中解析JSON數(shù)據(jù)的三種方法,本文講解了eval()方法、new Function方法、JSON.parse()方法等三種方法,需要的朋友可以參考下2015-07-07
PixiJS學(xué)習(xí)之Sprite類的使用詳解
Sprite 直譯為 “精靈”,是游戲開發(fā)中常見的術(shù)語,就是將一個角色的多個動作放到一個圖片里,通過裁剪局部區(qū)域得到當(dāng)前的角色狀態(tài)圖。本文主要介紹了PixiJS中Sprite類的使用,需要的可以參考一下2023-02-02
JavaScript導(dǎo)航腳本判斷當(dāng)前導(dǎo)航
這篇文章主要介紹了JavaScript導(dǎo)航腳本判斷當(dāng)前導(dǎo)航的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07

