我对复合组件设计有疑问。我有一个定义 props 的 Wrapper 组件。我使用 Context.Provider 使道具可用于子内容组件。我希望内容组件的孩子将 {answer} 重新定义为 21。
限制:我想使用函数组件、钩子,没有 Redux,没有 Renderprops。没有 HOC。
const App = () => {
return (
<div className="App">
<Wrapper answer={21}>
{/* I want to do this below: <p>the answer is {answer}</p> */}
<Content>
<p>the answer is answer</p>
</Content>
</Wrapper>
</div>
);
};
const WrapperContext = createContext();
const Wrapper = ({ children, ...props }) => {
return (
<WrapperContext.Provider
value={{
...props
}}
>
{children}
</WrapperContext.Provider>
);
};
const Content = ({ children }, ...remainingProps) => {
const wrapperProps = useContext(WrapperContext);
return (
<Wrapper>
<Card>
<div id="dialog-description">
{children}
</div>
</Card>
</Wrapper>
);
};
<Wrapper answer={21}>
{/* I want to do this below: <p>the answer is {answer}</p> */}
<Content>
<p>the answer is answer</p>
</Content>
</Wrapper>
因此,显而易见的答案是像在<p>the answer is 21</p>
. 如果合适,21 可以来自一个被使用两次的变量。基本上,但是 App 知道它需要使用 21,让它传递到需要它的两个地方。
const App = () => {
const answer = 21;
return (
<div className="App">
<Wrapper answer={answer}>
<Content>
<p>the answer is {answer}</p>
</Content>
</Wrapper>
</div>
);
};
但是我猜您要解决的实际情况是在组件树的较高部分有包装器,因此您不知道将什么传递给<p>
. 所以 Content 的工作是从上下文中获取值,然后使用它来呈现。但是为了做到这一点,您需要在 Content 组件和 App 组件之间进行双向通信。内容需要告诉应用程序“这是我从上下文中获得的值”,然后应用程序可以说“这是给定该值我想要呈现的内容”。
换句话说,您需要一个渲染道具,但这是您明确排除的可能性。如果你愿意接受这种可能性,这就是它的样子。
const App = () => {
return (
<div className="App">
<Wrapper answer={21}>
<Content>
{({ answer }) => <p>the answer is {answer}</p>}
</Content>
</Wrapper>
</div>
);
};
const Content = ({ children }, ...remainingProps) => {
const wrapperProps = useContext(WrapperContext);
return (
<Wrapper>
<Card>
<div id="dialog-description">
{children(wrapperProps)}
</div>
</Card>
</Wrapper>
);
};
Content.propTypes = {
children: PropTypes.func.isRequired,
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句