重新封装Antd Input组件,解决中文输入问题

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

function BaseHOC(key) {
  return function(props) {
    const { defaultValue, value, onChange } = props
    const hasValue = props.hasOwnProperty('value')
    // 用户切换到底是显示 value 还是 input
    // 不能直接用 isOnComposition 原因是,这个值发生变化不会触发重新渲染
    // 不能只使用 flag 原因是,setFlag 是异步的
    const [flag, setFlag] = useState(false)
    // 非中文输入时候显示 value。中文输入的时候显示 input
    const [input, setInput] = useState(hasValue ? value : defaultValue)
    useEffect(
      function() {
        if (hasValue && input !== value) {
          setInput(value)
        }
      },
      [value]
    )
    let isOnComposition = false
    function handleChange(e) {
      setInput(e.target.value)
      if (isOnComposition) return
      onChange && onChange(e)
    }
    function handleComposition(e) {
      if ('compositionend' === e.type) {
        isOnComposition = false
        handleChange(e)
      } else {
        isOnComposition = true
      }
      if (flag !== isOnComposition) {
        setFlag(isOnComposition)
      }
    }
    let Component = Input
    if (key) {
      Component = Input[key]
    }
    return (
      <Component
        {...props}
        value={hasValue && !flag ? value : input}
        onCompositionStart={handleComposition}
        onCompositionUpdate={handleComposition}
        onCompositionEnd={handleComposition}
        onChange={handleChange}
      />
    )
  }
}

const Component = function(props) {
  return BaseHOC()(props)
}

Component.Search = function(props) {
  return BaseHOC('Search')(props)
}

Component.TextArea = function(props) {
  return BaseHOC('TextArea')(props)
}

Component.Password = Input.Password

Component.Group = Input.Group

export default Component

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值