【问题标题】:How to pass a reference created by react hook of parent component to child components?如何将父组件的react hook创建的引用传递给子组件?
【发布时间】:2020-07-27 02:30:58
【问题描述】:

我的代码:


const MyComponent: React.FC = () => {

const ParentReference = useRef(null);

return(
<Parent className="d-flex flex-row" ref={ParentReference}>
          <ChildComponent
            className="mr-3"
            target={ParentReference.current}
          />
          <AnotherChild className="mr-3" />
        </Nav>
)};

如上面的代码所示,我使用 useRef 钩子创建了一个引用并将其附加到我的 ParentComponent。 现在我通过 target prop 传递给 ChildComponent 并使用它在 child 内部进行一些 dom 操作。

问题: 对于组件的第一次渲染,我将 ParentReference 作为 null。 (如果我在更改 ParentReference 时强制重新渲染,它将更新并重新渲染整个组件,那么它将具有价值。)

如何在我的子组件中获取 ParentReference 以进行初始渲染?

【问题讨论】:

  • 不,它没有。他们提到的问题完全不同,因为我的 ref 在传递给子组件之前已附加并初始化到父组件,所以我希望它具有价值。我可以使用 useEffect 钩子并在 ref 值更改时触发重新渲染,这将再次重新渲染组件。但我想在第一次渲染。

标签: reactjs react-hooks react-ref react-forwardref use-ref


【解决方案1】:

segFault 对this answer 的引用是正确的。您的 ref 直到组件的第一次渲染 after 才初始化。因此,当您渲染 &lt;ChildComponent target={ParentReference.current} /&gt; 时,尚未定义 ref。

在这种情况下,您可以考虑使用useEffect 在第一次渲染时设置状态变量,并在设置状态变量后有条件地渲染&lt;ChildComponent /&gt;

const MyComponent: React.FC = () => {

const ParentReference = useRef(null);

// define state variable defining the ref as not yet ready
const [refReady, setRefReady] = useState(false)
// On first mount, set the variable to true, as the ref is now available
useEffect( () => {
  setRefReady(true)
}, [])

return(
<Parent className="d-flex flex-row" ref={ParentReference}>
          {refReady && <ChildComponent
            className="mr-3"
            target={ParentReference.current}
          />}
          <AnotherChild className="mr-3" />
        </Nav>
)};

【讨论】:

  • 是的,你是对的 \n ``` const [, reRender] = useState(); useEffect(() => { reRender({}); }, [ParentReference]); ```我正在这样做,但我期待我们是否可以在第一次渲染中做点什么??
  • 我不知道。使用 React 时,Refs 是一种反模式,因此您应该尝试确保您确实需要使用 ref,而不是传递道具或管理来自祖父母的状态。你想通过在这里传递 ref 来完成什么?此外,如果此答案对您有所帮助,则习惯上将其标记为答案和/或对其进行投票。每个人都喜欢无意义的上网点。
  • 我的子组件中有一个叠加层,我想参考我的父组件定位它。
  • 这听起来像是可以用 css 完成的。如果您发布更多代码和/或创建一个工作示例(codesandbox 或类似的东西),并提供更多关于您想要在定位方面完成什么的详细信息,也许我们可以帮助您更好地解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2021-09-30
  • 2020-05-27
  • 1970-01-01
  • 2021-04-29
  • 2022-07-15
  • 1970-01-01
相关资源
最近更新 更多