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

React+hook實現(xiàn)聯(lián)動模糊搜索

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

背景

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

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

需要根據(jù)所選擇的機構(gòu),默認加載一部分的處理人,剩下的,根據(jù)用戶手輸?shù)臄?shù)據(jù),與后臺交互,模糊匹配對應的選項。

實現(xiàn)思路

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

主要代碼實現(xiàn)

DebounceSelect:動態(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);
            // 同時觸發(fā)父組件的fetchUserList,并傳入?yún)?shù)
            fetchOptions({centerHandleOrg, keyWord}).then(newOptions => {
                setOptions(newOptions);
                setFetching(false)
            })
        }
        return debounce(loadOptions, debounceTimeout);
    },[ centerHandleOrg, fetchOptions, debounceTimeout])
    
    // 向父組件拋出對象
    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}
        />
    )
})

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

// ...相關(guān)依賴引入
<Row>
	<Col span={11}>
    	<Form.Item label="處理機構(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="請輸入進行查找"
                fetchOption={this.fetchUserList}
                />
        </Form.Item>
    </Col>
</Row>

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

// 當用戶選中某一機構(gòu)時
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));
}

// 當用戶輸入關(guān)鍵字進行檢索有權(quán)用戶時
// 在子組件中會觸發(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ù)完成
    })
}

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

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

// 前端進行模糊匹配的時候,如果返顯的下拉選項為拼接后的話,會被拆成一個數(shù)組,無法直接匹配
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;
}

部分效果預覽

搜索中:

總結(jié)

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

使用緩存減少性能消耗

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    react中使用usestate踩坑及解決

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

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

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

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

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

最新評論

南华县| 博乐市| 昌图县| 江油市| 万荣县| 锡林浩特市| 诏安县| 资溪县| 兰西县| 灵石县| 庐江县| 长丰县| 平遥县| 汕头市| 新田县| 永清县| 石屏县| 怀宁县| 安西县| 驻马店市| 泸定县| 临海市| 元谋县| 丰县| 察隅县| 礼泉县| 罗田县| 娄烦县| 溆浦县| 绥江县| 章丘市| 斗六市| 儋州市| 文安县| 万年县| 奉节县| 徐水县| 报价| 白山市| 金乡县| 云林县|