React 学习笔记 —— props 属性

基本用法

  • this.state 是组件内部产生的数据
  • this.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>
    <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="app1"></div>
    <div id="app2"></div>
    <div id="app3"></div>
    <script type="text/babel">
        class Person extends React.Component {
            render () {
            	// 从实例的 props 属性获取传递的参数
                const {name, sex, age} = this.props
                return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age}</li>
                    </ul>
                )
            }

        }
        // 通过 属性 给组件传递参数
        ReactDOM.render(<Person name="jerry" age="19" sex="男"/>, document.getElementById('app1'))
        ReactDOM.render(<Person name="tom" age="18" sex="女"/>, document.getElementById('app2'))
        // 一次传递多个属性
        const person = {name: '老刘', age: '30', sex='女'}
        ReactDOM.render(<Person {...person}/>, document.getElementById('app3'))
    </script>
</body>
</html>

类型约束

<!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>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    <!-- 提供类型约束,对组件标签属性进行限制 -->
    <!-- 引入后,会为全局提供一个 PropTypes 对象 -->
    <script src="../js/prop-types.js"></script>
</head>
<body>
    <div id="app1"></div>
    <div id="app2"></div>
    <div id="app3"></div>
    <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>
                )
            }

        }
        // 在组件类的 propTypes 上添加类型约束描述
        Person.propTypes = {
			name: PropTypes.string,	// 限制 name 必须为 string 类型
			sex: PropTypes.string.isRequired,    // 限制 sex 必须为 string 类型,且是必需的
			method: PropTypes.func,	// 函数类型约束为 func,因为 function 是声明函数的关键字,需要闭开

		}
        ReactDOM.render(<Person name="jerry" age="19" sex="男"/>, document.getElementById('app1'))
        ReactDOM.render(<Person name="tom" age="18" sex="女"/>, document.getElementById('app2'))
        ReactDOM.render(<Person name="老刘" age="30" sex="女"/>, document.getElementById('app3'))
    </script>
</body>
</html>

默认值参数

<!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>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    <!-- 提供类型约束,对组件标签属性进行限制 -->
    <!-- 引入后,会为全局提供一个 PropTypes 对象 -->
    <script src="../js/prop-types.js"></script>
</head>
<body>
    <div id="app1"></div>
    <div id="app2"></div>
    <div id="app3"></div>
    <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>
                )
            }

        }
        // 在组件类的 propTypes 上添加类型约束描述
        Person.defaultProps = {
            sex: "男",
            age: "18"
        }
        ReactDOM.render(<Person name="jerry" age="19" sex="男"/>, document.getElementById('app1'))
        ReactDOM.render(<Person name="tom" age="18" sex="女"/>, document.getElementById('app2'))
        ReactDOM.render(<Person name="老刘" age="30" sex="女"/>, document.getElementById('app3'))
    </script>
</body>
</html>

约束、默认值的简写

class Person extends React.Component {
    render () {
        const {name, sex, age} = this.props
        return (
            <ul>
                <li>姓名:{name}</li>
                <li>性别:{sex}</li>
                <li>年龄:{age}</li>
            </ul>
        )
    }
    // 在组件类的 propTypes 上添加类型约束描述
	static propTypes = {
		name: PropTypes.string,	// 限制 name 必须为 string 类型
		sex: PropTypes.string.isRequired,    // 限制 sex 必须为 string 类型,且是必需的
		method: PropTypes.func,	// 函数类型约束为 func,因为 function 是声明函数的关键字,需要闭开

	}
	// 在组件类的 propTypes 上添加类型约束描述
	static defaultProps = {
	    sex: "男",
	    age: "18"
	}
	// 通过 static 关键字,可以将方法、属性设置在构造函数上
}


props是只读的

  • 注意, props 是只读的,不能够直接进行修改,例如:this.props.name='test',是会报错的
  • 但如果传入的props属性是引用类型,this.props.obj.name='test',是可以修改成功的,但不要这样做,因为:
  1. 在组件内部修改传入的引用类型,会很混乱,很难确定是谁在修改数据
  2. 就算在组件内通过this.props修改了引用类型也不会触发视图更新,因此是无意义的

标签体的内容

  • 标签体的内容,会作为 propschildren 属性传入

构造器中的 props

class Person extends React.Component {
    constructor (props) {
        super(props)
        console.log(this.props)	
        // 如果给 super 传递 props,那么在 constructor 中,可以通过 this.props 中可以访问到传入的属性
        // 如果不给 super 传递 props,那么在 constructor 中,通过 this.props 访问不到传入的属性
        // 效果很鸡肋,因此,在 constructor 中,可以直接通过 props 访问,而不需要通过 this.props
    }
    render () {
    	// 其他函数里,对 this.props 的访问没有任何区别
        const {name, sex, age} = this.props
        return (
            <ul>
            	<li>姓名:{name}</li>
				<li>性别:{sex}</li>
				<li>年龄:{age}</li>
            </ul>
        )
    }

}

ReactDOM.render(<Person name="tom" age="18" sex="女"/>, document.getElementById('app'))
  • 如下
 constructor (props) {
     super(props)
     console.log('constructor', this.props)
 }

在这里插入图片描述

 constructor (props) {
     super()
     console.log('constructor', this.props)
     console.log('constructor', props)
 }

在这里插入图片描述

函数式组件中的props

// 通过组件属性传入的参数,会被封装成构造函数的 props 对象
function Person (props) {
    const {name, sex, age} = props
    return (
        <ul>
            <li>姓名:{name}</li>
            <li>性别:{sex}</li>
            <li>年龄:{age}</li>
        </ul>
    )
}
// 同样可以进行类型约束
Person.propTypes = {
	name: PropTypes.string,	// 限制 name 必须为 string 类型
	sex: PropTypes.string.isRequired,    // 限制 sex 必须为 string 类型,且是必需的
	method: PropTypes.func,	// 函数类型约束为 func,因为 function 是声明函数的关键字,需要闭开
}
// 同样可以进行默认值设置
Person.defaultProps = {
    sex: "男",
    age: "18"
}

ReactDOM.render(<Person name="tom" age="18" sex="女"/>, document.getElementById('app'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tanleiDD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值