React学习(四)组件属性之二props

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)编码操作在这里插入图片描述
在这里插入图片描述

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值