props的基本使用
props的基本使用:<Person name="张三" gender="男" age="18"/>
。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>test</title>
<script src="./js/react.development.js"></script>
<script src="./js/react-dom.development.js"></script>
<script src="./js/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
class Person extends React.Component{
render(){
const {name,age,gender} = this.props;
return (
<ul>
<li>姓名:{name}</li>
<li>性别:{gender}</li>
<li>年龄:{age}</li>
</ul>
)
}
}
ReactDOM.render(<Person name="张三" gender="男" age="18"/>,document.getElementById("root"));
</script>
</body>
</html>
props的语法糖
props的语法糖:<Person {...p1}/>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>test</title>
<script src="./js/react.development.js"></script>
<script src="./js/react-dom.development.js"></script>
<script src="./js/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
class Person extends React.Component{
render(){
const {name,age,gender} = this.props;
return (
<ul>
<li>姓名:{name}</li>
<li>性别:{gender}</li>
<li>年龄:{age}</li>
</ul>
)
}
}
const p1 = {
name:"李四",
gender:"男",
age:"19"
}
ReactDOM.render(<Person {...p1}/>,document.getElementById("root"));
</script>
</body>
</html>
这里涉及到扩展运算符(...
)的使用。扩展运算符很常用,以下是它的一些应用场景。
- 平铺数组。
let arr = [1,3,5]; console.log(...arr); // 1 3 5
- 连接数组。
let arr1 = [1,3,5];
let arr2 = [2,7,9];
console.log([...arr1,...arr2]); // [1, 3, 5, 2, 7, 9]
- 函数形参。
function add(...numbers){
return numbers.reduce((preValue,currentValue) => preValue+=currentValue,0);
}
let sum = add(1,2,3,4,5); console.log(sum); // 15
- 构建字面量对象。
let obj = {
a:100,
b:200
}
const obj2 = {...obj};
console.log(obj2); // {a: 100, b: 200}
- 合并对象。
let obj = {
a:"hello",
b:"world"
}
let obj2 = {
x:100,
y:200
}
let obj3 = {...obj,...obj2};
console.log(obj3); //{a: 'hello', b: 'world', x: 100, y: 200}
限制props
可以对props进行限制,如限制props的类型、必要性,指定默认值。
首先,需要下载并引入prop-types.js
,本例使用15.6.2版本,可到这里下载。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>test</title>
<script src="./js/react.development.js"></script>
<script src="./js/react-dom.development.js"></script>
<script src="./js/babel.min.js"></script>
<script src="./js/prop-types.js"></script>
</head>
<body>
<div id="root"></div>
<div id="app"></div>
<script type="text/babel">
class Person extends React.Component{
render(){
const {name,age,gender} = this.props;
return (
<ul>
<li>姓名:{name}</li>
<li>性别:{gender}</li>
<li>年龄:{age}</li>
</ul>
)
}
}
Person.propTypes = {
name:PropTypes.string.isRequired,
age:PropTypes.number,
gender:PropTypes.string
}
Person.defaultProps = {
age:20,
gender:"男"
}
ReactDOM.render(<Person name="张三" age="18" gender="男"/>,document.getElementById("root"));
ReactDOM.render(<Person name="李四" />,document.getElementById("app"));
</script>
</body>
</html>
propTypes
,对props的类型、必要性进行限制
name:PropTypes.string.isRequired
,要求name为字符串类型,且必须传。age:PropTypes.number
,要求age为数值类型。gender:PropTypes.string
,要求gender为字符串类型。
defaultProps
,用于指定props的默认值。
限制props的简写形式
- 类中定义的方法,放在类的原型对象上,供所有实例使用。
- 类中的赋值语句,等号左侧的属性或方法,放在类的实例对象上。
- 类中的赋值语句,前面加
static
修饰后,等号左侧的属性或方法,会放在类本身。
根据第3点:“类中,static
修改的赋值语句,等号左侧的属性或方法,会放在类本身”,可以对props限制进行简写:将propTypes
和defaultProps
放入类中。如下。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>test</title>
<script src="./js/react.development.js"></script>
<script src="./js/react-dom.development.js"></script>
<script src="./js/babel.min.js"></script>
<script src="./js/prop-types.js"></script>
</head>
<body>
<div id="root"></div>
<div id="app"></div>
<script type="text/babel">
class Person extends React.Component{
static propTypes = {
name:PropTypes.string.isRequired,
age:PropTypes.numbers,
gender:PropTypes.string
}
static defaultProps = {
age:20,
gender:"男"
}
render(){
const {name,age,gender} = this.props;
return (
<ul>
<li>姓名:{name}</li>
<li>性别:{gender}</li>
<li>年龄:{age}</li>
</ul>
)
}
}
Person.propTypes = {
name:PropTypes.string.isRequired,
age:PropTypes.number,
gender:PropTypes.string
}
Person.defaultProps = {
age:20,
gender:"男"
}
ReactDOM.render(<Person name="张三" age="18" gender="男"/>,document.getElementById("root"));
ReactDOM.render(<Person name="李四" />,document.getElementById("app"));
</script>
</body>
</html>