需求
最近在做微信小程序的时候,需要实现在搜索框的输入内容的时候实现全局匹配实现高亮效果,目前的思路是,递归后台来返回的数据,并将对象的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 }) } })
相信看了本文案例你已经掌握了方法,更多精彩请关注编程之家网其它相关文章!
推荐阅读: