react实现Enter发送,Ctrl+Enter换行的textarea输入框

const Test: React.FC = () => {
  const [searchStr, setSearchStr] = React.useState('');

  const handleSearch = () => {
    console.log('search', searchStr);
  };
  return (
    <div>
      <Input.TextArea
        value={searchStr}
        autoSize={{ minRows: 1, maxRows: 4 }}
        placeholder='输入内容开始查询(Enter发送,Ctrl+Enter换行)'
        maxLength={1000}
        onChange={(e) => setSearchStr(e.target.value)}
        onPressEnter={(e) => {
          // FIXME 优化为在光标位置处换行
          if (!e.ctrlKey && e.code === 'Enter') {
            e.preventDefault();
            handleSearch();
          } else if (e.code === 'Enter') {
            // 换行,获取光标位置
            const lastIdx = searchStr.length;
            const target = e.target as HTMLInputElement;
            const startIdx = target.selectionStart || lastIdx;
            const endIdx = target.selectionEnd || lastIdx;
            console.log(startIdx, endIdx, searchStr.slice(0, startIdx) + '\n' + searchStr.slice(endIdx));
            setSearchStr((val) => val.slice(0, startIdx) + '\n' + val.slice(endIdx));
            // 设置光标位置
            setTimeout(() => {
              target.selectionStart = startIdx + 1;
              target.selectionEnd = startIdx + 1;
            }, 0);
          }
        }}
      />
      <div className='flex items-center ml-2 text-c3'>
        <span>{searchStr.length}/1000</span>
        <Button
          type='text'
          onClick={handleSearch}
          className='w-10 h-10 ml-2 py-0'
          icon={<span className='iconfont icon-send text-2xl hover:text-blue'></span>}
        ></Button>
      </div>
    </div>
  );
};
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值