【问题标题】:React input text box loses focus after typing a character输入字符后反应输入文本框失去焦点
【发布时间】:2022-02-02 22:40:43
【问题描述】:

我认为这是一个常见问题,但无法从其他答案中找出解决方案,因为他们不遵循我的相同流程。这是我最初的问题的后续:useState variable not holding its state during onChange event

基本上每次我输入一个字符时,popUp 都会重新渲染,导致输入框失去焦点。

const App() {

  const [units, setUnits] = useState('');
  const [showPopUp, setShowPopUp] = useState(false);
  const [teamState, setTeamState] = useState(null);
  const [lineState, setLineState] = useState(null);
  ...

function PopUp() {

    return (
      <div id="popUp" className={popUpStyle}>
        <div className="pop-up-bg"> </div>
        <div className="pop-up">
          <img className='close-button' src={closeButton} onClick={hpu} />
          {teamState && lineState && betslip(teamState, lineState)}
        </div>
      </div>
    )
  }


  function handleChange(event) {
    setUnits(event.target.value)
  }

  const betslip = (team, line) =>
    (
      <div className='betslip'>
        <h1 className="betslip-header">Betslip</h1>
        <div >
          <table className="betslip-table">
            <tr>
              <th>Team</th>
              <th>Line</th>
              <th>Unit(s)</th>
            </tr>
            <tr >
              <td className='betslip-td'>{team}</td>
              <td className='betslip-td'>{linePlusMinus(line)}</td>
              <td className='betslip-td'>
                <div className='unit-div'>
                  <input type='text' className='unit-input' onChange={e => setUnits(e.target.value)} value={units}/>
                </div>
              </td>
            </tr>
          </table>
         <table className="betslip-table">
            <tr>
              <th>Risk</th>
              <td className='betslip-td'>{units}</td>
            </tr>
            <tr>
              <th>Reward</th>
              <td className='betslip-td'>{reward(units, line)}</td>
            </tr>
          </table>

        </div>
      </div>
    );

  function spu(team, line){
    setTeamState(team);
    setLineState(line);
    setPopUpHtml(betslip(teamState, lineState));
    setShowPopUp(true);
  }

    function hpu(){
    setShowPopUp(false);
  }

...
return( 
<div className="container">
       { showPopUp && <PopUp />}
...
)}

【问题讨论】:

  • 你可以尝试添加 const [units, setUnits] = useState(''); bestLip 组件内部,它是一个单独的组件

标签: javascript html reactjs web react-hooks


【解决方案1】:

尝试隔离 Betslip:

const betslip = (team, line) =>{
const [units, setUnits] = useState('');

return <div className='betslip'>
   
<h1 className="betslip-header">Betslip</h1>
    <div >
      <table className="betslip-table">
        <tr>
          <th>Team</th>
          <th>Line</th>
          <th>Unit(s)</th>
        </tr>
        <tr >
          <td className='betslip-td'>{team}</td>
          <td className='betslip-td'>{linePlusMinus(line)}</td>
          <td className='betslip-td'>
            <div className='unit-div'>
              <input type='text' className='unit-input' onChange={e => setUnits(e.target.value)} value={units}/>
            </div>
          </td>
        </tr>
      </table>
     <table className="betslip-table">
        <tr>
          <th>Risk</th>
          <td className='betslip-td'>{units}</td>
        </tr>
        <tr>
          <th>Reward</th>
          <td className='betslip-td'>{reward(units, line)}</td>
        </tr>
      </table>

    </div>
  </div>
}

编辑:因此您可以尝试将 getLips() 分离为一个独立的组件,而不与任何其他组件共享状态。据我所知,单位只被 Betslip 使用

【讨论】:

  • 这个答案有一些解释会更好。
  • betslip 不是反应组件,所以我无法在其中定义 useState
  • 所以我让 Betslip 成为一个反应函数,将 useState 放入其中,然后在 PopUp 组件中调用该反应组件,传递它 teamState 和 lineState 并且它起作用了!谢谢
  • 酷!是的,它是一个反应组件,如果你有一个返回 Reactnode 的函数。
猜你喜欢
  • 2021-12-14
  • 2015-03-20
  • 2021-03-31
  • 2022-01-16
  • 1970-01-01
  • 2021-01-29
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多