프로젝트

[외주] React input 태그 입력시 focusOut되는 현상

58청춘 2024. 12. 14. 23:10
728x90

프로젝트에서 2차원 표 형식의 테이블에 input 태그를 이용해 값을 렌더링하는 부분이 있었다.

 

이 부분에서 수정이 가능해야 한다는 기능 요구가 있었다.

그래서 각 input 태그의 onChange 속성에 핸들러 함수를 할당했지만 한번 입력하면 포커스아웃되는 이슈가 있었다.

{
  tableData.map((data, idx) => {
    return (
      <div
        key={`tableData_${idx}`}
        className='w-fit flex content-center justify-between mb-3 pb-2 border-b'
      >
        {
          data.map((info, i) => {
            if (info.type === 'checkbox') {
              return (
                <div
                  key={`checkbox_${info.val}_${i}`}
                  className='px-3 py-2 min-w-20'
                >
                  <input
                    type='checkbox'
                  />
                </div>
              )
            }
            else if (info.type === 'input' && typeof info.val === 'string') {
              return (
                <div
                  key={`input_${info.val}_${i}`}
                  className={`min-w-32 flex justify-center content-center`}>
                  <Input
                    className='w-3/4 text-center'
                    value={info.val}
                    onChange={(e) => inputChangeHandler(e, idx, i)}
                  />
                </div>
              );
            }
            else {
              return (
                <div
                  key={`text_${info.val}_${i}`}
                  className={`px-3 py-2 min-w-32 text-center`}>
                  {info.val}
                </div>
              )
            }
          })
        }
      </div>
    )
  })
}

 

위의 코드를 보면 key의 값이 중복될 여지가 있는 코드이다.

 

이처럼 key값이 중복되면 input 값이 변경되면 focus를 잃어버릴 수 있다.

그러니 key값을 고유하게 만들어주자.

 

{
  tableData.map((data, idx) => {
    return (
      <div
        key={`tableData_${idx}`}
        className='w-fit flex content-center justify-between mb-3 pb-2 border-b'
      >
        {
          data.map((info, i) => {
            if (info.type === 'checkbox') {
              return (
                <div
                  key={`checkbox_${idx}_${i}`}
                  className='px-3 py-2 min-w-20'
                >
                  <input
                    type='checkbox'
                  />
                </div>
              )
            }
            else if (info.type === 'input' && typeof info.val === 'string') {
              return (
                <div
                  key={`input_${idx}_${i}`}
                  className={`min-w-32 flex justify-center content-center`}>
                  <Input
                    className='w-3/4 text-center'
                    value={info.val}
                    onChange={(e) => inputChangeHandler(e, idx, i)}
                  />
                </div>
              );
            }
            else {
              return (
                <div
                  key={`text_${idx}_${i}`}
                  className={`px-3 py-2 min-w-32 text-center`}>
                  {info.val}
                </div>
              )
            }
          })
        }
      </div>
    )
  })
}

 

728x90