需求
最近在做微信小程序的时候,需要实现在搜索框的输入内容的时候实现全局匹配实现高亮效果,目前的思路是,递归后台来返回的数据,并将对象的value值替换为需要的dom节点,并且通过rich-text来实现,高亮效果。
代码
wxml:
<view class=\'homePage\'> <input bindinput=\"bindKeyInput\"></input> <view wx:for=\"{{newJson}}\" wx:for-item=\'item\' wx:key> <rich-text nodes=\"{{item.name}}\"></rich-text> <rich-text nodes=\"{{item.address}}\"></rich-text> <rich-text nodes=\"{{item.age}}\"></rich-text> <view wx:if=\"{{item.aihao}}\" wx:for=\"{{item.aihao}}\" wx:for-item=\'sitem\' wx:key> <rich-text nodes=\"{{sitem}}\"></rich-text> </view> </view> </view>
js:
//index.js const app = getApp() Page({ data: { json: [{ name: \'eiolewkfp\', age: \'awdqwwdk\', address: \'aueifwhefwfheffoewjowef\',aihao:[\'sdsd\',\'sdfsd\',\'sdsf\']}, { name: \'98797\', age: \'6544656\', address: \'65494364\' }], // 可以是任何类型的数据 newJson: \'\', tempText:\'\' }, onLoad: function (options) { this.setData({ newJson:this.data.json }) }, digui: function (newJson,obj,key) { // 递归方法,来遍历最内层的字符串并通过正则来替换 var that = this; var reg = new RegExp(that.data.tempText,\'g\'); if (newJson.constructor == Array) { newJson.forEach(function (item,index) { if (item.constructor == String){ obj[key].splice(index, 1, item.replace(reg, \"<span style=\'color:red\'>\" + that.data.tempText + \"</span>\")) }else{ that.digui(item, newJson); } }); } else if (newJson.constructor == Object) { var json = {}; for (var key in newJson) { json[key] = newJson; that.digui(newJson[key],newJson,key); } } else if (newJson.constructor == String) { // 这里做全局替换 if(key){ obj[key] = newJson.replace(reg, \"<span style=\'color:red\'>\" + that.data.tempText + \"</span>\") } } }, bindKeyInput: function (e) { // 每次输入来监听键盘,处理匹配的数据 var text = e.detail.value; this.setData({ tempText:text }) var newJson = JSON.parse(JSON.stringify(this.data.json)); // 实现深复制 this.digui(newJson); this.setData({ newJson:newJson }) } })
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
© 版权声明
THE END
暂无评论内容