#javascript #reactjs
#javascript #reactjs
Вопрос:
Я хочу вызвать метод дочернего функционального компонента из родительского функционального компонента. Я создал useRef и поместил его через props в дочерний компонент. Я обернул дочерний компонент с помощью forwardRef . Но я получаю неопределенную ссылку. Кроме того, у меня нет способа поместить ссылку в элемент dom (только в функциональный компонент).
Родительский компонент:
import Tree from '@c-tree'
import React, {
FunctionComponent,
useEffect,
useState,
useContext,
useRef,
} from 'react';
const NavTree: FunctionComponent = () => {
const refTree = useRef();
useEffect(() => {
if (refTree !== undefined amp;amp; refTree.current !== undefined) {
// @ts-ignore
console.log(refTree.current.handleCurrentSelected);
}
// eslint-disable-next-line
}, [refTree]);
const tree = () => {
if (d?.items) {
return (
<Tree ref={refTree}>
{d.items.map(s => (
<Tree.Asset
key={s.id}
name={s.name}
dataSelected={`${s.id}`}
item={{
name: s.name,
tenantID: s.id,
type: s?.tree?.name,
children: [],
}}
/>
))}
</Tree>
);
}
};
return (
<SideBar
title={title}
>
<Box display="flex" flexDirection="column" height="100%">
<StyledBox>{tree()}</StyledBox>
</Box>
**</SideBar>
);
};
export default NavTree;
Дочерний компонент:
import React, { useImperativeHandle, useState, ForwardRefExoticComponent, forwardRef, PropsWithRef } from 'react';
import TreeContext from './treeContext';
import TreeGroup from './components/TreeGroup';
import TreeEntity from './components/TreeEntity';
interface TabsStatic {
Group: typeof TreeGroup;
Asset: typeof TreeEntity;
}
type TabsComponent = ForwardRefExoticComponent<PropsWithRef<ITreeProps>> amp; TabsStatic;
interface ITreeProps {
data?: {
type: string;
name: string;
tenantID: number;
children?: Array<Object>;
}[];
ref?: any;
}
export const Tree = forwardRef(({
data,
}: ITreeProps, ref) => {
const [contextValues, setContextValues] = useState({
selected: null,
opened: {},
});
useImperativeHandle(ref, () => (
{
handleCurrentSelected: (selectedName: string) => {
setContextValues({
...contextValues,
selected: selectedName,
opened: {
...contextValues.opened,
[selectedName]: !contextValues.opened[selectedName] || false,
},
});
}}
));
return (
<TreeContext.Provider value={contextValues}>
{
React.Children.map(children, child => {
return React.cloneElement(child, childrenProps);
})
}
</TreeContext.Provider>
);
}) as TabsComponent;
Tree.Group = TreeGroup;
Tree.Asset = TreeEntity;
export default Tree;
ОБНОВЛЕНО
Я могу получить значение useRef.current после повторного рендеринга. Как я могу получить текущее (не предыдущее) значение useRef?
Комментарии:
1. импортируйте React , а затем используйте
React.useRef()
для использования этого перехвата.2. Извините, я не указал импорт для родительского компонента в этом вопросе. Обновлено.
3. Попробуйте это
import {Tree} from '@c-tree'
4.
useEffect(() => {...}, [refTree.current]);
ваш текущий эффект эквивалентенcomponentDidMount
5. Я заметил, что useRef появился после повторного отображения. Но у меня было undefined, когда я только загружал страницу.