uni-app 微信小程序 搜索关键字后结果变色

文章展示了如何在小程序的HTML代码中,利用JavaScript过滤器函数formatMc结合正则表达式动态匹配和高亮显示搜索关键字。当搜索值变化时,通过RegExp对象创建动态正则,然后用replace方法替换匹配到的关键字,用<font>标签包裹以改变颜色。这种方法在使用rich-text组件渲染时尤其有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先看效果:

在这里插入图片描述
具体代码如下:
html代码

*[HTML]:  没有使用花括号渲染,所以需要 $options.filters 来找到过滤器
*[HTML]:  item.cpmc 为需要添加颜色的 段落内容
*[HTML]:  searchValue 为当前搜索框搜索的 关键字
<view class="lc-name" v-html="$options.filters.formatMc(item.cpmc, searchValue)"></view>

javascript代码:

// 由于 关键字val  是动态变化的所以需要 RegExp() 方法定义正则
filters: {
	formatMc(mc, val ) {
		let reg = RegExp(val,"g")
		console.log('format',reg, mc, val)
		return mc.replace(reg, '<font style="color: #D7001E;">' + val + '</font>')
	}
},

由于在小程序中是使用 rich-text 进行渲染的,所以在设置颜色的时候要使用
<font 标签来包裹才能使颜色生效

<think>嗯,用户想用uni-app和Flask开发一个课程预约的微信小程序,需要实现联想搜索功能。首先,我得弄清楚什么是联想搜索,应该是指用户在输入关键词时,系统能实时提示相关的课程名称,比如输入“数学”就出现“数学基础”、“高等数学”这样的建议。这种功能通常叫做自动完成或者搜索建议。 那前端部分用uni-app,后端用Flask,怎么实现呢?先从uni-app这边开始考虑。用户输入的时候,需要监听输入事件,比如每次输入内容变化时就向后端发送请求获取建议。不过要注意防抖,避免频繁请求,可能设置一个定时器,比如300毫秒内没有新输入才发送请求。 然后,前端需要处理用户输入,用JavaScript截取输入值,然后通过uni.request发送GET或POST请求到Flask后端。接收到返回的数据后,更新页面的建议列表,显示在输入框下方。这部分界面可以用条件渲染,比如v-if或者uni的指令,当有建议数据时显示列表,点击某个建议项时填充到输入框并触发搜索。 接下来是后端Flask的处理。需要建立一个API接口,比如/search/suggest,接收前端传来的查询关键词。后端拿到关键词后,去数据库里模糊匹配课程名称。这里可能需要用到SQL的LIKE语句,或者如果数据库支持全文搜索的话更高效。比如在MySQL中,SELECT name FROM courses WHERE name LIKE '%keyword%' LIMIT 5,但要注意性能,尤其是当数据量大时,LIKE可能会导致全表扫描,可以考虑使用全文索引或者其他优化手段。 然后,将查询结果封装成JSON格式返回给前端。Flask这边可以用jsonify来处理返回数据。另外,可能还要处理跨域问题,因为前端和后端可能部署在不同的域,所以需要配置CORS,可以使用flask-cors扩展。 另外,安全性方面,需要对用户的输入进行适当的过滤,防止SQL注入,比如使用参数化查询,而不是拼接字符串。比如在Flask中使用SQLAlchemy的话,可以避免手动拼接SQL,提高安全性。 还有,联想搜索的性能很重要,特别是当用户量大的时候。可能需要考虑缓存机制,比如用Redis缓存热门搜索关键词的建议结果,减少数据库查询压力。或者使用更高效的搜索技术,比如Elasticsearch,但可能对于小型项目来说有点复杂,得看用户的需求和资源情况。 另外,前端展示的时候,可能需要高亮匹配的部分,比如用户输入“数学”,在建议里把“数学”加粗或者变色。这需要后端返回的数据中包含匹配的位置,或者前端用正则表达式处理。比如用JavaScript的replace方法,将匹配的关键词替换成带样式的文本。 测试的时候要注意不同情况,比如输入为空、没有匹配结果、网络请求失败等情况的处理。前端应该有加载状态提示,比如显示“正在搜索...”,或者错误提示。 总结一下,步骤大概是:前端监听输入,防抖处理,发送请求到后端;后端处理查询,返回建议列表前端展示建议,处理用户选择。中间要注意性能、安全性和用户体验的优化。</think>实现课程联想搜索功能可分为前端uni-app实现和后端Flask处理两个部分,以下是分步骤实现方案: 一、前端uni-app实现(微信小程序端) 1. 输入框监听 ```javascript // 在vue模板中使用防抖函数 <template> <input @input="debounceInput" placeholder="输入课程名称"/> <view v-if="suggestions.length" class="suggestion-list"> <view v-for="(item,index) in suggestions" :key="index" @tap="selectSuggestion(item)"> {{ item.name }} </view> </view> </template> ``` 2. 防抖函数实现(300ms延迟) ```javascript data() { return { timer: null, suggestions: [] } }, methods: { debounceInput(e) { clearTimeout(this.timer) this.timer = setTimeout(() => { this.getSuggestions(e.detail.value) }, 300) } } ``` 3. 请求联想数据 ```javascript async getSuggestions(keyword) { if (!keyword.trim()) { this.suggestions = [] return } const res = await uni.request({ url: 'https://your-flask-api.com/search/suggest', method: 'GET', data: { q: keyword } }) if (res.statusCode === 200) { this.suggestions = res.data } } ``` 二、后端Flask实现 1. 创建搜索建议接口 ```python from flask import request, jsonify from flask_cors import CORS app = Flask(__name__) CORS(app) # 解决跨域问题 @app.route('/search/suggest', methods=['GET']) def suggest_courses(): keyword = request.args.get('q', '').strip() if not keyword: return jsonify([]) # 示例使用SQLAlchemy查询 suggestions = Course.query.filter( Course.name.ilike(f'%{keyword}%') ).limit(5).all() return jsonify([{ 'id': c.id, 'name': c.name } for c in suggestions]) ``` 2. 数据库优化建议 - 为课程名称字段添加全文索引 - 使用缓存机制(Redis)存储热门搜索 ```python # 示例Redis缓存实现 import redis r = redis.Redis(host='localhost', port=6379, db=0) @app.route('/search/suggest') def suggest_courses(): keyword = request.args.get('q', '') cache_key = f"suggest:{keyword}" # 检查缓存 cached = r.get(cache_key) if cached: return jsonify(json.loads(cached)) # 数据库查询 results = query_database(keyword) # 缓存5分钟 r.setex(cache_key, 300, json.dumps(results)) return jsonify(results) ``` 三、增强功能建议 1. 安全优化 - 限制请求频率 - 参数过滤防止SQL注入 ```python from sqlalchemy import text # 安全查询方式 query = text("SELECT * FROM courses WHERE name LIKE :keyword") db.session.execute(query, {'keyword': f'%{keyword}%'}) ``` 2. 搜索算法优化 - 增加拼音搜索支持 ```python # 使用pypinyin库实现 from pypinyin import lazy_pinyin def chinese_to_pinyin(text): return ''.join(lazy_pinyin(text)) # 在查询条件中增加拼音匹配 Course.query.filter( db.or_( Course.name.ilike(f'%{keyword}%'), Course.pinyin.ilike(f'%{chinese_to_pinyin(keyword)}%') ) ) ``` 四、性能优化建议 1. 前端 - 增加请求取消机制 - 添加loading状态提示 2. 后端 - 使用Elasticsearch实现全文检索 - 部署Nginx进行负载均衡 - 建立数据库从库进行读写分离 实现效果:当用户输入"高数"时,会立即显示"高等数学A"、"高等数学进阶"等相关课程建议,点击即可快速跳转到详情页。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值