首页 > 其他分享 >[React Typescript] Strongly type Render prop

[React Typescript] Strongly type Render prop

时间:2023-08-28 20:44:35浏览次数:42  
标签:Strongly Typescript const Render React Modal import type children

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 renderprop 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>
  );
};

 

标签:Strongly,Typescript,const,Render,React,Modal,import,type,children
From: https://www.cnblogs.com/Answer1215/p/17663342.html

相关文章

  • [React Typescript] Strongly Typing Lazy Loaded Components with Generics
    Navigatingtothetypedefinitionfor lazy by CMD+click inlocalVSCode,orinthe DefinitelyTyped repo.Wecanseethefollowingdefinition:functionlazy<TextendsComponentType<any>>( factory:()=>Promise<{default:T}>):L......
  • TypeScript – Decorator Metadata
    前言在 TypeScript–Decorator装饰器 里,我有提到TypeScript只实现了decorate的特性,把metadata的特性独立了出来。本来我以为还需要等待很长的时间他们才会实现,没想到v5.2既然推出了。哎哟,不错哦!声明:Decorator不是TypeScript语法,它是ECMAScript(AKAJavaScr......
  • TypeScript – Using Disposable
    前言TypeScriptv5.2多了一个新功能叫 Disposable。Dispose的作用是让"对象"离开"作用域"后做出一些"释放资源"的操作。很多地方都可以看到 Dispose概念。比如WebComponent的 disconnectedCallback,Angular组件的 ngOnDestroy。而对象释放资源在其它面向对象......
  • Unity RenderTexture 当作为 Camera.targetTexture 时,在某些安卓手机或模拟器无法显示
    今天打包的时候遇到一个坑,就是用RenderTexture的时候,在某些手机上会显示黑屏,一查发现这是某些安卓设备才会出现的BUG(奇怪的是那台测试机是鸿蒙系统,懂的都懂)解决方法也很简单,就是不能用RenderTexture资源,而改成动态代码创建即可解决这个BUG同时解决了另一个RenderTexture的BUG,就......
  • QA From TinyRenderer&TinyRenderer问题汇总
    最近在学习TinyRenderer这个库,包括学习这个库本身的wiki以及一些知乎上的内容。遇到的问题在这里记录一下。git:https://github.com/xkyl-yhw/SoftRenderer库文件混乱,使用的版本不同.以及函数不统一的问题比较经典的就是本身tinyrenderer在一开始教学为了区分vec和vec,于是就有一......
  • TypeScript – 冷知识
    当genericreturn遇上parameter 报错了。原因是querySelector默认返回类型是抽象的Element。而method参数要求的是具体的InputElement解决方法是传入具体的InputElement类型constinput=document.querySelector<HTMLInputElement>('.input')!;但这不是重点......
  • TypeScript(TS)JavaScript(JS)中的所有循环方法
    for循环:for(leti=0;i<array.length;i++){//循环体}for…of循环:for(constelementofarray){//循环体}forEach方法:array.forEach((element)=>{//循环体});map方法:constnewArray=array.map((element)=>{//对......
  • typescript 数组根据指定字段去重
    this.listDataIn=data.Result.data;constuniqueItems:Item[]=Array.from(newSet(this.listDataIn.map(item=>item.MyLandID))).map(id=>{returnobj.listDataIn.find(item=>item.MyLandID===id);});......
  • [React Typescript] JSX.IntrinsicElements
    interfaceIntrinsicElements{//HTMLa:React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>,HTMLAnchorElement>;abbr:React.DetailedHTMLProps<React.HTMLAttributes<HTMLElemen......
  • typeScript学习-泛型
    typeScript学习泛型为什么要用泛型?泛型定义。泛型在类中的应用?封装一个面向对象的ArrayList类。泛型默认值。泛型约束。泛型在Vue3源码中的应用。exendskeyof+keyof的联合应用。泛型反向赋值。具有以下特点的数据类型叫泛型:特点一:定义时不明确使用时必须明确成某......