在uni-app中我们会遇到搜索高亮显示的需求
如下图:
起初用的是富文本实现
使用replaceAll方法取代搜索字段为一个
/* 搜索字体变色 */
export const searchColour = (text:string,searchKey:string)=>{
return text.replaceAll(searchKey,`<text>${searchKey}</text>`)
}
用第三方库 mp-html 富文本组件
库的链接地址为:https://ext.dcloud.net.cn/plugin?id=805
这次将
封装特定的高亮渲染组件
原理就是根据搜索字段,将渲染字符串转化为对象,标记高亮字段,然后分别渲染
下面上封装组件代码:
<template>
<text v-for="(item,index) in renderString" :key="index" :class="{'high-light':item.highLight}">{{item.text}}
</text>
</template>
<script setup lang='ts'>
import {
computed
} from "vue";
const props = withDefaults(defineProps < {
textString: string,
searchValue: string
} > (), {
})
const renderString = computed(() => {
return getTextObj(props.textString, props.searchValue)
})
function getTextObj(str: string, searchKey: string) {
let strObj = [];
let index = 0;
if (searchKey == '') {
return [{
text: str,
highLight: false
}]
}
while (index < str.length) {
let pos = str.indexOf(searchKey, index);
if (pos === -1) {
strObj.push({
text: str.slice(index),
highLight: false
});
break;
}
if (pos !== 0) {
strObj.push({
text: str.slice(index, pos),
highLight: false
});
}
strObj.push({
text: searchKey,
highLight: true
});
index = pos + searchKey.length;
}
return strObj;
}
</script>
<style lang='scss' scoped>
.high-light {
color: #DF2D45;
}
</style>
然后样式就比较好设置了
有帮助到你的话,点个赞吧!