В моем компоненте заголовка есть следующий код. Я подумал, что это может вызвать эту ошибку, потому что я пытаюсь получить к нему доступ еще до того, как он отобразится на экране. Я не уверен, почему это не работает. Я попытался использовать forwardRef в дочернем компоненте и получил следующую ошибку в справке из компонента SearchDropDown. Надеюсь, кто-нибудь может сказать мне, что здесь не так.
Type '((instance: unknown) => void) | MutableRefObject<unknown>' is not assignable to type 'LegacyRef<HTMLDivElement>'.
Type 'MutableRefObject<unknown>' is not assignable to type 'LegacyRef<HTMLDivElement>'.
Type 'MutableRefObject<unknown>' is not assignable to type 'RefObject<HTMLDivElement>'.
Types of property 'current' are incompatible.
Type '{}' is missing the following properties from type 'HTMLDivElement': align, addEventListener, removeEventListener, accessKey, and 235 more.
The expected type comes from property 'ref' which is declared here on type 'DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>'
Компонент страницы
const domNodeRef = useRef(null);
const [search, setSearch] = useState("");
useEffect(() => {
const handler = (e) => {
if (domNodeRef !== undefined || domNodeRef !== null) {
if (!domNodeRef.current.contains(e.target)) {
setSearch("");
}
}
};
document.addEventListener("mousedown", handler);
return () => {
document.addEventListener("mousedown", handler);
};
});
return (
<div className = "header">
<div className = "header-content">
<div className = "searchh">
<input
placeholder = "Type to search"
onChange = {handleSearchChange}
/>
{!!search && (
<SearchDropDown
search = {search}
ref = {domNodeRef}
/>
)}
</div>
</div>
</div>
)
Компонент SearchDropDown
const SearchDropDown = (props) => {
....
return (
<div className = "search-drop-down" ref = {props.ref}>
.....
</div>
)
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


useRef вернет последовательный объект. Это никогда не будет null или undefined.
Что изменится, так это свойство .current в ссылке - это то, что вы должны проверить, а не сам объект ссылки.
if (domNodeRef !== undefined || domNodeRef !== null) {
следует изменить на
if (domNodeRef.current) {
Также
return () => {
document.addEventListener("mousedown", handler);
};
должно быть
return () => {
document.removeEventListener("mousedown", handler);
};
Однако вы можете рассмотреть другой подход - вместо ref и .contains просто проверьте, есть ли у цели элемент .closest в строке поиска:
useEffect(() => {
const handler = (e) => {
if (!e.target.closest('.search-drop-down')) {
setSearch("");
}
}
document.addEventListener("mousedown", handler);
return () => {
document.removeEventListener("mousedown", handler);
};
}, []);