Markdown 编辑器的核心功能之一就是边写边看,为此我们实现了固定高度的编辑框和预览框,并且让它们能够同步滚动和更新内容。以下是实现的关键代码片段:
在小程序中,通过 scroll-view
和 textarea
的事件绑定,我们可以监听滚动行为并同步到另一个区域:
<scroll-view class="editor-container" scroll-y bindscroll="onEditorScroll" scroll-top="{{editorScrollTop}}">
<textarea
class="editor"
bindinput="onInput"
value="{{content}}"
placeholder="在此输入 Markdown 内容..."
id="editorTextarea">
</textarea>
</scroll-view>
<scroll-view class="preview-container" scroll-y bindscroll="onPreviewScroll" scroll-top="{{previewScrollTop}}">
<view class="markdown-preview">
<rich-text nodes="{{previewContent}}" />
</view>
</scroll-view>
编辑框和预览框可以通过以下代码实现滚动同步:
Page({
data: {
content: '', // 用户输入的 Markdown 内容
previewContent: '', // 预览内容
editorScrollTop: 0,
previewScrollTop: 0,
},
onInput(e) {
const input = e.detail.value;
this.setData({
content: input,
previewContent: this.convertMarkdown(input), // 将 Markdown 转为预览 HTML
});
},
onEditorScroll(e) {
this.setData({
previewScrollTop: e.detail.scrollTop,
});
},
onPreviewScroll(e) {
this.setData({
editorScrollTop: e.detail.scrollTop,
});
},
convertMarkdown(content) {
// 这里使用第三方库(如 marked.js)转换 Markdown 为 HTML
return marked(content);
},
});
通过这一功能,用户可以在一个页面中实时输入 Markdown 内容,并看到转为 HTML 的预览效果。
我们发现,用户可能会加载较大的 Markdown 文件,这可能导致小程序页面卡顿。为了避免此问题,我们通过设置文件大小限制和引入防抖机制优化了输入与渲染的性能。
Markdown 文件通常是文本文件,为了限制加载过大的文件,我们动态判断文件大小,并提示用户文件过大。以下是实现代码:
Page({
data: {
maxSize: 1048576, // 1MB 限制
},
onInput(event) {
const input = event.detail.value;
const byteSize = this.getByteSize(input);
if (byteSize > this.data.maxSize) {
wx.showToast({
title: '文件大小超过 1MB!',
icon: 'none',
});
return;
}
this.setData({
content: input,
});
},
getByteSize(str) {
let size = 0;
for (let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
size += charCode <= 0x7f ? 1 : charCode <= 0x7ff ? 2 : charCode <= 0xffff ? 3 : 4;
}
return size;
},
});
用户编辑完成的 Markdown 文件可以保存到本地,并通过分享路径给好友。我们使用了微信小程序的 wx.setStorageSync
和高级分享功能实现了这两个需求:
saveFile() {
try {
const fileName = `markdown_${Date.now()}.md`;
wx.setStorageSync(fileName, this.data.content);
wx.showToast({
title: '文件已保存',
});
} catch (e) {
wx.showToast({
title: '保存失败',
icon: 'none',
});
}
}
通过小程序路径参数实现文件的分享与打开:
onShareAppMessage() {
const path = `/pages/editor/editor?filePath=${encodeURIComponent(this.data.filePath)}`;
return {
title: '查看我的 Markdown 文件',
path: path,
};
}
通过以上逻辑,好友点击分享链接后可以直接在预览页面查看文件内容,进一步提升了协作效率。
微信小程序的 supportedMaterials
配置能够允许从聊天中直接打开指定类型的文件,但由于微信小程序限制,这个配置无法支持 .md
文件类型。如果需要从聊天中打开 .md
文件,只能通过文件选择页面间接实现:
chooseFile() {
wx.chooseMessageFile({
count: 1,
type: 'file',
success: (res) => {
const file = res.tempFiles[0];
if (file.name.endsWith('.md')) {
this.loadFile(file);
} else {
wx.showToast({
title: '请选择 Markdown 文件',
icon: 'none',
});
}
},
});
},
loadFile(file) {
wx.getFileSystemManager().readFile({
filePath: file.path,
encoding: 'utf8',
success: (res) => {
this.setData({
content: res.data,
});
},
});
}
通过上述技术实现,Markdown轻助手 支持以下核心功能:
需要注意的是
不建议手机上进行编辑,主要是用来预览的,一是因为电脑编辑markdown会很方便,二是因为由于微信保存文件的问题
另外本意是想在聊天中打开文件后,使用更多文件打开的方式来简化操作,但由于微信的限制暂时无法支持。