React06-Props属性

34 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

2、props

理解

  1. 每个组件对象都会有props(properties的简写)属性
  1. 组件标签的所有属性都保存在props中

作用

  1. 通过标签属性从组件外向组件内传递变化的数据
  1. 注意: 组件内部不要修改props数据

编码操作

  1. 内部读取某个属性值

img

  1. 对props中的属性值进行类型限制和必要性限制

第一种方式(React v15.5 开始已弃用):img

第二种方式(新):使用prop-types库进限制(需要引入prop-types库)

img

  1. 扩展属性: 将对象的所有属性通过props传递

img

  1. 默认属性值:

img

  1. 组件类的构造函数

img

前置内容

前提,需要事先做好的准备

     <!-- 准备好一个“容器” -->
     <div id="test1"></div>
     <div id="test2"></div>
     <div id="test3"></div>
     
     <!-- 引入react核心库 -->
     <script type="text/javascript" src="../js/react.development.js"></script>
     <!-- 引入react-dom,用于支持react操作DOM -->
     <script type="text/javascript" src="../js/react-dom.development.js"></script>
     <!-- 引入babel,用于将jsx转为js -->
     <script type="text/javascript" src="../js/babel.min.js"></script>
     <!-- 引入prop-types,用于对组件标签属性进行限制 -->
     <script type="text/javascript" src="../js/prop-types.js"></script>

基本使用

     <script type="text/babel">
         //创建组件
         class Person extends React.Component{
             render(){
                 // console.log(this);
                 const {name,age,sex} = this.props
                 return (
                     <ul>
                         <li>姓名:{name}</li>
                         <li>性别:{sex}</li>
                         <li>年龄:{age+1}</li>
                     </ul>
                 )
             }
         }
         //渲染组件到页面
         ReactDOM.render(<Person name="jerry" age={19}  sex="男"/>,document.getElementById('test1'))
         ReactDOM.render(<Person name="tom" age={18} sex="女"/>,document.getElementById('test2'))
 ​
         const p = {name:'老刘',age:18,sex:'女'}
         // console.log('@',...p);
         // ReactDOM.render(<Person name={p.name} age={p.age} sex= {p.sex}/>,document.getElementById('test3'))
         ReactDOM.render(<Person {...p}/>,document.getElementById('test3'))
     </script>

对props进行限制

     <script type="text/babel">
         //创建组件
         class Person extends React.Component{
             render(){
                 // console.log(this);
                 const {name,age,sex} = 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为函数
         }
         //指定默认标签属性值
         Person.defaultProps = {
             sex:'男',//sex默认值为男
             age:18 //age默认值为18
         }
         //渲染组件到页面
         ReactDOM.render(<Person name={100} speak={speak}/>,document.getElementById('test1'))
         ReactDOM.render(<Person name="tom" age={18} sex="女"/>,document.getElementById('test2'))
 ​
         const p = {name:'老刘',age:18,sex:'女'}
         // console.log('@',...p);
         // ReactDOM.render(<Person name={p.name} age={p.age} sex={p.sex}/>,document.getElementById('test3'))
         ReactDOM.render(<Person {...p}/>,document.getElementById('test3'))
 ​
         function speak(){
             console.log('我说话了');
         }
     </script>

props是只读的

this.props.name = 'jack' //此行代码会报错,因为props是只读的

对标签属性进行类型、必要性的限制

     Person.propTypes = {
         name:PropTypes.string.isRequired, //限制name必传,且为字符串
         sex:PropTypes.string,//限制sex为字符串
         age:PropTypes.number,//限制age为数值
         speak:PropTypes.func,//限制speak为函数
     }

指定默认标签属性值

 Person.defaultProps = {
     sex:'男',//sex默认值为男
     age:18 //age默认值为18
 }