PropTypes在React中不起作用

时间:2018-03-01 13:28:15

标签: javascript reactjs react-proptypes

我正在运行React 16.2.0并且我正在使用PropTypes 15.6.1。我正在使用ES6语法和Webpack。

我试图让PropTypes在传递无效道具时抛出警告,但它不起作用。这是代码:

SimpleMessage.js

import React from "react"
import PropTypes from "prop-types"

class SimpleMessage extends React.Component {
    render() {
        return(
            <p>{this.props.message}</p>
        )
    }
}

SimpleMessage.propTypes = {
    message: PropTypes.func
}

export default SimpleMessage

index.js

import React from "react"
import ReactDOM from "react-dom"

import SimpleMessage from "./components/SimpleMessage"

window.React = React

ReactDOM.render(
    <SimpleMessage message={"Hello World"} />,
    document.getElementById("react-container")
)

webpack.config.js

var webpack = require("webpack")
var path = require("path")

process.noDeprecation = true

module.exports = {
    entry: "./src/index.js",
    output: {
        path: path.join(__dirname, 'dist', 'assets'),
        filename: "bundle.js",
        sourceMapFilename: 'bundle.map'
    },
    devtool: '#source-map',
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /(node_modules)/,
                loader: 'babel-loader',
                query: {
                    presets: ['env', 'stage-0', 'react']
                }
            },
            {
                test: /\.css$/,
                use: ['style-loader','css-loader', {
                    loader: 'postcss-loader',
                    options: {
                      plugins: () => [require('autoprefixer')]
                    }}]
            },
            {
                test: /\.scss/,
                use: ['style-loader','css-loader', {
                    loader: 'postcss-loader',
                    options: {
                      plugins: () => [require('autoprefixer')]
                    }}, 'sass-loader']
            }
        ]
    },
    plugins: [
        new webpack.DefinePlugin({
            "process.env": {
                NODE_ENV: JSON.stringify("production")
            }
        }),
        new webpack.optimize.UglifyJsPlugin({
            sourceMap: true,
            warnings: false,
            mangle: false
        })
    ]

}

你可能会注意到我传递了一个字符串(&#34; Hello World&#34;)但是检查了proptypes中的函数。我没有通过proptypes得到任何错误或警告,代码运行得很好。

2 个答案:

答案 0 :(得分:1)

按预期工作:

  

警告:道具类型失败:提供给message的{​​{1}}类型的道具string无效,预期为SimpleMessage

请务必检查浏览器控制台,这是显示错误的位置。

https://codepen.io/anon/pen/paGYjm?editors=1111

另外:

  

您不应将UglifyJsPlugin或DefinePlugin应用于&#39; production&#39;开发中的价值,因为它们会隐藏有用的React警告,并使构建更慢。

source

答案 1 :(得分:0)

这是因为您已将propType定义为function,但您将其作为string发送。

将代码更改为message: PropTypes.string