React三大属性之props

利用外部的数据,进行数据的渲染,相当于想组件传递数据

1、props的基本使用

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello_react></title>
</head>
<body>

    <div id="test"></div>
    
    <script type="text/javascript" scr="./react.develoment.js"></script>
    <script type="text/javascript" scr="./react-dom.development.js"></script>
    <script type="text/javascript" scr="./babel.min.js"></script>
    <script type="text/babel">

    //创建类式组件
    class Person extends React.Component {
        
        render(){
           return (
                <ul>
                    <li>姓名: { this.props.name }</li>
                    <li>年龄: { this.props.age }</li>
                    <li>性别: { this.props.sex }</li>
                </ul>
            )
        }
        
    }
    //渲染组件到页面
    ReactDOM.render(<Person name="jerry" age="18" sex="男"/>,document.getElementById('test'))
    </script>
</body>
</html>

<Person name="jerry" age="18" sex="男"/> 这样写,React就可以把name="jerry" age="18" sex="男"这些属性放到组件实例里

这样就可以在代码里使用this.props.name......,进行使用

也可以进行简化

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello_react></title>
</head>
<body>

    <div id="test"></div>
    
    <script type="text/javascript" scr="./react.develoment.js"></script>
    <script type="text/javascript" scr="./react-dom.development.js"></script>
    <script type="text/javascript" scr="./babel.min.js"></script>
    <script type="text/babel">

    //创建类式组件
    class Person extends React.Component {
        
        render(){
           const { name,age,sex } = this.props
           return (
                <ul>
                    <li>姓名: { name }</li>
                    <li>年龄: { age }</li>
                    <li>性别: { sex }</li>
                </ul>
            )
        }
        
    }
    //渲染组件到页面
    ReactDOM.render(<Person name="jerry" age="18" sex="男"/>,document.getElementById('test'))
    </script>
</body>
</html>

2、批量传递props

单个单个传递属性props,未免繁琐,能否批量传递呢?

javascript 复制代码
    <script type="text/babel">

    //创建类式组件
    class Person extends React.Component {
        
        render(){
           const { name,age,sex } = this.props
           return (
                <ul>
                    <li>姓名: { name }</li>
                    <li>年龄: { age }</li>
                    <li>性别: { sex }</li>
                </ul>
            )
        }
        
    }
    const p = { name:"jerry",age:"18",sex:"男" }
    //渲染组件到页面
    ReactDOM.render(<Person { ...p }/>,document.getElementById('test'))
    </script>
解释

对象不是不能进行展开运算的吗?为什么ReactDOM.render(<Person { ...p }/>,document.getElementById('test'))这个就可以

表面上看对象确实不能直接用展开运算符(比如 console.log(...{a:1,b:2}) 会报错),但在 React 的 JSX 语法中 <Person { ...p }/> 能生效,核心原因是JSX 里的展开运算符是 React 对 ES6 语法的特殊适配,并不是直接对普通对象做展开。

<Person { ...p }/> 里,{ ...p } 并不是对对象做 "普通展开",而是 React 编译器(Babel)将其解析为 **"把对象的键值对逐个作为组件的 props 属性"**。

简单说:JSX 里的 { ...对象 } 是 React 提供的语法糖,目的是简化 "把对象的所有键值对作为组件 props" 的操作,和普通 JS 里直接展开对象完全是两回事。

3、对props进行限制

当我们执行

javascript 复制代码
ReactDOM.render(<Person name="jerry" age="18" sex="男"/>,document.getElementById('test'))

name、age和sex都是字符串类型的,如果我要在页面上展示age+1的话,势必会脱离我们的预期。需要一种对组件的传值进行限制,如果类型错误的话,会有警告提示;如果没有传值的话,会有默认的值进行填充

javascript 复制代码
  <script type="text/babel">

    //创建类式组件
    class Person extends React.Component {
        
        render(){
           const { name,age,sex } = this.props
           return (
                <ul>
                    <li>姓名: { name }</li>
                    <li>年龄: { age+1 }</li>
                    <li>性别: { sex }</li>
                </ul>
            )
        }
        
    }
    const p = { name:"jerry",age:"18",sex:"男" }
    //渲染组件到页面
    ReactDOM.render(<Person name="jerry",age="18",sex="男"/>,document.getElementById('test'))
    //以上的age是字符串

    ReactDOM.render(<Person name="jerry",age={18},sex="男"/>,document.getElementById('test'))
   //以上的age为number
   //这种效果暂时解决了我们传递的age为number类型,可以进行age+1的操作,但是治标不治本
    </script>

我们需要引入prop-types.js文件,对props的类型实现开头我们的初衷。

javascript 复制代码
 <script src="./prop-types.js"></script>  
 <script type="text/babel">

    //创建类式组件
    class Person extends React.Component {
        render(){
           const { name,age,sex } = this.props
           return (
                <ul>
                    <li>姓名: { name }</li>
                    <li>年龄: { age }</li>
                    <li>性别: { sex }</li>
                </ul>
            )
        }
        
    }

    //对标签属性进行类型、必要性的限制
    Person.propType = {
        name:PropTypes.string.isRequired, //限制name必传,且为字符串
        age:PropTypes.number, //限制age为数字
        speak:PropTypes.func //限制speak为函数
    }

    //指定默认标签属性值
    Person.defaultProps = {
        sex:"男",//sex的默认值为男
    }
    //渲染组件到页面
    ReactDOM.render(<Person name="jerry",age="18",sex="男"/>,document.getElementById('test'))
    function speak(){
        
    }
    </script>

由于我们引入了prop-types.js,那么页面全局就会有一个PropTypes。类Person的propType,是Person自带的。注意类型的限制,我们用的是小写,function的类型写的是func。

4、props的简写

javascript 复制代码
 <script src="./prop-types.js"></script>  
 <script type="text/babel">

    //创建类式组件
    class Person extends React.Component {

         //对标签属性进行类型、必要性的限制
         static propType = {
            name:PropTypes.string.isRequired, //限制name必传,且为字符串
            age:PropTypes.number, //限制age为数字
            speak:PropTypes.func //限制speak为函数
         }

        //指定默认标签属性值
        static defaultProps = {
            sex:"男",//sex的默认值为男
        }

        render(){
           const { name,age,sex } = this.props
           return (
                <ul>
                    <li>姓名: { name }</li>
                    <li>年龄: { age }</li>
                    <li>性别: { sex }</li>
                </ul>
            )
        }

        state = {  } 
        
    }

    //渲染组件到页面
    ReactDOM.render(<Person name="jerry",age="18",sex="男"/>,document.getElementById('test'))
    function speak(){
        
    }
    </script>

构造器constructor

javascript 复制代码
 <script src="./prop-types.js"></script>  
 <script type="text/babel">

    //创建类式组件
    class Person extends React.Component {

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

        render(){
           const { name,age,sex } = this.props
           return (
                <ul>
                    <li>姓名: { name }</li>
                    <li>年龄: { age }</li>
                    <li>性别: { sex }</li>
                </ul>
            )
        }

        state = {  } 
        
    }

    //渲染组件到页面
    ReactDOM.render(<Person name="jerry",age="18",sex="男"/>,document.getElementById('test'))
    </script>

我们写代码时,有没有注意到我们都没有写构造器constructor,其实这个构造器可要也可以不要,

构造器是否接受props,是否传递super取决于是否希望在构造器中通过this访问props,实际情况很少用到

5、函数式组件使用props

javascript 复制代码
 <script src="./prop-types.js"></script>  
 <script type="text/babel">

    //创建组件
    function Person(props){
        const { name, age, sex } = props
        return(
             <ul>
                  <li>姓名: { name }</li>
                  <li>年龄: { age }</li>
                  <li>性别: { sex }</li>
             </ul>
        )
    }

    //对标签属性进行类型、必要性的限制
    Person.propType = {
        name:PropTypes.string.isRequired, //限制name必传,且为字符串
        age:PropTypes.number, //限制age为数字
        speak:PropTypes.func //限制speak为函数
    }

    //指定默认标签属性值
    Person.defaultProps = {
        sex:"男",//sex的默认值为男
    }

    //渲染组件到页面
    ReactDOM.render(<Person name="jerry",age="18",sex="男"/>,document.getElementById('test'))
    </script>

函数式组件也就只能使用一下props,没有其他的简写形式,而且也不能使用state

相关推荐
开开心心就好4 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
Setsuna_F_Seiei6 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
百万蹄蹄向前冲8 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙8 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan10 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
狗狗狗狗狗乐啊10 小时前
搭一个 AI 对话工作台 AChat:从 0 到可用的完整记录(一)
python·react.js·ai编程
kyriewen10 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理11 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒11 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche150012 小时前
利用 RAG 为答疑机器人扩展知识范围
前端