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

反应道具类型根据旗帜不同所需的道具

谢善
2023-03-14

我有一个React组件,它获取一个配置对象作为道具,它看起来像这样:

{
    active: true,
    foo: {
         bar: 'baz'
    }
}

在某些情况下,我希望通过使用active:false传入另一个对象来禁用组件显示的功能,如下所示:

{
    active: false
}

这工作正常,不是问题。

但是,我还希望确保使用我的组件的客户端代码提供正确的配置对象

  • 如果active为true,则需要foo
  • 如果active为false,则foo是可选的,不需要提供

我如何为这样的情况定义道具类型?

我试过:

MyComponent.propTypes = {
    config: PropTypes.oneOf([
        {
            active: false
        },
        PropTypes.shape({
            active: true,
            foo: PropTypes.shape({
                bar: PropTypes.string.isRequired
            })
        }).isRequired
    ]).isRequired
};

但这给了我以下警告:

警告:失败的道具类型:提供给MyComponent的值[object object]无效的道具config,应为[{“active”:true},null]之一。

在MyComponent中

我知道为什么这不起作用:这是因为PropTypes.oneOf不期望动态prop类型匹配器作为值,而只是一个有效参数的数组。

问题是,有没有办法让它发挥作用?

我做了一个可运行的沙盒示例,您可以尝试上面的示例代码:https://codesandbox.io/s/n9o0wl5zlj

共有2个答案

孙嘉
2023-03-14

您可以使用自定义的propType(在propTypes网站上记录)功能,例如:

MyComponent.proptypes = {
    active: PropTypes.bool,
    foo: function(props, propName, componentName) {
        if (props['active'] && !props[propName]) {
            return new Error(
                `${propName} is required when active is true in ${componentName}.`
            );
        }
    }
}
徐俊楚
2023-03-14

正如wgcrouch在他的回答中所建议的那样,prop-typeslib不提供此功能,因此使用自定义的prop-types是一种可行的方法

幸运的是,正如Tom Fenech在对我的问题的评论中指出的,这个特殊的问题已经解决了,所以我使用了一个可用的npm包:反应-需要-如果。

我的工作解决方案如下:

import React from 'react';
import PropTypes from 'prop-types';
import requiredIf from 'react-required-if';

function MyComponent({ config }) {
  if (!config.active) {
    return null;
  }
  return <h1>Hello {config.foo.bar}!</h1>;
}

MyComponent.propTypes = {
  config: PropTypes.shape({
    active: PropTypes.bool.isRequired,
    foo: requiredIf(
      PropTypes.shape({
        bar: PropTypes.string.isRequired
      }),
      props => props.active
    )
  })
};

export default MyComponent;

→ 请参阅更新的代码沙盒和解决方案。

 类似资料:
  • 我有一个组件,根据其大小接收道具。道具可以是字符串或数字,例如:或。 我能让知道这可以是PropTypes验证中的一个或另一个吗? 如果未指定类型,则会收到警告: prop type无效;它必须是一个函数,通常来自React。道具类型。

  • 在本页React Native State on React Native docs中,我们有以下语句: 道具由父级设置,并且在组件的整个生存期内都是固定的。 但是,在本页React文档上的React State and Lifecycle中,我们有以下声明: 因为this.props和this.state可能是异步更新的,所以不应该依赖它们的值来计算下一个状态。 我的误解在哪里?对我来说,当组件

  • 我收到警告“警告:失败的道具类型:提供给的类型为

  • 我见过多个使用Typescript的React组件示例: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++组件 当我们不使用道具或国家时,似乎没有一个明确的惯例。 人们将这些类型设置为,,,, ,等等。这是我到目前为止看到的:

  • 可在喜欢的地点插上旗帜。 1. 显示想插上旗帜的地点,轻触(选项)>[插上旗帜]。 在地图的中心会显示(用户旗帜)。 2. 将(用户旗帜)拖拽至喜欢的位置。 仅能插上1支用户旗帜。 删除用户旗帜 1. 轻触(用户旗帜)。 显示信息栏。 2. 轻触(信息)。 3. 轻触(选项)>[删除]>[OK]。