它必须是一个函数,通常来自React.PropTypes


69

我想将字符串从Main传递到Header。它成功但警告。我是React的初学者,所以我不知道这it must be a function意味着什么。

有人知道如何解决此警告吗?

警告是:

在此处输入图片说明

我的代码如下:

Main.js

import React from 'react';

import Header from './Header';
import AppList from './AppList/AppList';
import Footer from './Footer';

const propTypes = {
  mainInfo: React.PropTypes.shape({
    title: React.PropTypes.string.isRequired,
    apps: React.PropTypes.array.isRequired,
  }),
};

class Main extends React.Component {
  static methodsAreOk() {
    return true;
  }

  render() {
    return (
      <div>
        <Header title={this.props.mainInfo.title} />
        <AppList apps={this.props.mainInfo.apps} />
        <Footer />
      </div>
    );
  }
}

Main.propTypes = propTypes;

export default Main;

Header.js

import React from 'react';

const propTypes = {
  title: React.PropTypes.string.isRequred,
};

class Header extends React.Component {
  static methodsAreOk() {
    return true;
  }

  render() {
    return (
      <div className="header">
        <h1>{this.props.title}</h1>
      </div>
    );
  }
}

Header.propTypes = propTypes;

export default Header;

如果this.props.mainInfo.title仅输入字符串,则警告不会更改。
morizo​​tter

Answers:


119

您有一个错误:React.PropTypes.string.isRequred。拼写isRequired正确,应该没问题。


20
严重的:facepalm:当我读到这篇文章时,它解决了我的问题。
robskrob

3
你是救生员!真是太棒了!
Pramod Sharma

1
是的,你做得很好!hideModal: PropTypes.func.isRequired,!==hideModal: PropTypes.func.required,

1
就我而言,我写的PropTypes.boolean不是PropTypes.bool
kevbost

1
我有isRequired.isRequired U_U
Adrian Serna

25

当您的PropType实际上是时,就会发生这种情况undefined

在我的情况下,我将propType指定为PropTypes.integer,而不是proptypes列表之一。从字面上变成undefined。相反,我应该使用过PropTypes.number

注意与PropTypes.boolvsPropTypes.boolean以及PropTypes.funcvs相似的错误PropTypes.function


4
啊!而我只是用PropTypes.boolean代替了PropTypes.bool。谢谢!
Caoilte

@Caoilte请确保提供有用的答案,如果您认为此问题有用,也请务必提供有关问题。
泰勒·科利尔

1
好的答案,比所选答案更通用。只是这样做是boolean不是bool太:P
NonameSL

6
即使在阅读完此答案后,我仍然花了很长时间才意识到自己写的PropTypes.function不是PropTypes.func!🙄–
mrtnmgs


2

例如

React.PropTypes.sting
React.PropTypes.text

React还可以告诉用户:“您定义的PropType'sting'是未定义的。您拼错了吗?可用的PropType是:字符串,数字,布尔值等。”


我有布尔值,而不是bool得到此错误:)
agm1984 '17

1

解决问题的简单方法分为三个步骤:

  • 步骤1:安装NPM prop-types软件包(npm prop-types install);
  • 步骤2: 将包导入文件中。

码: import PropTypes from 'prop-types';

  • 第3步:React从语句中删除关键字(例如:React.PropTypes.string.isRequired to PropTypes.string.isRequired取决于您的语句,所以只需删除React关键字,因为您现在是从prop-types而不是从React库导入的。

1

只需复制并粘贴,除非您可以确保不会键入任何错字!

我也遇到了这个问题,浪费了我很多时间来解决它!

因此,只需做个注释即可!

VS代码和插件

万一有错字!

```jsx

TestModal.propTypes = {
    title: PropTypes.string,
    //badHideModal: PropTypes.func.required,
    hideModal: PropTypes.func.isRequired,
};

```

在此处输入图片说明


1
我对函数和布尔属性类型有相同的问题,可以通过用func和bool替换来解决。谢谢!
ni3

0

类似isRequredisRequired事情发生在我身上。我试图定义默认的props,但是复制粘贴了propTypes且从未更改名称,所以最终得到了这样的内容:

import PropTypes from 'prop-types'

const Main = ({ title }) => // whatever

Main.propTypes = {
  title: PropTypes.string
}

Main.propTypes = { // this should have been Main.defaultProps! 🤦‍♂️
  title: 'This is the default title!'
}

因此PropTypes抱怨title的prop类型不正确。上面写着“它必须是一个函数,通常来自React.PropTypes,但它是一个字符串”。

我以为我快疯了。我一直在看第一个Main.propTypes,试图找到错别字或任何可能出错的东西,但是如您所见,这完全没问题。我打开了多个定义了prop类型但没有引发错误的文件。

我显然在看错地方,但最终发现它很不幸。我很幸运能真正找到它。这些令人难以置信的bug很难弄清,因为它们就像魔术师一样,一只手在吸引另一只眼睛的同时移动另一只眼睛,通常在众目sight之下。


0

就我而言,它发生在我声明时Component.propTypes并在其下,而不是Component.defaultProps我写了,而是再次写了Component.propTypes赋默认值的代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.