<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在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搜尋功能內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45