[React Typescript] Strongly type Render prop
1. React.ReactNode
import { useState } from "react";
import { createPortal } from "react-dom";
import { Equal, Expect } from "../helpers/type-utils";
interface ModalChildProps {
isOpen: boolean;
openModal: () => void;
closeModal: () => void;
}
const Modal = ({
children,
}: {
children: (props: ModalChildProps) => React.ReactNode;
}) => {
const [isOpen, setIsOpen] = useState(false);
return (
<>
{children({
isOpen,
openModal: () => setIsOpen(true),
closeModal: () => setIsOpen(false),
})}
{createPortal(
<div>
<h1>Modal</h1>
</div>,
document.getElementById("modal-root")!
)}
</>
);
};
const Parent = () => {
return (
<Modal>
{(props) => {
type test = Expect<Equal<typeof props, ModalChildProps>>;
return (
<>
<button onClick={props.openModal}>Open Modal</button>
<button onClick={props.closeModal}>Close Modal</button>
</>
);
}}
</Modal>
);
};
2. Using React.FC<PropsType>
const Modal = ({ children }: { children: React.FC<ModalChildProps> }) => {}
3. Use render
prop instead of children
import { useState } from "react";
import { createPortal } from "react-dom";
import { Equal, Expect } from "../helpers/type-utils";
interface ModalChildProps {
isOpen: boolean;
openModal: () => void;
closeModal: () => void;
}
const Modal = ({ render }: { render: React.FC<ModalChildProps> }) => {
const [isOpen, setIsOpen] = useState(false);
return (
<>
{render({
isOpen,
openModal: () => setIsOpen(true),
closeModal: () => setIsOpen(false),
})}
{createPortal(
<div>
<h1>Modal</h1>
</div>,
document.getElementById("modal-root")!
)}
</>
);
};
const Parent = () => {
return (
<Modal
render={(props) => {
type test = Expect<Equal<typeof props, ModalChildProps>>;
return (
<>
<button onClick={props.openModal}>Open Modal</button>
<button onClick={props.closeModal}>Close Modal</button>
</>
);
}}
></Modal>
);
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2020-08-28 [Postgres] Keep Data Integrity with Constraints
2020-08-28 [Postgres] Removing Data with SQL Delete, Truncate, and Drop
2020-08-28 [Postgres] Using uuid-ossp extenstion
2020-08-28 [Machine Learning] Simplified Cost Function and Gradient Descent
2019-08-28 [SCSS] SASS dynamic class properties
2018-08-28 [VueJS + Typescript] Decouple Dependencies Using IoC Containers in Vue with TypeScript and InversifyJS
2017-08-28 [D3] Creating a D3 Force Layout in React