当前位置: 首页 > 知识库问答 >
问题:

react.js - React 中 父组件调用子组件传递 A,B 两个参数,B 参数类型如何根据 A 参数推断出来?

郭远
2024-07-08

//子组件
type Props = { name: unknown; onChange: (data: unknown) => void };

export function Child(props: Props) {
  return (
    <div
      onClick={() => {
        props.onChange(props.name);
      }}
    ></div>
  );
}

//父组件
export function Parent() {
  const name = ''; // name的类型任意可能是string也可能其他复杂类型
  return (
    <Child
      name={name}
      onChange={(data) => {
        console.log(data); //如果希望这里data类型和name保持一致,应该如何编写字组件Props类型呢
      }}
    ></Child>
  );
}


父组件 onChange 里面 data 如何根据 name 类型推断出来

共有2个答案

梁丘威
2024-07-08
type Props<T> = { name: T; onChange: (data: T) => void };

export function Child<T>(props: Props<T>) {
    /** */
}
霍书
2024-07-08

在React和TypeScript中,要使子组件的Props类型允许onChangedata参数类型根据name参数类型进行推断,你需要使用泛型(Generics)。泛型允许你创建可重用的组件,这些组件可以工作于多种数据类型上。

下面是如何修改你的子组件Child和父组件Parent以利用泛型来实现这一点的示例:

// 子组件
type ChildProps<T> = {
  name: T;
  onChange: (data: T) => void;
};

export function Child<T>(props: ChildProps<T>) {
  return (
    <div
      onClick={() => {
        props.onChange(props.name);
      }}
    ></div>
  );
}

// 父组件
export function Parent() {
  const name = '' as string; // 这里明确指定name的类型为string
  return (
    <Child
      name={name}
      onChange={(data: string) => { // 这里data的类型被推断为string
        console.log(data);
      }}
    />
  );
}

// 或者,如果你想要TypeScript自动推断类型,你可以省略`onChange`中的类型注解:
export function ParentAutoInferred() {
  const name = '' as string; // 这里明确指定name的类型为string
  return (
    <Child
      name={name}
      onChange={(data) => { // TypeScript将自动推断data的类型为string
        console.log(data);
      }}
    />
  );
}

在这个例子中,Child组件现在是一个泛型组件,它接受一个类型参数T,该类型参数用于指定nameonChangedata参数的类型。在Parent组件中,我们明确指定了name的类型为string,因此onChangedata参数也被自动推断为string类型。

如果你不想在Parent组件的onChange处理函数中明确指定类型,TypeScript也会基于Child组件的泛型参数来自动推断data的类型。这就是在ParentAutoInferred组件中我们所做的。

 类似资料:
  • 在本教程中,他们将一个回调函数从父组件传递到子组件,并从子组件传递到子组件。我的问题是如何设置参数?我的猜测是,起点是在组件中调用。从那以后,我就不知道是如何进入的了。它是否存储在“on click方块板”中?

  • 问题内容: 我正在尝试访问DetailsPage组件中的 ID ,但无法访问它。我试过了 将参数传递给DetailsPage,但徒劳。 所以有什么想法如何将ID传递给DetailsPage吗? 问题答案: 如果要将props传递到路线内的组件,最简单的方法是利用,如下所示: 您可以使用以下内容访问道具: 将需要通过原路线的道具,否则你将只能得到内。

  • [Vue]父组件A通过props传入子组件B一个函数f,子组件B想要执行f(null,B的一个data),并判断f中是否用到了第一个参数(通过try catch),如果用到了,再将f通过props传入孙组件C;否则将执行结果传入C? 父组件A中: 子组件B中: 孙组件C中: 目的是 1在组件A里定义一个函数f(参数1为子组件B的一个data,参数2为孙组件C的一个data) 2不能修改孙组件C的代

  • public static void main(String[]args){ 公共类CustomConfiguration{ public static void readConfig(String filename){//从config.properties文件读取 } 我的问题是如何将“a”传递给CustomConfiguration类?

  • 问题内容: 对不起这个基本问题。我想将一个切片作为参数传递给。像这样: 结果将是,但这显然不起作用。 (我要格式化的字符串比这要复杂的多,因此,简单的串联是不会做到的:) 所以问题是:如果我有数组,如何将其作为单独的参数传递给?或者:我可以调用在Go中传递参数列表的函数吗? 问题答案: 正如您在IRC上发现的那样,它将起作用: 您的原始代码无法正常工作,因为接受a 并且无法将其隐式或显式转换为该类

  • 我试着做一个ArrayList,包含另一个类的对象,一个名字,还有turn。类似于python字典的东西。 所以我做了一个有三个值的类。 我试图在主类的构造函数中调用它,如下所示: 但它引发了一个错误:无法推断ArrayList的类型参数