您好,登录后才能下订单哦!
请求超时!
请点击 重新获取二维码
这篇文章主要讲解了“Vue如何实现简单搜索功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue如何实现简单搜索功能”吧!
在vue项目中,搜索功能是我们经常需要使用的一个场景,最常用的是在列表数据中搜索一个想要的,今天的例子就是我们实现vue从列表数据中搜索,并展示。
这里我们进行简单搜索功能,搜索逻辑是只要用户输入值与产品的名称进行模糊匹配,符合条件的数据进行展示,不符合条件的数据过滤。流程描述如下:
用户点击搜索框,输入内容;
检测到搜索框值变化,取用户输入值;
对用户输入值进行判断,若为空,则展示原列表,不为空则进行筛选;
将用户输入值与所有列表数据进行遍历匹配,若匹配,则展示匹配条目,完成搜索。
这张图仅代表最简单的搜索流程,若需要进行一些复杂的处理,可以进行修改,比如说匹配的商品名称关键字变色等。
实现如上图功能,我们肯定是使用vue的组件特性,将搜索以及,产品列表抽成组件,以提高代码复用性,抽成组件之后,该页面将由三个部分组成,数据在以下三个组件之间传递:
父组件:主页面,用于数据逻辑处理;
搜索组件:给父组件传递用户输入值;
列表:展示从父组件接收的值。
父组件:index.vue
<template> <div> <title-bar :title="title" @goBack="goback"></title-bar> <search-input :plhText="searchPlhText" @input-changed="searchInputChange" ></search-input> <div v-for="(prd,index) in productListRst" :key="index"> <prd-item :prd="prd" @toPrdDetail="toPrdDetail"></prd-item> </div> </div> </template> <script> import TitleBar from "@/components/TitleBar"; import SearchInput from "./components/SearchInput"; import PrdItem from './components/PrdItem'; export default { name: "", components: { TitleBar, SearchInput, PrdItem }, data() { return { title: "产品列表", searchPlhText: "请输入产品名称", productList: {}, // 产品列表 productListRst: {}, // 搜索筛选之后的产品列表 } }, created() { // 初始化页面参数,按照生命周期,子组件需要的参数父组件需要在created生命周期取值 this.initParams(); }, methods: { // 返回方法 goback() { // this.$emit("GoBack"); }, // 初始化页面参数,获取产品列表 initParams() { this.productList = [ { imgPath: 'apple-1001.png', name: 'Apple iPad Air 平板电脑(2020新款)', price: '4799.00', sale: '5', ranking: '10000+评价 平板热卖第5名', prdShopName: 'Apple官方旗舰店' }, { imgPath: 'apple-1002.png', name: 'Apple iPhone 11手机', price: '4999.00', sale: '5', ranking: '375万+评价', prdShopName: 'Apple官方旗舰店' }, { imgPath: 'apple-1003.jpg', name: 'Apple AirPods 配充电盒 Apple蓝牙耳机', price: '1246.00', sale: '5', ranking: '200万+评价', prdShopName: 'Apple官方旗舰店' }, ]; this.productListRst = this.productList; }, // 每次search框变化则进行筛选,对数据进行逻辑处理 searchInputChange(value) { // 若未输入值,则展示所有数据 if(null === value || undefined === value){ this.productListRst = this.productList; } else { this.productListRst = []; // 结果列表置空 let regStr = ''; // 初始化正则表达式 for(let i=0; i<value.length; i++){ regStr = regStr + '(' + value[i] + ')([\\s]*)'; //跨字匹配 } let reg = new RegExp(regStr); console.log(reg); for(let i=0; i<this.productList.length; i++){ let name = this.productList[i].name; //按照名字匹配 let regMatch = name.match(reg); if(null !== regMatch) {// 将匹配的数据放入结果列表中 this.productListRst.push(this.productList[i]); } } } }, // 去往产品详情页 toPrdDetail(){ this.$router.push({path: 'detail'}) } } }; </script> <style scoped> #page-title { width: 100%; background-color: #fff; display: flex; justify-content: center; } .backImg { width: 20px; } </style>
主要的逻辑处理是 searchInputChange,对于更复杂的搜索逻辑,也可以在里面进行处理。
搜索组件:searchInput.vue
<template> <div class="search-box"> <div class="search-input"> <img src="@/assets/images/search.png" /> <input type="text" :placeholder="plhText" maxlength="10" @change="inputChange" v-model="inputValue" /> </div> </div> </template> <script> export default { name: "searchInput", // 搜索输入框 props: { // input框占位文字 plhText: { type: String, default: "请输入搜索内容" } }, data() { return { inputValue: "" //输入框的值 }; }, methods: { // 每次输入框变化刷新列表 inputChange() { // 使用emit给父组件传值 this.$emit('input-changed', this.inputValue); } } }; </script>
列表组件:productList.vue
<template> <div class="prd-item" @click="toPrdDetail"> <img :src="require('@/assets/images/'+prd.imgPath)"> <div class="prd-discription"> <div class="prd-title">{{ prd.name }}</div> <div class="prd-sellInfo"> <div class="prd-price">{{ prd.price }}</div> <div class="prd-saleLable" v-if="prd.sale.lenght!==0"> <label>12期免息</label> <span>新品</span> </div> <div class="prd-ranking">{{ prd.ranking }}</div> <div class="prd-shop">{{ prd.prdShopName }}</div> </div> </div> </div> </template> <script> export default { props: { // 传入产品对象,必传属性为imgPath,name,price,shop prd: { type: Object, } }, methods: { // 跳转产品详情页面 toPrdDetail() { this.$emit("to-prd-detail",this.prd.Id); } } }; </script>
标题头组件:titleBar
<template> <div class="page-title"> <div class="backImg" @click="goBack"> <img src="@/assets/images/arrow_left.png" /> </div> <div class="titleText"> <label>{{ title }}</label> </div> <div v-if="showRightArea" class="rightImg"> <img :src="rightImgPath" /> </div> </div> </template> <script> export default { name: "titleBar", props: { // 标题 title: { type: String, //规定数据类型 default: "标题" //默认值 }, showRightArea: { type: Boolean, default: false }, rightImgPath: { type: String } }, methods: { // 返回方法 goBack() { this.$emit("go-back"); } } }; </script> <style lang="scss" scoped> .page-title { width: 100%; background-color: #fff; display: flex; padding: 10px 0; justify-content: flex-start; } .backImg { width: 15%; text-align: center; img { margin: 0 auto; width: 24px; } } .titleText { font-size: 18px; height: 26px; width: 70%; text-align: center; label { margin: 0 auto; } } .rightImg { width: 15%; text-align: center; img { margin: 0 auto; width: 24px; } } </style>
以上代码为部分代码,css代码不包含在内。
以上代码实现的效果如下动态图:
感谢各位的阅读,以上就是“Vue如何实现简单搜索功能”的内容了,经过本文的学习后,相信大家对Vue如何实现简单搜索功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
聚圣源丛姓男孩起名石家庄起名改名拐点是什么意思王爷不可以!(限)暖冬TXT高字起名企业起名称吉凶测试打分北宋生活顾问苏州市学校安全教育平台亡羊补牢的亡是什么意思卢姓男孩起名2020方姓男孩起名学期教学工作总结大同刀削面加盟云南新增6例本土确诊病例纨绔变速齿轮地道战观后感300字我的莫格利男孩免费观看杨氏宝宝起名单名古玩虫姓凌的女人起名4399动画片大全男孩韦字起名未来日记oad暴风女神哪些起名用的字五行属火水果店起名姓徐起名字屈原的简介资料sanwen淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费