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

反应挂钩-识别“类型”子组件

鲜于峰
2023-03-14

我正在构建一个REACT应用程序(使用TypeScript),我面临一个问题,该解决方案需要识别不同的REACT子组件的可能性。基本上是这样的:

const RibbonTab: ReactFC<IRibbonTab> = (props) => {
 return <p>{props.header}</p>
}

const Ribbon: ReactFC<IRibbon> = (props) => {
  const ribbonTabs = props.children.ofType<RibbonTab>(); // This is what I'd like to accomplish.

  return <>props.children</>;
}

我已经搜索了一段时间,许多,如果不是所有接受的答案(像这里:只允许反应组件中特定类型的子级),都是使用type.displayNamethis.props.children[子级]。type.display名称)。不幸的是,也有人说displayName在生产中可能会缩小,所以我不能依赖它。

我发现的唯一方法是“强制”一个自己的显示名称。基本上,我创建了一个接口IUniqueComponent,然后为每个应该可以识别的组件扩展它。大概是这样的:

interface IUniqueComponent {
  displayNameForIdentification: string;
}

const RibbonTab: ReactFC<IRibbonTab extends IUniqueComponent> = (props) => { ... }
RibbonTab.defaultProps = { displayNameForIdentification: "RibbonTab" }

然后,使用React。儿童对于每个,我可以筛选子项:

React.Children.forEach(props.children, (c) => { 
  if (React.isValidElement(c)) {
    if (c.props.displayNameForIdentification === 'WHAT I WANT') { ... }
  }
})

我不喜欢这个解决方案的事实是,我自己添加了标识符,甚至道具名称,displayNameFor鉴定,也没有被React保存在安全的地方,但它只是一个道具:我不确定开发人员是否覆盖了该道具(好吧,我可以说“永远不要使用displayNameFor标识PROPS”,但我想避免这样做)。

那么,有没有办法识别REACT子组件的类型?

编辑:按照拉梅什的建议,我可以写这样的东西:

React.Children.forEach(props.children, (c) => { 
  if (React.isValidElement(c)) {
    if (c.type.name === 'WHAT I WANT') { ... }
  }
})

但是,TypeScript不喜欢c.type。name,它给了我以下错误,我无法解决它:

类型“string |”(props:any)上不存在属性“name”)=

对这个新人有什么建议吗?

共有2个答案

戴鸿羽
2023-03-14

您可以这样做:

{children

和组成部分:

const Tab = (props) => {...}

Tab.displayName = "Tab"

这只是我的示例,它只呈现名称为“Tab”的组件

太叔何平
2023-03-14

使用类型。name这将返回函数的名称

import * as React from "react";
import { render } from "react-dom";


class App extends React.Component<{}> {
  public render() {
    return (
      <div>
      </div>
    );
  }
}

const app = <App/>

console.log(app.type.name==="App")

render(app, document.getElementById("root"));
 类似资料:
  • 问题内容: 在带有钩子的React中,更新状态的正确方法是嵌套对象是什么? 一个人怎么会使用到的更新来(附加一个字段)? (改变价值)? 问题答案: 您可以像这样传递新值

  • 使用React钩子(如)的、和生命周期钩子的等价物是什么?

  • 问题内容: 随着React 中钩子的引入,现在的主要困惑是何时将函数组件与钩子和类组件一起使用,因为在钩子的帮助下,甚至可以在函数组件中获得和部分使用。所以,我有以下问题 钩子的真正优点是什么? 何时使用带有钩子的函数组件和类组件? 例如,带有钩子的功能组件不能像类组件那样帮助性能。他们没有执行就不能跳过重新渲染。还有其他原因吗? 提前致谢。 问题答案: 引入和其他特性(例如和)的思想是帮助减少必

  • 我正在尝试新的hooks功能,并坚持认为我的状态没有更新。 实际上,状态已更新(我可以在console.log中看到更新的值,并且我的组件会重新运行useEffect),但是useEffect方法使用我的旧状态,并仅将签名保存给第一个用户,而活动用户在状态中确实发生了更改。 我想过添加useCallback,并将我的方法移动到use效果或组件本身,但我可以设法让它工作。 状态: 这是我的效果: 这

  • 在我看来,React-Hooks-useState非常适合模式选择使用props中的值或使用自己的状态,但是当我有条件地使用hook时,lint显示了一些错误。 工作示例 我尝试使用钩子,条件如下,但是使用eslint error