国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

使用Fuse.js將動態(tài)搜索添加到React應(yīng)用

移動開發(fā) Android
Fuse.js是一個輕量級的搜索引擎,可以在用戶的瀏覽器中的客戶端運行。讓我們看看如何使用它來輕松地為React應(yīng)用添加搜索功能。

Fuse.js是一個輕量級的搜索引擎,可以在用戶的瀏覽器中的客戶端運行。讓我們看看如何使用它來輕松地為React應(yīng)用添加搜索功能。

[[402547]]

何時使用Fuse.js

搜索功能對很多類型的網(wǎng)站都很有用,可以讓用戶高效地找到他們想要的東西。但為什么我們會專門選擇使用Fuse.js呢?

為搜索提供動力的選擇有很多,最簡單的可能是使用現(xiàn)有的數(shù)據(jù)庫。例如,Postgres有一個全文搜索功能。MySQL也有,Redis也有RediSearch模塊。

還有一些專門的搜索引擎,其中Elasticsearch和Solr是最受歡迎的。這些搜索引擎需要更多的設(shè)置,但它們擁有你的用例可能需要的高級功能。

最后,你可以使用Algolia或Swiftype等搜索即服務(wù)平臺。這些服務(wù)運行自己的搜索基礎(chǔ)架構(gòu)。你只需通過API提供數(shù)據(jù)、配置和查詢。

但是,您可能不需要這些解決方案所暴露的能力,這可能需要大量的工作來實現(xiàn),更不用說成本了。如果沒有太多的數(shù)據(jù)需要搜索,F(xiàn)use.js需要最小的設(shè)置,并且可以提供比您自己可能想到的更好的搜索體驗。

至于多少數(shù)據(jù)對Fuse.js來說是過多的,考慮到Fuse.js需要訪問整個數(shù)據(jù)集,所以你需要在客戶端全部加載。如果數(shù)據(jù)集的大小是100MB,那就超出了發(fā)送給客戶端的合理范圍。但如果它只有幾千字節(jié),它可能是Fuse.js的一個很好的候選者。

構(gòu)建一個Fuse.js + React演示應(yīng)用程序

讓我們做一個基本的React應(yīng)用,使用Fuse.js讓用戶搜索狗的品種。你可以在這里查看最終的結(jié)果,源代碼可以在GitHub上找到。

我們將從設(shè)置一些腳手架開始。從一個新的Node.js項目開始,我們將安裝React和Fuse.js:

  1. npm install --save react react-dom fuse.js 
  2. //or 
  3. yarn add react react-dom fuse.js 

我們還將安裝Parcel作為開發(fā)依賴項:

  1. npm install --save-dev parcel@2.0.0-beta.1 
  2. //or 
  3. yarn add --dev parcel@2.0.0-beta.1 

我們將在 package.json 啟動腳本中使用它來編譯應(yīng)用程序:

  1. {   
  2.   "scripts": { 
  3.     "start": "parcel serve ./index.html --open" 
  4.   } 

接下來,我們將創(chuàng)建一個barebones index.html,其中包含一個空的 div 供React渲染,以及一個 noscript 消息,以避免在用戶禁用JavaScript時出現(xiàn)空白頁面。

  1. <!DOCTYPE html> 
  2. <html lang="en"> 
  3.   <body> 
  4.     <div id="app"></div> 
  5.     <noscript> 
  6.       <p>Please enable JavaScript to view this page.</p> 
  7.     </noscript> 
  8.     <script src="./index.js"></script> 
  9.   </body> 
  10. </html> 

我們將使我們的 index.js 簡單的開始。我們將渲染一個有搜索查詢輸入的表單,盡管我們還不會實際處理搜索。

  1. import React, { useState } from "react"; 
  2. import ReactDom from "react-dom"; 
  3.  
  4. function Search() { 
  5.   return ( 
  6.     <form> 
  7.       <label htmlFor="query">Search for a dog breed:</label> 
  8.       <input type="search" id="query" /> 
  9.       <button>Search</button> 
  10.     </form> 
  11.   ); 
  12.  
  13. ReactDom.render(<Search />, document.getElementById("app")); 

此時,如果你運行 npm run start 或 yarn run start,Parcel應(yīng)該會在瀏覽器中打開網(wǎng)站,你應(yīng)該會看到這個表單。

實施搜索

現(xiàn)在開始實施搜索,我們將從顯示搜索結(jié)果的組件開始。我們需要處理三種情況:

  • 用戶尚未執(zhí)行搜索時
  • 沒有查詢結(jié)果時(因為我們不希望用戶認(rèn)為某些問題)
  • 什么時候有結(jié)果顯示

我們將在ordered list中顯示所有結(jié)果。

  1. function SearchResults(props) { 
  2.   if (!props.results) { 
  3.     return null; 
  4.   } 
  5.  
  6.   if (!props.results.length) { 
  7.     return <p>There are no results for your query.</p>
  8.   } 
  9.  
  10.   return ( 
  11.     <ol> 
  12.       {props.results.map((result) => ( 
  13.         <li key={result}>{result}</li> 
  14.       ))} 
  15.     </ol> 
  16.   ); 

我們也來編寫自己的搜索函數(shù)。稍后,我們將能夠?qū)⑽覀兊暮唵畏椒ǖ慕Y(jié)果與Fuse.js的結(jié)果進行比較。

我們的方法很簡單:我們將遍歷犬種數(shù)組(來自這個JSON列表),并返回包含整個搜索查詢的所有犬種。我們還會讓所有東西都小寫,這樣搜索就不區(qū)分大小寫了。

  1. const dogs = [ 
  2.   "Affenpinscher", 
  3.   "Afghan Hound", 
  4.   "Aidi", 
  5.   "Airedale Terrier", 
  6.   "Akbash Dog", 
  7.   "Akita", 
  8.   // More breeds.. 
  9. ]; 
  10.  
  11. function searchWithBasicApproach(query) { 
  12.   if (!query) { 
  13.     return []; 
  14.   } 
  15.  
  16.   return dogs.filter((dog) => dog.toLowerCase().includes(query.toLowerCase())); 

接下來,讓我們將所有內(nèi)容鏈接在一起,方法是從表單提交中獲取搜索查詢,然后執(zhí)行搜索并顯示結(jié)果。

  1. function Search() { 
  2.   const [searchResults, setSearchResults] = useState(null); 
  3.  
  4.   return ( 
  5.     <> 
  6.       <form 
  7.         onSubmit={(event) => { 
  8.           event.preventDefault(); 
  9.           const query = event.target.elements.query.value; 
  10.           const results = searchWithBasicApproach(query); 
  11.           setSearchResults(results); 
  12.         }} 
  13.       > 
  14.         <label htmlFor="query">Search for a dog breed:</label> 
  15.         <input type="search" id="query" /> 
  16.         <button>Search</button> 
  17.       </form> 
  18.  
  19.       <SearchResults results={searchResults} /> 
  20.     </> 
  21.   ); 

添加Fuse.js

使用Fuse.js很簡單,我們需要導(dǎo)入它,讓它使用 new Fuse() 對數(shù)據(jù)進行索引,然后使用索引的搜索功能。搜索會返回一些元數(shù)據(jù),所以我們將只提取實際的項目進行展示。

  1. import Fuse from "fuse.js"; 
  2.  
  3. const fuse = new Fuse(dogs); 
  4.  
  5. function searchWithFuse(query) { 
  6.   if (!query) { 
  7.     return []; 
  8.   } 
  9.  
  10.   return fuse.search(query).map((result) => result.item); 

元數(shù)據(jù)包括一個 refIndex 整數(shù),讓我們可以回溯到原始數(shù)據(jù)集中的相應(yīng)項目。如果我們用 new Fuse(dogs, {includeScore: true}) 初始化索引,我們也會得到匹配分?jǐn)?shù):一個介于0和1之間的值,其中0是完全匹配。那么“Husky”的搜索結(jié)果就會像這樣:

  1.   { 
  2.     item: "Siberian Husky", 
  3.     refIndex: 386, 
  4.     score: 0.18224241177399383 
  5.   } 

我們將在 Search 組件的表單中添加一個復(fù)選框,讓用戶選擇是否使用Fuse.js而不是基本的搜索函數(shù)。

  1. <form 
  2.   onSubmit={(event) => { 
  3.     event.preventDefault(); 
  4.     const query = event.target.elements.query.value; 
  5.     const useFuse = event.target.elements.fuse.checked; 
  6.     setSearchResults( 
  7.       useFuse ? searchWithFuse(query) : searchWithBasicApproach(query) 
  8.     ); 
  9.   }} 
  10. > 
  11.   <label htmlFor="query">Search for a dog breed: </label> 
  12.   <input type="search" id="query" /> 
  13.   <input type="checkbox" name="fuse" /> 
  14.   <label htmlFor="fuse"> Use Fuse.js</label> 
  15.   <button>Search</button> 
  16. </form> 

現(xiàn)在我們可以用Fuse.js進行搜索了!我們可以使用復(fù)選框來比較使用它和不使用它。

最大的區(qū)別在于Fuse.js可以容忍錯別字(通過近似字符串匹配),而我們的基本搜索則需要精確匹配。如果我們把“retriever”拼錯為“retreiver”,請查看基本搜索結(jié)果。

以下是針對同一查詢更有用的Fuse.js結(jié)果:

搜索多個字段

如果我們關(guān)心多個字段,我們的搜索可能會更復(fù)雜。例如,想象一下,我們想通過品種和原產(chǎn)國來搜索。Fuse.js支持這種用例。當(dāng)我們創(chuàng)建索引時,我們可以指定要索引的對象鍵。

  1. const dogs = [ 
  2.   {breed: "Affenpinscher", origin: "Germany"}, 
  3.   {breed: "Afghan Hound", origin: "Afghanistan"}, 
  4.   // More breeds.. 
  5. ]; 
  6.  
  7. const fuse = new Fuse(dogs, {keys: ["breed", "origin"]}); 

現(xiàn)在,F(xiàn)use.js將同時搜索 breed 和 origin 字段。

總結(jié)

有時候,我們不想花費資源去建立一個完整的Elasticsearch實例。當(dāng)我們有簡單的需求時,F(xiàn)use.js可以提供相應(yīng)的簡單解決方案。而正如我們所看到的,將它與React一起使用也是很簡單的。

即使我們需要更高級的功能,F(xiàn)use.js也允許給不同的字段賦予不同的權(quán)重,添加 AND 和 OR 邏輯,調(diào)整模糊匹配邏輯等等。當(dāng)你下次需要在應(yīng)用中添加搜索功能時,可以考慮使用它。

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2022-03-14 08:54:04

NetlifyHTMLReact

2021-05-26 14:39:27

FedoraLinux企業(yè)域

2011-11-15 14:52:39

Mac OSWindows域

2019-04-17 14:32:39

加密文件Windows 10搜索結(jié)果

2011-07-18 10:32:39

域控制器

2017-05-09 14:00:00

SambaWinbindUbuntu

2018-10-15 09:30:11

ChromeYouTubeLinux

2020-02-11 12:54:34

Linux日志文件消息

2011-07-27 17:45:29

iPhone 模擬器 圖片

2020-11-17 11:18:31

Docker

2023-05-24 10:04:36

微軟ChatGPT人工智能

2019-03-06 15:02:56

應(yīng)用程序Windows 10 右鍵單擊菜單

2022-06-10 09:29:42

蘋果刪除原生系統(tǒng)

2021-06-15 05:45:56

Linkerd annotations網(wǎng)絡(luò)技術(shù)

2023-06-08 15:17:13

iOSChatGPT

2019-11-07 09:20:36

Windows 10聯(lián)系人Outlook

2023-11-14 22:16:36

2010-08-31 15:14:55

DB2域賬戶

2015-12-01 09:23:14

Windows 10開始菜單網(wǎng)站

2021-01-07 15:54:19

谷歌iOS應(yīng)用蘋果
點贊
收藏

51CTO技術(shù)棧公眾號

日韩一区二区久久| 国产 日韩 欧美大片| 日韩中文字幕在线播放| 污网站在线播放| 亚洲国产最新| julia一区二区中文久久94| 污污视频在线| 精品一区二区免费| 欧美成人网在线| 日韩在线一区二区三区| 69视频在线免费观看| 成人国产精品一区二区免费麻豆 | 久久精品国产一区二区三区免费看| 91在线视频成人| 色琪琪久久se色| 国产精品吴梦梦| 久久要要av| 欧美乱妇高清无乱码| 精品国产一区二区三区性色av| 亚洲人成人99网站| 欧美影视资讯| 在线精品高清中文字幕| 日韩大陆av| 欧美日韩不卡合集视频| jizz久久精品永久免费| 午夜精品一区二区三区av| 红杏成人性视频免费看| 热99精品里视频精品| 国产影视一区| 成人精品一二区| 丝袜美腿一区二区三区| 中文字幕一区二区三区四区五区六区| 蜜臀精品一区二区三区在线观看 | 91精品国产欧美一区二区成人| 欧美jizz18性欧美| 在线电影院国产精品| 色av手机在线| 永久免费精品影视网站| 7777精品| 91精品久久久久久久久久另类| 日本电影一区二区| 国产精华一区| 激情都市一区二区| 黑森林福利视频导航| 亚洲欧洲色图综合| 亚洲成av人影片在线观看| 欧美人与z0zoxxxx视频| 9765激情中文在线| 欧美刺激性大交免费视频| 激情五月综合网| 欧美极品色图| 26uuu精品一区二区| 中文字幕在线中文字幕二区| 欧美一区二区美女| 亚洲伦理网站| 国产欧美精品在线播放| 日本美女视频一区二区| 午夜精品久久久内射近拍高清| 一区二区三区美女| a免费在线观看| 久久久久999| 欧美福利网址| av动漫在线看| 在线观看欧美日本| 中文幕av一区二区三区佐山爱| 国产精品视频999| 男男成人高潮片免费网站| 天堂av在线网站| 欧美日韩久久久一区| 亚洲插插视频| 亚洲2020天天堂在线观看| 日韩在线视频精品| 亚洲视频小说| 国产日产欧美精品一区二区三区| 美女做暖暖视频免费在线观看全部网址91 | 在线影院国内精品| 成人欧美magnet| 韩国三级电影久久久久久| 石原莉奈在线亚洲二区| 免费xxxxx网站中文字幕| 日韩精品在线视频| 97久久夜色精品国产| 亚洲小视频在线播放| 黄网动漫久久久| 综合久久伊人| 欧美二区三区| 亚洲自拍偷拍网站| 欧美高清你懂的| 精品免费一区二区三区蜜桃| 国产区在线观看成人精品 | www一区二区三区| 久久人人爽爽人人爽人人片av| 久久精品青草| 国产精品天堂蜜av在线播放| 久久99国产精品久久久久久久久| 国户精品久久久久久久久久久不卡| 久久国产成人精品国产成人亚洲| 欧美精品精品一区| 精品国产网站| 成人亚洲视频在线观看| 亚洲国产精品va在线看黑人动漫| 久久理论电影| 欧美 激情 在线| 精品国产3级a| 亚洲毛片一区| 亚洲美女电影在线| 91国产精品视频在线| 99精品久久久久久| heyzo高清中文字幕在线| 国产精品手机视频| 午夜天堂影视香蕉久久| 偷窥自拍亚洲色图精选| 成人在线激情网| 日韩在线不卡视频| 粉嫩久久99精品久久久久久夜| 污污的视频在线观看| 超碰97在线资源| 天天做天天摸天天爽国产一区| 五月激激激综合网色播| 丝袜制服一区二区三区| 欧美日本中文字幕| av电影一区二区| 国产精品久久久久久妇女| 男人添女人下部视频免费| 亚洲国产成人精品久久| 精品亚洲成a人| 日韩免费va| 国产乱子伦农村叉叉叉| 久久亚洲成人精品| 久久久久久一级片| 成人久久精品| 另类小说色综合| 国内精品久久久久伊人av| 国产精品视频yy9299一区| 影音先锋欧美激情| 四虎免费av| 国产精品1234| 亚洲va欧美va人人爽午夜| 精品国内自产拍在线观看视频| 天天看片激情网站| 成人妇女免费播放久久久| 一本大道久久a久久综合婷婷| 激情综合自拍| www视频在线看| 欧美专区一二三| 日韩精品在线视频美女| 成人18视频日本| 日韩伦理一区二区三区| 欧美18一12sex性处hd| 国产成人精品免费视频大全最热| 91麻豆精品国产自产在线观看一区| 日本不卡在线视频| 精品欧美日韩精品| 99热一区二区| 成人写真福利网| 91麻豆精品国产91久久久久久久久| 秋霞电影一区二区| 日韩成人在线电影| 免费观看羞羞视频网站| 99久久99久久| 亚洲国产精品99| 久久精品水蜜桃av综合天堂| av资源久久| 污污的视频在线观看| 日韩欧美视频网站| 国产噜噜噜噜噜久久久久久久久 | 日韩中文字幕视频在线观看| 国产日韩精品视频一区| 欧美三级美国一级| 草莓福利社区在线| 国产精品裸体瑜伽视频| 69视频在线免费观看| 欧美日韩一二三四五区| 久久蜜桃精品| 精品久久国产一区| 中文官网资源新版中文第二页在线观看| 国产日韩欧美一区二区三区四区| 国产视频欧美视频| 中文字幕乱码一区二区免费| 欧美日韩 国产精品| 亚洲成人看片| 深夜福利视频在线观看| 男女啪啪免费观看| 国产精品av免费在线观看| 精品久久一二三区| 亚洲四区在线观看| 麻豆极品一区二区三区| 亚洲国产合集| 悠悠资源网亚洲青| 在线看视频你懂的| 男女视频网站在线观看| 成人午夜电影在线播放| 日韩在线一区二区三区免费视频| 色域天天综合网| 久久久久久久网| 日韩av电影一区| 日韩精品dvd| aa亚洲一区一区三区| 日韩在线观看www| 四虎国产精品成人免费4hu|