我不会使用引用来检查一个组件是否在另一个组件内呈现。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中一样。