PropTypes 在 React 中不起作用
PropTypes doesn't work in React
我是 运行 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
})
]
}
正如您可能注意到的那样,我传递了一个字符串 ("Hello World"),但检查了 proptypes 中的函数。我没有收到 proptypes 的任何错误或警告,代码运行正常。
那是因为您将 propType
定义为 function
,但您将其发送为 string
。
将代码更改为message: PropTypes.string
按预期工作:
Warning: Failed prop type: Invalid prop message
of type string
supplied to SimpleMessage
, expected function
.
请务必检查您的浏览器控制台,这是显示错误的地方。
https://codepen.io/anon/pen/paGYjm?editors=1111
还有:
You shouldn’t apply UglifyJsPlugin or DefinePlugin with 'production' value in development because they will hide useful React warnings, and make the builds much slower.
我是 运行 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
})
]
}
正如您可能注意到的那样,我传递了一个字符串 ("Hello World"),但检查了 proptypes 中的函数。我没有收到 proptypes 的任何错误或警告,代码运行正常。
那是因为您将 propType
定义为 function
,但您将其发送为 string
。
将代码更改为message: PropTypes.string
按预期工作:
Warning: Failed prop type: Invalid prop
message
of typestring
supplied toSimpleMessage
, expectedfunction
.
请务必检查您的浏览器控制台,这是显示错误的地方。
https://codepen.io/anon/pen/paGYjm?editors=1111
还有:
You shouldn’t apply UglifyJsPlugin or DefinePlugin with 'production' value in development because they will hide useful React warnings, and make the builds much slower.