最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React+hook實(shí)現(xiàn)聯(lián)動(dòng)模糊搜索

 更新時(shí)間:2024年02月01日 08:44:27   作者:某哈壓力大  
這篇文章主要為大家詳細(xì)介紹了如何利用React+hook+antd實(shí)現(xiàn)聯(lián)動(dòng)模糊搜索功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

背景

需要從用戶選中的機(jī)構(gòu)中,聯(lián)動(dòng)加載相對(duì)應(yīng)的有權(quán)處理人。

由于有權(quán)處理人數(shù)據(jù)量較大,并且需要?jiǎng)討B(tài)加載,無(wú)法將所有枚舉都放在前端靜態(tài)資源中。

需要根據(jù)所選擇的機(jī)構(gòu),默認(rèn)加載一部分的處理人,剩下的,根據(jù)用戶手輸?shù)臄?shù)據(jù),與后臺(tái)交互,模糊匹配對(duì)應(yīng)的選項(xiàng)。

實(shí)現(xiàn)思路

  • 使用React + hook + antd
  • 需要對(duì)搜索框進(jìn)行防抖處理,避免性能浪費(fèi)
  • 用戶清除搜索條件時(shí),應(yīng)該將枚舉列表恢復(fù)為上一狀態(tài)。

主要代碼實(shí)現(xiàn)

DebounceSelect:動(dòng)態(tài)加載的下拉框

import React, { forwardRef, useImperativeHandle, useState, useMemo } from 'react';
import { Select, Spin } from "antd";
import debounce from "lodash/debounce";

export const DebounceSelect = forwardRef(({ fetchOptions, debounceTimeout = 800, ...props}, ref) => {
    const [fetching, setFetching] = useState(false);
    const [options, setOptions] = useState([]);
    const [userListBackUp, setUserListBackUp] = useSate([]);
    const [centerHandleOrg, setCenterHandleOrg] = useState("");
    const debounceFetcher = useMemo(() => {
        // keyWord:用戶輸入的關(guān)鍵字
        const loadOptions = (keyWord) => {
            if(!keyWord) return
            setOptions([]);
            setFetching(true);
            // 同時(shí)觸發(fā)父組件的fetchUserList,并傳入?yún)?shù)
            fetchOptions({centerHandleOrg, keyWord}).then(newOptions => {
                setOptions(newOptions);
                setFetching(false)
            })
        }
        return debounce(loadOptions, debounceTimeout);
    },[ centerHandleOrg, fetchOptions, debounceTimeout])
    
    // 向父組件拋出對(duì)象
    useImperativeHandle(ref, () => ({
        update: (list = [], _centerHandleOrg = "") => {
            setOptions(list);
            setUserListBackUp(list);
            setCenterHandleOrg(_centerHandleOrg);
        }
    }));
    
    return(
        <Select
            allowClear
            showSearch
            filterOption={false}
            onSearch={debounceFetcher}
            onClear={() => setOptions(userListBackUp)}
            notFoundContent={fetching ? <Spin size="small"/> : null}
            {...props}
            options={options}
        />
    )
})

父組件中機(jī)構(gòu)和處理人的部分靜態(tài)代碼實(shí)現(xiàn)

// ...相關(guān)依賴引入
<Row>
	<Col span={11}>
    	<Form.Item label="處理機(jī)構(gòu)" name="centerHandleOrg">
            <Select 
                allowClear
                showSearch
                filterOption={(val, option) => selectFilterIsBool(val, option)}
                onSelect={this.centerHandleOrgChangeHandle}
                onClear={() => this.debounceSelectRef.current.update()}>
            {this.state.centerHandleOrgList.map(item => (
                	<Option key={item.orgCode} value={item.orgCode}>
                    	{item.orgCode}-{item.orgName}
                    </Option>
                ))}
            
            </Select>     
        </Form.Item>
    </Col>
    <Col span={11}>
        <Form.Item label="處理人" name="centerHandleUser">
        	<DebounceSelect 
                ref={this.debounceSelectRef}
                placeholder="請(qǐng)輸入進(jìn)行查找"
                fetchOption={this.fetchUserList}
                />
        </Form.Item>
    </Col>
</Row>

部分關(guān)鍵業(yè)務(wù)邏輯代碼實(shí)現(xiàn)

// 當(dāng)用戶選中某一機(jī)構(gòu)時(shí)
centerHandleOrgChangeHandle = async (v) => {
    // 先置空處理人欄位
    this.formRef.current.setFieldsValue({
        centerHandleUser: "",
    })
    if(!v){
        return
    }
    // 獲取有權(quán)用戶列表(非全量)
    const data = {centerHandleOrg: v};
    const {list = []} = await getOrgUserList(data);
    this.debounceSelectRef.current.update(reNameObj(list));
}

// 當(dāng)用戶輸入關(guān)鍵字進(jìn)行檢索有權(quán)用戶時(shí)
// 在子組件中會(huì)觸發(fā)onSearch => 觸發(fā)fetchUserList
fetchUserList = async (data) => {
    return new Promise(resolve => {
         const data = {centerHandleOrg: v};
         const {list = []} = await getOrgUserList(data);
         resolve(reNameObj(list)); // 向子中注入新的options,查詢數(shù)據(jù)完成
    })
}

部分使用到的方法代碼實(shí)現(xiàn)如下

// 由于select是默認(rèn)按照l(shuí)abel,value做鍵的
const reNameObj = (list) => 
	list.map(({userName, userCode, ...rest}) => ({
        label: `${userCode}-${userName},`
		value: userCode,
        ...rest,
    }))

// 前端進(jìn)行模糊匹配的時(shí)候,如果返顯的下拉選項(xiàng)為拼接后的話,會(huì)被拆成一個(gè)數(shù)組,無(wú)法直接匹配
const selectFilterIsBool = (val = "", option = "") => {
    if(option.props.children){
        if(Objec.prototype.toString.call(option.props.children) !== "[object Array]"){
            return option.props.children.includes(val);
        }
        return option.props.children.join("").includes(val);
    }
    return false;
}

部分效果預(yù)覽

搜索中:

總結(jié)

使用防抖減少接口頻繁調(diào)用

使用緩存減少性能消耗

使用數(shù)據(jù)備份這種方式提示用戶體驗(yàn)。

到此這篇關(guān)于React+hook實(shí)現(xiàn)聯(lián)動(dòng)模糊搜索的文章就介紹到這了,更多相關(guān)React模糊搜索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react native環(huán)境安裝流程

    react native環(huán)境安裝流程

    React Native 是目前流行的跨平臺(tái)移動(dòng)應(yīng)用開發(fā)框架之一。本文介紹react native環(huán)境安裝流程及遇到問題解決方法,感興趣的朋友一起看看吧
    2021-05-05
  • React 腳手架使用指南(最新推薦)

    React 腳手架使用指南(最新推薦)

    本文介紹了React腳手架(CreateReactApp)的使用指南,包括創(chuàng)建項(xiàng)目、項(xiàng)目結(jié)構(gòu)、常用命令、最佳實(shí)踐、常見問題解決以及腳手架的優(yōu)勢(shì),結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • 淺談React的React.FC與React.Component的使用

    淺談React的React.FC與React.Component的使用

    本文主要介紹了React的React.FC與React.Component的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • React hooks依賴數(shù)組:一個(gè)讓我加班到凌晨3點(diǎn)的男人

    React hooks依賴數(shù)組:一個(gè)讓我加班到凌晨3點(diǎn)的男人

    本文解析了React Hooks中依賴數(shù)組的工作機(jī)制,詳細(xì)闡述了無(wú)限循環(huán)、過時(shí)閉包、隱性依賴等常見陷阱,提供了解決方案,并總結(jié)了誠(chéng)實(shí)聲明依賴、最小化effect職責(zé)等最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • React如何實(shí)現(xiàn)像Vue一樣將css和js寫在同一文件

    React如何實(shí)現(xiàn)像Vue一樣將css和js寫在同一文件

    這篇文章主要介紹了React如何實(shí)現(xiàn)像Vue一樣將css和js寫在同一文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • React?函數(shù)式組件和類式組件詳情

    React?函數(shù)式組件和類式組件詳情

    這篇文章主要介紹了React函數(shù)式組件和類式組件詳情,React是組件化的的JS庫(kù),組件化也是React的核心思想,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • React實(shí)現(xiàn)表格選取

    React實(shí)現(xiàn)表格選取

    這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)表格選取,類似于Excel選中一片區(qū)域并獲得選中區(qū)域的所有數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • react中使用usestate踩坑及解決

    react中使用usestate踩坑及解決

    這篇文章主要介紹了react中使用usestate踩坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • react中如何使用定義數(shù)據(jù)并監(jiān)聽其值

    react中如何使用定義數(shù)據(jù)并監(jiān)聽其值

    這篇文章主要介紹了react中如何使用定義數(shù)據(jù)并監(jiān)聽其值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 一百多行代碼實(shí)現(xiàn)react拖拽hooks

    一百多行代碼實(shí)現(xiàn)react拖拽hooks

    這篇文章主要介紹了一百多行代碼實(shí)現(xiàn)react拖拽hooks,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論

迁安市| 正宁县| 和林格尔县| 江西省| 临潭县| 建湖县| 蓬溪县| 都安| 兴化市| 万宁市| 竹北市| 莒南县| 清远市| 红原县| 瑞丽市| 墨脱县| 安新县| 兴宁市| 镇平县| 台州市| 嵊泗县| 峨眉山市| 宜川县| 开阳县| 沿河| 绥阳县| 屏东市| 沙坪坝区| 九龙坡区| 三穗县| 铁力市| 娄底市| 高碑店市| 甘孜| 偏关县| 禄丰县| 泽普县| 张家界市| 连州市| 府谷县| 六盘水市|