🦖我是Sam9029,一个前端
Sam9029的掘金主页:Sam9029的掘金主页
**🐱🐉🐱🐉恭喜你,若此文你认为写的不错,不要吝啬你的赞扬,求收藏,求评论,求一个大大的赞!👍**
今日本想说些啥,想想无事,便不说些啥了,话不多说,直接上活
展示地址:Vue3小项目–评论列表 - 码上掘金 (juejin.cn)
效果展示:
全为本地数据操作
源数据和接下来要创建的整合对象 格式皆为 数组包对象; [{},{},……]
源数据中 一级评论与二级评论 都在对象的同一属性层级(且有对应的不同id)
[
{ id: 1, nick_name: "冬天的雨", content: "非常好的文章!", parent_id: 0, time: 1625454585, boolChild: false },
{ id: 16, nick_name: "用户9527", content: "收藏饿了", parent_id: 1, time: 1625454733, boolChild: false},
……
]
HTML+CSS样式新对象数组--整合对象整合对象通过侦听器(深度加立即侦听) 操作筛选 整合对象(对象) 以下内容
对象)
数组)
false)
- 整合对象
json结构如下:[ { itemId:'' parent:{}, chlid:[{},{}], isShowChild:false }, ……… ]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
updateCommentData)来 创建新的整合对象源码
// 被渲染的数据 及`整合对象`
let renderData = ref()
function updateCommentData(){
// 深拷贝 消除 影响源数据
let deepCloneOriginData = JSON.parse(JSON.stringify(originCommentListData.data))
// 筛出 一级评论
let parentData = deepCloneOriginData.filter(item => item.parent_id === 0)
// 筛出 二级评论
let childData = deepCloneOriginData.filter(item => item.parent_id !== 0)
let newRenderData = []
for (let i = 0; i < parentData.length; i++) {
newRenderData.push({
// 使用nanoid
itemId:parentData[i].id,
//parent为对象,且只有一个层级属性 使用浅拷贝
parent: {...parentData[i]},
//parent为数组包对象,有两个层级属性 使用深拷贝
child: JSON.parse(JSON.stringify(childData.filter(item=>item.parent_id===parentData[i].id))),
isShowChild:false
})
}
//
renderData.value = JSON.parse(JSON.stringify(newRenderData))
// 测试输出
// console.log(JSON.parse(JSON.stringify(renderData.value)))
// 返回筛出数据 return 此场景可有可无
return newRenderData
}
关键解析:
- 使用一级评论的id 作为 新的对象的id
itemId:parentData[i].id- parent为对象,且只有一个层级属性 使用浅拷贝
parent: {…parentData[i]},- parent为数组包对象,有两个层级属性 使用深拷贝
child: JSON.parse(JSON.stringify(childData.filter(item=>item.parent_id===parentData[i].id))),- 展开二级评论 控制
isShowChild:false
// 监听 并创建 新的渲染评论列表 数据
watch(
()=>originCommentListData.data,
updateCommentData,
{deep:true,immediate:true}
)
updateCommentData 这时数据被侦听到变化时,执行的函数
{deep:true,immediate:true} 执行深度侦听与立即侦听(页面初始加载就执行一次)
一级评论新增直接push进源数据
一级评论新增同样直接push进源数据
watch 监听 会 实时更新整合数据
注意❗❗-此时问题出现,一级评论直接渲染,但是二级评论展开由isShowChild控制
那新增 二级评论后 watch 整合对象实时更新的 isShowChild 会变成默认的 fasle, 此时执行 重新渲染,对应得(此前新增)二级就不会展开
解决方式:
将新增得二级评论所在得整合对象中的 itemid 在外面使用 响应式数据 存起来(levelTwoReControlId)
使用生命周期的更新函数 onUpdated (更新渲染完成后)
render 根据 levelTwoReControlId 找到对应得二级评论所在,改变其中的isShowChild为true,之后清空levelTwoReControlId的值isShowChild 得布尔值变化回复上JSON.parse(JSON.stringify(Obj)))即可满足深拷贝的需求// 时间戳 转换 处理
function timeToggle(_time){
let commentDate = new Date(_time)
let year = commentDate.getFullYear()
let month = commentDate.getMonth() + 1
let date = commentDate.getDate()
let commentClock = commentDate.toString().split(' ')[4]
return `${year}/${month}/${date} ${commentClock}`
}
作为练手,项目还存在诸多不足待发现,后续持续改进
应无所往
文章若有错误,敬请指正🙏
**🐱🐉🐱🐉恭喜你,都看到这了,求收藏,求评论,求一个大大的赞👍!不过分吧**Sam9029的掘金主页:Sam9029的掘金主页
数合并