1.props的基本使用
<!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>Document</title>
</head>
<body>
<div id= 'test'></div>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
<script type="text/babel">
// 创建组件
class Person extends React.Component{
render(){
const {name,sex,age}=this.props
return(
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age}</li>
</ul>
)
}
}
// 渲染组件到页面
ReactDOM.render(<Person name = 'tom' sex='女' age = '18'/>,document.getElementById('test'))
</script>
</body>
</html>
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>Document</title>
</head>
<body>
<script type="text/javascript">
let arr1 = [1,3,5,7,9]
let arr2 = [2,4,10,6,8]
console.log(...arr1)//展开一个数组
let arr3 = [...arr1, ...arr2]//连接数组
console.log(...arr3)
// 函数传参,在函数中使用
function sum(...numbers) {
return numbers.reduce((preValue,curValue)=>{
return preValue + curValue
})
}
console.log(sum(1,2,4))
// 构造字面量时使用展开语法
let person = {name:'tom', age:18}
let person2 = {...person}//复制一个对象
// console.log(...person)//报错,展开运算符不能展开对象
person.name = 'jerry'
console.log(person.name)
console.log(person2.name)
// 复制对象的同时修改了属性,合并
let person3 = {...person,name:'jack'}
console.log(person3)
</script>
</body>
</html>
3.props的高级使用(批量传递props)
<!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>Document</title>
</head>
<body>
<div id= 'test'></div>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
<script type="text/babel">
// 创建组件
class Person extends React.Component{
render(){
const {name,sex,age}=this.props
return(
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age}</li>
</ul>
)
}
}
// 渲染组件到页面
// ReactDOM.render(<Person name = 'tom' sex='女' age = '18'/>,document.getElementById('test'))
// 批量传数据
const p ={name:'小芳', age:'18', sex:'女'}
ReactDOM.render(<Person {...p}/>,document.getElementById('test'))//这里...p不是原生js中对象的复制,因为babel+react使得...运算符可以展开一个对象,但仅限于标签属性的传递
</script>
</body>
</html>
4.对props的限制
<!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>Document</title>
</head>
<body>
<div id= 'test1'></div>
<div id= 'test2'></div>
<div id= 'test3'></div>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
<!-- 引入prop-types,用于对标签属性进行限制 -->
<!-- <script type="text/javascript" src="..js/prop-types.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.js"></script>
<script type="text/babel">
// 创建组件
class Person extends React.Component{
render(){
const {name,sex,age}=this.props
// props是只读的
// this.props.name = 'jack'//此行代码会报错,因为props是只读的
return(
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age+1}</li>
</ul>
)
}
}
Person.propTypes ={
// 对于(标签属性)名字,性别,年龄进行类型、必要性的限制
name:PropTypes.string.isRequired,//限制name为必传,且为字符串
sex:PropTypes.string,//限制sex为字符串
age:PropTypes.number,//限制age且为数值
speak:PropTypes.func,//限制speak为函数,注意用【func】而不是【function】
}
// 指定默认标签属性值
Person.defaultProps = {
sex:'男',//性别默认值为男
age:18,//年龄默认值为18
}
// 渲染组件到页面
ReactDOM.render(<Person name = 'tom' sex='女' age = {18} speak = {speak} />,document.getElementById('test1'))
ReactDOM.render(<Person name = 'jerry' sex='女' age = {19}/>,document.getElementById('test2'))
// 批量传数据
const p ={name:'小芳', age:18, sex:'女'}
ReactDOM.render(<Person {...p}/>,document.getElementById('test3'))//这里...p不是原生js中对象的复制,因为babel+react使得...运算符可以展开一个对象,但仅限于标签属性的传递
function speak(){
}
</script>
</body>
</html>
5.简写props
使用static将对属性的限制写入class中,写为类自身的属性
<!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>Document</title>
</head>
<body>
<div id= 'test1'></div>
<div id= 'test2'></div>
<div id= 'test3'></div>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
<!-- 引入prop-types,用于对标签属性进行限制 -->
<!-- <script type="text/javascript" src="..js/prop-types.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.js"></script>
<script type="text/babel">
// 创建组件
class Person extends React.Component{
// 对于(标签属性)名字,性别,年龄进行类型、必要性的限制
static propTypes ={
name:PropTypes.string.isRequired,//限制name为必传,且为字符串
sex:PropTypes.string,//限制sex为字符串
age:PropTypes.number,//限制age且为数值
speak:PropTypes.func,//限制speak为函数,注意用【func】而不是【function】
}
// 指定默认标签属性值
static defaultProps = {
sex:'男',//性别默认值为男
age:18,//年龄默认值为18
}
render(){
const {name,sex,age}=this.props
// props是只读的
// this.props.name = 'jack'//此行代码会报错,因为props是只读的
return(
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age+1}</li>
</ul>
)
}
}
// 渲染组件到页面
ReactDOM.render(<Person name = 'tom' sex='女' age = {18} speak = {speak} />,document.getElementById('test1'))
ReactDOM.render(<Person name = 'jerry' sex='女' age = {19}/>,document.getElementById('test2'))
// 批量传数据
const p ={name:'小芳', age:18, sex:'女'}
ReactDOM.render(<Person {...p}/>,document.getElementById('test3'))//这里...p不是原生js中对象的复制,因为babel+react使得...运算符可以展开一个对象,但仅限于标签属性的传递
function speak(){
}
</script>
</body>
</html>
6.props与构造器
<!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>Document</title>
</head>
<body>
<div id= 'test1'></div>
<div id= 'test2'></div>
<div id= 'test3'></div>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
<!-- 引入prop-types,用于对标签属性进行限制 -->
<!-- <script type="text/javascript" src="..js/prop-types.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.js"></script>
<script type="text/babel">
// 创建组件
class Person extends React.Component{
// 构造器是否接收props,是否传递给super,取决于:是否希望在构造器中通过this访问props
constructor(props)
{
super(props)
console.log('constructor', this.props)
}
// 对于(标签属性)名字,性别,年龄进行类型、必要性的限制
static propTypes ={
name:PropTypes.string.isRequired,//限制name为必传,且为字符串
sex:PropTypes.string,//限制sex为字符串
age:PropTypes.number,//限制age且为数值
speak:PropTypes.func,//限制speak为函数,注意用【func】而不是【function】
}
// 指定默认标签属性值
static defaultProps = {
sex:'男',//性别默认值为男
age:18,//年龄默认值为18
}
render(){
const {name,sex,age}=this.props
// props是只读的
// this.props.name = 'jack'//此行代码会报错,因为props是只读的
return(
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age+1}</li>
</ul>
)
}
}
// 渲染组件到页面
ReactDOM.render(<Person name = 'tom' sex='女' age = {18} speak = {speak} />,document.getElementById('test1'))
ReactDOM.render(<Person name = 'jerry' sex='女' age = {19}/>,document.getElementById('test2'))
// 批量传数据
const p ={name:'小芳', age:18, sex:'女'}
ReactDOM.render(<Person {...p}/>,document.getElementById('test3'))//这里...p不是原生js中对象的复制,因为babel+react使得...运算符可以展开一个对象,但仅限于标签属性的传递
function speak(){
}
</script>
</body>
</html>
7.函数式组件使用props
<!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>Document</title>
</head>
<body>
<div id= 'test1'></div>
<div id= 'test2'></div>
<div id= 'test3'></div>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
<!-- 引入prop-types,用于对标签属性进行限制 -->
<!-- <script type="text/javascript" src="..js/prop-types.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.js"></script>
<script type="text/babel">
// 创建组件
// class Person extends React.Component{
// // 构造器是否接收props,是否传递给super,取决于:是否希望在构造器中通过this访问props
// constructor(props)
// {
// super(props)
// console.log('constructor', this.props)
// }
// // 对于(标签属性)名字,性别,年龄进行类型、必要性的限制
// static propTypes ={
// name:PropTypes.string.isRequired,//限制name为必传,且为字符串
// sex:PropTypes.string,//限制sex为字符串
// age:PropTypes.number,//限制age且为数值
// speak:PropTypes.func,//限制speak为函数,注意用【func】而不是【function】
// }
// // 指定默认标签属性值
// static defaultProps = {
// sex:'男',//性别默认值为男
// age:18,//年龄默认值为18
// }
// render(){
// const {name,sex,age}=this.props
// // props是只读的
// // this.props.name = 'jack'//此行代码会报错,因为props是只读的
// return(
// <ul>
// <li>姓名:{name}</li>
// <li>性别:{sex}</li>
// <li>年龄:{age+1}</li>
// </ul>
// )
// }
// }
function Person(props) {
const {name, age, sex} = props
return(
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age+1}</li>
</ul>
)
}
Person.propTypes ={
name:PropTypes.string.isRequired,//限制name为必传,且为字符串
sex:PropTypes.string,//限制sex为字符串
age:PropTypes.number,//限制age且为数值
speak:PropTypes.func,//限制speak为函数,注意用【func】而不是【function】
}
// 渲染组件到页面
ReactDOM.render(<Person name = 'tom' sex='女' age = {18} speak = {speak} />,document.getElementById('test1'))
ReactDOM.render(<Person name = 'jerry' sex='女' age = {19}/>,document.getElementById('test2'))
// 批量传数据
const p ={name:'小芳', age:18, sex:'女'}
ReactDOM.render(<Person {...p}/>,document.getElementById('test3'))//这里...p不是原生js中对象的复制,因为babel+react使得...运算符可以展开一个对象,但仅限于标签属性的传递
function speak(){
}
</script>
</body>
</html>
8.总结
(1)每个组件对象都会有props(properties)属性
(2)组件标签的属性都保存在props中
(3)通过标签属性从组件外部向组件内部传递变化的数据
(4)组件内部不要修改props数据
(5)编码操作