reactjs - React 将 dom 节点作为输入传递给另一个组件
问题描述
我正在尝试通过引用将包装器 Dom 节点传递给子组件。我在下面尝试过,但它说它不是节点。
const wrapperRef = React.createRef()
<Wrapper ref={wrapperRef}>
<ChildComponent target={wrapperRef} />
<Wrapper>
我正在使用功能组件。关于如何实现它的任何指导?
解决方案
正如我在评论中所说,您应该使用 Forwarding Refs 来获取<Wrapper>
组件的 DOM 节点。所以它看起来像这样:
主文件
import React from "react";
import Wrapper from "./Wrapper";
import ChildComponent from "./ChildComponent";
function App() {
const wrapperRef = React.createRef();
return (
<div className="App">
<Wrapper ref={wrapperRef}>
<ChildComponent target={wrapperRef} />
</Wrapper>
</div>
);
}
Wrapper.js
import React from "react";
const Wrapper = React.forwardRef((props, ref) => {
return (
<div ref={ref}>
<h3>Wrapper Component</h3>
{props.children}
</div>
);
});
export default Wrapper;
ChildComponent.js
import React, { useEffect } from "react";
const ChildComponent = props => {
useEffect(() => {
console.log(props.target.current); // -> wrapper container outer <div>
}, []);
return (
<div>
<p className="lead">THIS IS THE CHILD COMPONENT</p>
</div>
);
};
export default ChildComponent;
你可以在这里看到一个简单的例子: https ://codesandbox.io/s/react-forward-ref-to-child-zwcd7
在 ChildComponent 中使用常规 Refs
正如我在评论中提到的,如果你的 JSX 的结构像我发布的代码一样简单(即子组件是父组件的外包装的直接子组件),你也可以使用element.parentNode
它来获取 DOM 节点(在这种情况下主文件不会改变):
Wrapper.js
import React from "react";
const Wrapper = props => {
return (
<div>
<h3>Wrapper Component</h3>
{props.children}
</div>
);
};
export default Wrapper;
ChildComponent.js
import React, { useEffect } from "react";
const ChildComponent = props => {
let childOuterElement = null;
useEffect(() => {
console.log(childOuterElement.parentNode);
}, []);
return (
<div ref={e => (childOuterElement = e)}>
<p className="lead">THIS IS THE CHILD COMPONENT</p>
</div>
);
};
export default ChildComponent;
请记住,这仅在特定情况下有效,如果{props.children}
将其放置在<Wrapper>
组件中的其他位置,您将获得对该特定 DOM 节点的引用。
推荐阅读
- php - Syfmony 4:检查用户是否有“记住我”cookie
- php - 图像调整大小 laravel 不支持编码格式(tmp)
- laravel - 传递关键字时新闻 APi 中的状态错误
- python - Pandas 在每第 n 行后插入一个新行
- c# - 播放 m3u8/在线文件时如何获得网络下载速度?
- java - 当我尝试在 Ubuntu 18.04 m 中安装 JAVA 7 时遇到一些问题
- java - Collections.replaceAll(列表
list, T oldVal, T newVal) 不能正确使用正则表达式,Java - symfony - 无法解析 symfony 4.3 中覆盖 FOS 控制器的参数 $token
- c++ - 如何实现拖动QTableWidget的项目的右上角来复制内容,就像在Excel中一样?
- javascript - 如何在不传递取消参数的情况下动态关闭确认窗口