【问题标题】:React PropTypes - OneOf list of objectsReact PropTypes - OneOf 对象列表
【发布时间】:2021-05-26 17:08:32
【问题描述】:

我有以下数组:

export const VALID_LANGUAGES = [
  { label: "English", value: "en" },
  { label: "French", value: "fr" },
  { label: "Italian", value: "it" },
  { label: "Portuguese", value: "pt" },
  { label: "Spanish", value: "sp" },
];

并且我想确保组件接收这些值之一,作为道具“语言”。我该怎么做?

MyComponent.propTypes = {
  language: PropTypes.oneOf(VALID_LANGUAGES).isRequired, // Doesn't work :( 
};

【问题讨论】:

    标签: javascript reactjs react-native react-proptypes


    【解决方案1】:

    我认为您只需要将数组映射到有效语言条目的列表即可。 label 属性似乎是您想要的值。

    language: PropTypes.oneOf(VALID_LANGUAGES.map(({ label }) => label).isRequired
    

    如果您想要语言代码,只需映射值。

    language: PropTypes.oneOf(VALID_LANGUAGES.map(({ value }) => value).isRequired
    

    更新

    实际上,我刚刚测试了您的原始代码,它也可以工作。每个值都经过验证,直到最后一个选项“Klingon”无效,并且记录了 proptypes 错误。这是一个codeandbox演示:

    const VALID_LANGUAGES = [
      { label: "English", value: "en" },
      { label: "French", value: "fr" },
      { label: "Italian", value: "it" },
      { label: "Portuguese", value: "pt" },
      { label: "Spanish", value: "sp" }
    ];
    
    const MyComponent = ({ language }) => <div>Language: {language.label}</div>;
    MyComponent.propTypes = {
      language: PropTypes.oneOf(VALID_LANGUAGES).isRequired
    };
    
    export default function App() {
      const [language, setLanguage] = React.useState(0);
      return (
        <div className="App">
    
          <select onChange={(e) => setLanguage(e.target.value)} value={language}>
            <option value={-1} disabled>
              Select a Language
            </option>
            {VALID_LANGUAGES.map((language, index) => (
              <option key={language.value} value={index}>
                {language.label}
              </option>
            ))}
            <option value={-1}>Klingon</option>
          </select>
    
          <MyComponent language={VALID_LANGUAGES[language]} />
        </div>
      );
    }
    

    也许您可以澄清一下您的代码在哪些方面和/或如何不工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 2019-06-14
      • 2016-07-04
      • 1970-01-01
      • 2014-09-20
      • 2016-12-11
      • 2017-11-22
      相关资源
      最近更新 更多