基于react?vant實(shí)現(xiàn)彈窗搜索功能
搜索 - Search 組件
彈出層的頂部用到了Search組件
1. action
Search組件中需要自定義右側(cè)的按鈕,可以使用showAction(默認(rèn)文字為取消)+ actionText自定義按鈕文字;也可以使用action自定義右邊部分操作區(qū)域
官網(wǎng)文檔使用方法1:
<Search showAction label="地址" actionText={<div onClick={() => Toast.info(value)}>搜索</div>} value={value} onChange={setValue} placeholder="請(qǐng)輸入搜索關(guān)鍵詞" />
2. value
value
用于控制搜索框中的文字
value綁定的變量,通過(guò)onChange更新即可
3.點(diǎn)擊進(jìn)行搜索
// 搜索關(guān)鍵詞 const onSearchClinic = async () => { // 前置校驗(yàn) if (!searchName) { Toast('請(qǐng)輸入名稱關(guān)鍵字再進(jìn)行搜索') return } // 開(kāi)始搜索 try { setSearchLoading('loading') const { data: { rows }, } = await triggerClinicList() const _rows = [...rows].map((item) => ({ ...item, value: item.code, text: item.name, })) setClinicList(_rows) setSearchLoading('sucess') } catch (error) { setSearchLoading('sucess') } }
數(shù)據(jù)列表 - List 組件
List 組件滾動(dòng)到底部時(shí),會(huì)觸發(fā) onLoad
事件,此時(shí)可以發(fā)起異步操作并更新數(shù)據(jù),若數(shù)據(jù)已全部加載完畢,則直接將 finished
設(shè)置成 true
即可。
react-vant - List 內(nèi)部包含了防止并發(fā)的重復(fù)請(qǐng)求的邏輯,使用中不需要額外處理
如果有分頁(yè),則可以使用onLoad事件,項(xiàng)目中為全量返回,所以不需要這個(gè)。
選擇則某個(gè)診所之后進(jìn)行反顯
搜索的字段和外層最終反顯的字段分為兩個(gè)記錄,關(guān)閉的時(shí)候或者每次打開(kāi)的時(shí)候要清除內(nèi)部的字段(看業(yè)務(wù)要求)
const [clinicName, setClinicName] = useState('') // 外層業(yè)務(wù)字段 const [searchName, setSearchName] = useState('') // 彈窗記錄搜索的關(guān)鍵字 // 點(diǎn)擊cell,進(jìn)行選擇 const setClinicHandle = (v: any) => { // 更新外層輸入框名稱 // 關(guān)閉彈窗 onCloseClinicPop() }
占位組件 - Empty
占位組件的圖片有兩個(gè)狀態(tài):1.圖片顯示 2. loading顯示
占位組件的文案有兩個(gè)狀態(tài):1.初始化時(shí)的搜索提醒 2. 搜索結(jié)果為空時(shí)的提醒
// loading -- 加載中,wait -- 初始化, sucess -- 搜索完成(不論結(jié)果如何) const [searchLoading, setSearchLoading] = useState<'wait' | 'loading' | 'sucess'>('wait')
其他小細(xì)節(jié)
點(diǎn)擊外層按鈕,喚起彈窗時(shí)自動(dòng)聚焦到搜索輸入框
const searchRef = useRef<SearchInstance | any>(null) // 顯示 const onShowClinicPop = () => { // do something 點(diǎn)擊前校驗(yàn),清空搜索關(guān)鍵詞 onClearClinic setShowClinicPop(true) // 彈窗 setTimeout(() => { if (searchRef && searchRef.current) { searchRef.current?.focus() // 設(shè)置焦點(diǎn) } }, 0) } // 關(guān)閉彈窗 const onCloseClinicPop = () => { if (searchRef && searchRef.current) { searchRef.current?.blur() // 設(shè)置焦點(diǎn) } setShowClinicPop(false) }
部分代碼如下
<Popup position="bottom" round={true} visible={showClinicPop} onClose={onCloseClinicPop} style={{ height: '60vh' }} > <div className="popup-header"> <VantButton style={{ border: 'none', boxShadow: 'none', backgroundColor: 'transparent', color: 'inherit', }} icon={<Cross />} onClick={onCloseClinicPop} /> </div> <Search action={ <div className="search-text" onClick={onSearchClinic} > 搜索 </div> } value={searchName} onChange={(v) => { setSearchName(v) }} placeholder="輸入名稱關(guān)鍵字" onSearch={onSearchClinic} onClear={onClearClinic} ref={searchRef} /> <div style={{ height: 'calc(60vh - 98px)', overflowY: 'auto' }}> {clinicList?.length > 0 ? ( <List onLoad={() => new Promise(() => {})} finished={true} > {clinicList.map((item, index) => ( <Cell key={index} value={item.text} isLink arrowDirection="right" valueClass="text-[#323232]" onClick={() => { setClinicHandle(item.code) }} /> ))} </List> ) : ( <Empty image={ searchLoading === 'loading' ? ( <div className="empty-loading"> <Loading type="ball" /> </div> ) : ( 'search' ) } description={ searchLoading === 'sucess' ? '搜索列表為空' : searchLoading === 'wait' ? '點(diǎn)擊搜索查找您的診所' : '' } /> )} </div> </Popup>
到此這篇關(guān)于基于react vant實(shí)現(xiàn)彈窗搜索功能的文章就介紹到這了,更多相關(guān)react vant彈窗搜索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React實(shí)現(xiàn)反向代理和修改打包后的目錄
這篇文章主要介紹了React實(shí)現(xiàn)反向代理和修改打包后的目錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07React組件實(shí)例三大核心屬性State props Refs詳解
組件實(shí)例的三大核心屬性是:State、Props、Refs。類組件中這三大屬性都存在。函數(shù)式組件中訪問(wèn)不到 this,也就不存在組件實(shí)例這種說(shuō)法,但由于它的特殊性(函數(shù)可以接收參數(shù)),所以存在Props這種屬性2022-12-12React觸發(fā)render的實(shí)現(xiàn)方法
這篇文章主要介紹了React觸發(fā)render的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10從零搭建Webpack5-react腳手架的實(shí)現(xiàn)步驟(附源碼)
本文主要介紹了從零搭建Webpack5-react腳手架的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08