React 如何使输入光标停留在百分号前

React 如何使输入光标停留在百分号前

问题描述

在输入时,我制作了一个显示百分比的输入框,例如1.1%(在开始时不接受00),但光标在输入过程中会移到末尾。 有没有办法让光标保持在百分号前面?

React 如何使输入光标停留在百分号前

function formatPercent(amount) {
  return amount + '%'
}

const [lendData, setLendData] = useState({
    lendValue: '',
    lendFee: '',
  })

function handleChange(e) {
    let { name, value } = e.target

    if (name == 'lendValue') {
      // prevent first character if it 0 and removing separator
      value = value.replace(/^0+|[^0-9]/g, '')

      setLendData((prev) => {
        return {
          ...prev,
          [name]: value,
        }
      })
    } else if (name == 'lendFee') {
      // prevent first character if it 0
      value = value.replace(/^0+|[^0-9,.]/g, '')
      console.log(value)
      setLendData((prev) => {
        return {
          ...prev,
          [name]: value,
        }
      })
    }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<input
  type='text'
  inputMode='decimal'
  name='lendFee'
  id='lendFee'
  placeholder='0%'
  value={
    lendData.lendFee ? formatPercent(lendData.lendFee) : ''
  }
  onChange={handleChange}
/>

解决方案

你可以尝试以下代码:

function formatPercent(amount) {
  return amount + '%';
}

function App() {
  const [lendData, setLendData] = useState({
    lendValue: '',
    lendFee: '',
  });

  const lendFeeInput = useRef(null);

  function handleChange(e) {
    let { name, value } = e.target;

    if (name === 'lendValue') {
      // prevent first character if it 0 and removing separator
      value = value.replace(/^0+|[^0-9]/g, '');

      setLendData((prev) => {
        return {
          ...prev,
          [name]: value,
        };
      });
    } else if (name === 'lendFee') {
      const cursorPosition = e.target.selectionStart;

      // prevent first character if it 0
      value = value.replace(/^0+|[^0-9,.]/g, '');

      setLendData((prev) => {
        return {
          ...prev,
          [name]: value,
        };
      });

      // Restoring cursor position
      setTimeout(() => {
        lendFeeInput.current.selectionStart = cursorPosition;
        lendFeeInput.current.selectionEnd = cursorPosition;
      }, 0);
    }
  }

代码更改的解释:

  • 我使用了useRef钩子,并为输入元素lendFeeInput创建了一个ref。
  • 在更新输入值之前,我存储了当前光标位置: const cursorPosition = e.target.selectionStart;
  • 最后,我使用setTimeout来恢复更新输入值后的光标位置,以确保输入值已更新。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程