reactjs - React 2020 中的 document.getElementById() 等效项
问题描述
我有一个名为 Button.js 的组件,它有一个按钮,单击该按钮时我只想知道我是否正在访问另一个名为 Timer.js 的组件中的 div。在 vanilla javascript 中,我将简单地使用 document.getElementById() 来捕获 DOM 节点。这是如何在 React 中完成的?
我在文档中遇到了回调引用,但它不起作用。如果使用 ref 不是访问 DOM 元素的 React 方式,请向我推荐执行此操作的最佳方式。提前致谢。
按钮.js
function Button() {
const getHtml = () => {
const node = test.current;
console.log(node);
}
return (
<button onClick={getHtml}>GetHtml</button>
)
}
计时器.js
function Timer() {
const test = useRef(null);
return (
<div ref={test}>... </div>
<Button />
}
解决方案
我不会使用引用来检查一个组件是否在另一个组件内呈现。createContext
你可以用and得到你想要的东西useContext
。
(它可以像您尝试过的那样工作。如果您将 ref 作为道具传递给按钮。)
使用上下文:您在 Timer 组件和按钮中创建一个TimerContext.Provider
,您可以检查useContext(TimerContext)
预期的键是否在对象中。如果它不存在,则该按钮不在您的计时器内。
请查看下面的代码段或下面的Codesandbox。
//import React, { useContext, createContext } from "react";
//import "./styles.css";
const { useContext, createContext } = React;
const ContainerContext = createContext({
isInContainer: null
});
const Container = () => {
return (
<ContainerContext.Provider value={{ isInContainer: true }}>
<p>
In container:
<Button />
</p>
</ContainerContext.Provider>
);
};
const Button = () => {
const { isInContainer } = useContext(ContainerContext);
console.log(isInContainer);
const isInside = () => {
alert(isInContainer ? "clicked inside" : "not in container");
};
return <button onClick={isInside}>Click me</button>;
};
function App() {
return (
<div className="App">
<Container />
<Button />
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
rootElement
);
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>
更新 15.04.2020
起初我并不清楚这个问题,但现在我理解了这个用例。这个想法是有一个Editor
组件,您可以在其中编写可用于生成复制的片段视图和/或 html 标记输出的标记。
为此,最好的方法是使用对Editor
组件的引用并将其作为 prop 传递给预览/输出组件 - 也可以使用上下文,但传递它更容易。
就像在下面的Sandbox中一样。
推荐阅读
- php - 如何在 GAE [Google App engine] PHP 上创建或部署另一个服务/模块(默认已部署)
- blazor - Blazor 的 WebApi 返回 text/html 而不是 application/json
- javascript - 如何在 Vuejs 中跟踪组件的高度?
- algorithm - 阻塞的矩阵乘法运算可以优化地减少到缓存上的 2*N^3/B^3+N^2/B^2 读取吗?
- discord - Discord JDA 在嵌入中使用本地图像?
- python - 使用python将目录内的压缩文件夹中的所有文件提取到没有文件夹的其他目录
- javascript - 从 React 中的其他组件使用 Bootstrap Modal
- html - CSS/SCSS 背景颜色,如 Microsoft 登录页面
- html - 为什么在我将其设置为内联块后 li 在图像下方移动?
- javascript - 要执行的代码应该在 try 语句中的什么位置?