写在前面
如果没有木木老师的《Memos x Twikoo》我是根本不会把这两个毫不相干的系统联系起来的,在给Memos添加了Twikoo评论系统之后,因为增加了社交属性,所以BB的时候,都更带劲了。而美中不足的就是如果需要评论,需要跳转到Memos的页面内,这对于用户体验来说,还是略有不足的。而就在前不久,拾月老师的一篇《单页 Memos 添加 Artalk 评论,无限接近微博》让评论系统嵌入Memos页面内,从而可以沉浸式边BB边吐槽,让Momos从一个记录工具成功变身微博、朋友圈,可玩性大增。只不过我看教程用的都是Artalk
这个评论工具,作为用着Twikoo
很顺手,并不想更换的我来说,只能自己根据大佬们提供的思路,自行折腾了。
评论数量
关于Memos页面的搭建,直接用木木老师的就好。木木老师开发的版本,代码逻辑清晰,功能完善,开箱即用。Twikoo评论数量的实现在官网有相应API。
批量获取文章评论数
twikoo.getCommentsCount({
envId: '您的环境id', // 环境 ID
// region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
urls: [ // 不包含协议、域名、参数的文章路径列表,必传参数
'/2020/10/post-1.html',
'/2020/11/post-2.html',
'/2020/12/post-3.html'
],
includeReply: false // 评论数是否包括回复,默认:false
}).then(function (res) {
console.log(res);
// 返回示例: [
// { url: '/2020/10/post-1.html', count: 10 },
// { url: '/2020/11/post-2.html', count: 0 },
// { url: '/2020/12/post-3.html', count: 20 }
// ]
}).catch(function (err) {
// 发生错误
console.error(err);
});
请求中,需要一个评论URL的数组,所以我的思路是先通过Api获取Memos的数据。在遍历获取到的数据之后,拿到我所希望的由URL组成的数组。
直接在 getFirstList() 方法中增加一个方法 updateTiwkoo(),并传值。
function getFirstList() {
var bbUrl = memos + "api/memo?creatorId=" + bbMemo.creatorId + "&rowStatus=NORMAL&limit=" + limit;
fetch(bbUrl).then(res => res.json()).then(resdata => {
updateTiwkoo(resdata.data)
var nowLength = resdata.data.length
if (nowLength < limit) { //返回数据条数小于 limit 则直接移除“加载更多”按钮,中断预加载
document.querySelector("button.button-load").remove()
return
}
page++
offset = limit * (page - 1)
getNextList()
});
}
function updateTiwkoo(data) {
var twiID = data.map((item) => memos + "m/" + item.id);
twikoo.getCommentsCount({
envId: envId, // 环境 ID
urls: twiID,
includeReply: true // 评论数是否包括回复,默认:false
}).then(function (res) {
updateCount(res)
}).catch(function (err) {
console.error(err);
});
function updateCount(res) {
var twiCount = res.map((item) => {
return Object.assign({},{'count':item.count})
});
var bbTwikoo = data.map((item,index) => {
return {...item, ...twiCount[index]};
});
updateHTMl(bbTwikoo)
}
}
在获取到评论数的数据后,直接将两个数组合并。形成一个包含有评论数的新数组。
评论内容
主要是在 Memos
页面内增加一个 供 Twikoo
初始化的容器。并通过一系列触发操作显示渲染。详细如下:
首先,我们需要在页面内增加一个按钮,通过点击来触发评论加载。
<a onclick='loadTwikoo(memosId)'></a>
其次,我们需要一个容纳 Twikoo
评论的容器,未触发时该容器隐藏。
<div class='twikoo-body twikoo-memosId d-none'></div>
最后,我们需要一个点击事件,将评论初始化。
function loadTwikoo(memosId) {
var twikooDom = document.querySelector('.twikoo-memosId');
var twikooCon = "<div id='twikoo'></div>"
if (twikooDom.classList.contains('d-none')) {
document.querySelectorAll('.twikoo-body').forEach((item) => {item.classList.add('d-none');})
if(document.getElementById("twikoo")){
document.getElementById("twikoo").remove() //如果页面中已经有其他Twikoo初始化,则移除。
}
twikooDom.insertAdjacentHTML('beforeend', twikooCon);
twikooDom.classList.remove('d-none');
twikoo.init({
envId: envId,
el: '#twikoo',
path: memosPath + "/m/" + memosId
});
}else{
twikooDom.classList.add('d-none');
document.getElementById("twikoo").remove()
}
}
值得一提的是,需要将该 Twikoo
的ID值传给触发的方法。
最终效果
效果如下