TIL 20220819 Antd에서 포커스 옮기고 자동으로 select option 보여주기

jiffydev·2022년 8월 20일
0

목표

디자인 시스템으로 antd를 사용하고 있는데, 폼에서 회사를 검색하면 자동으로 다음 필드로 포커스가 이동하여, 해당 회사의 직원들의 이름,이메일이 뜨게 하고 싶었다.

사용한 기능

  • React
    • React.useRef
  • Antd
    • ref
    • showAction

코드

대부분의 코드는 제거하고 실제로 사용한 부분만 기술하도록 한다.

const myApp: React.FC<Props> = () => {
  ... 
  const [userOptions, setUserOptions] = useState<{ id: string; name: string; email: string }[]>([]);
  
  const selectRef = React.useRef<Select>(null); // 보통 Input을 사용한 예제가 많은데 Select도 가능하다.
  
  const onCompanySearch = async (company: string) => {
        const users = (await queryUser({ limit: 20, filters: [["company", "=", company]] })).items;
        setUserOptions(users);
        selectRef.current?.focus(); // 이 함수가 실행되면 지정한 위치로 포커스를 옮긴다.
    };
  
  return (
  	<Form>
    	<Form.Item name="company" label="회사" rules={[{ required: true }]}>
        	<Input.Search onSearch={onCompanySearch} onChange={onChangeCompany} />
        </Form.Item>
	    <Form.Item name="userId" label="이름/이메일" rules={[{ required: true }]}>
            // ref를 설정해 onCompanySearch 함수가 실행되면 이 위치로 포커스가 오도록 했다.
            <Select ref={selectRef} showAction={["focus"]} placeholder="회사명 검색 후 선택.">
              {userOptions.map((user, index) => {
                return (
                  <Select.Option
                  key={index}
				  value={user.id}
			>{`${user.name}(${user.email})`}</Select.Option>
                            );
                        })}
	        </Select>
        </Form.Item>
    </Form>
  )
}

export default myApp;

설명

select의 ref를 지정하면 함수가 실행된 후 해당 element로 포커스가 이동하게 된다.
그리고 포커스가 이동한 후 자동으로 select의 option들을 보여주게 하는 것이 showAction이다.
showAction은 string[] 형태로 dropdown이 활성화될 action을 넣어주면 되고, 여기서는 'focus'가 대상이 된다.

그런데 antd 문서에도 showAction 관련 내용이 없어 찾아본 결과, antd의 select는 rc-select를 기반으로 만들어져 있고, 문서에는 없지만 showAction을 사용할 수 있는 것을 확인했다. (2018년 antd github issue에서도 문서에 추가해야 한다는 이야기가 있었지만 아직도 추가되지 않은 것으로 보임)

참고한 문서

https://github.com/ant-design/ant-design/issues/6873

https://velog.io/@ju_h2/React-ref%ED%86%B5%ED%95%9C-input-%ED%83%9C%EA%B7%B8-%EC%BB%A4%EC%84%9C%ED%8F%AC%EC%BB%A4%EC%8A%A4-%EC%A1%B0%EC%A0%95-class-component%EC%99%80-hooks%EC%97%90%EC%84%9C-%EB%B9%84%EA%B5%90

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글