在React中基于ant-design,封装一个中文输入框

问题描述
antd中,input组件在触发onChange时,如果是中文输入模式,会频繁被触发,导致页面性能降低。尤其是在onChange时需要实时搜索的情况。

MyInput.jsx

import React, { useState, useEffect, useRef } from "react";
import { Input } from 'antd';

const MyInput = ({ size, value, onChange, addonBefore, placeholder, style }) => {
    const [inputValue, setInputValue] = useState(value); // 本地状态管理输入值
    const inputRef = useRef(null);
    const lockRef = useRef(false); // 锁定状态,防止在拼音输入时触发 onChange

    // 同步外部 value 到输入框
    useEffect(() => {
        setInputValue(value);
    }, [value]);

    const handleCompositionStart = () => {
        lockRef.current = true; // 开始输入时,锁定状态
    };

    const handleCompositionEnd = (e) => {
        lockRef.current = false; // 输入完成时,解锁
        setInputValue(e.target.value); // 更新最终输入值
        onChange(e.target.value); // 触发外部的 onChange
    };

    const handleChange = (e) => {
        if (!lockRef.current) { // 只有在输入完成后才触发 onChange
            const newValue = e.target.value;
            setInputValue(newValue); // 更新本地输入值
            onChange(newValue); // 更新外部状态
        } else {
            // 如果是在拼音输入阶段,防止触发 onChange
            setInputValue(e.target.value); // 更新本地输入值
        }
    };

    return (
        <Input
            style={style}
            size={size}
            ref={inputRef}
            addonBefore={addonBefore}
            placeholder={placeholder}
            value={inputValue} // 使用本地状态管理输入框内容
            onCompositionStart={handleCompositionStart}
            onCompositionEnd={handleCompositionEnd}
            onChange={handleChange} // 处理普通文本输入
        />
    );
};

export default MyInput;

用法

import React, { useState, useEffect } from 'react';
import MyInput from "@/components/Input"
import {
    SearchOutlined
} from '@ant-design/icons';


const TestInput = () => {
    const [searchFriendNickname, setSearchFriendNickname] = useState('')
    const onChangeSearchFriendNickname = (value) => {
      	console.log("输入框变化值",value)
    }
 return (
 	<>
 		<MyInput size="large" prefix={<SearchOutlined />} placeholder="搜索好友 / 群聊" style={{ borderRadius: '20px' }} value={searchFriendNickname} onChange={(e) => onChangeSearchFriendNickname(e)} />
 	</>
 )
}
export default TestInput
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值