微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

react二-- 函数组件

一、component-function

  1. 函数组件的定义
	function Welcome(){
        return <h1>Hello World</h1>
    }
    const e = <Welcome></Welcome>
    ReactDOM.render(e,document.getElementById("app"));

在这里插入图片描述

  1. 函数组件传值

    *注意:不能把props直接放在{}中使用,会报错

	function Welcome(props){
        console.log(props);
        // return <h1>Hello World + {props} </h1>  //报错
        return <h1>Hello World + {props.name} </h1>
    }
    //组件属性 =>封装一个对象 {name:'react'}=>传给props
    const e = <Welcome name='react'></Welcome>
    ReactDOM.render(e,document.getElementById("app"));

在这里插入图片描述

  1. 组件复用
        function Welcome(props){
            console.log(props);
            return <h3>你好!{props.name}</h3>
        }
        const e = 
            <div>
                <h2>Hello World</h2>
                <Welcome/>
                <Welcome></Welcome>
                <Welcome name="筱筱"></Welcome>
            </div>
        ReactDOM.render(e,document.getElementById("app"));

在这里插入图片描述

		function Welcome(props){
            console.log(props);
            return <h3>你好!{props.name}</h3>
        }
        const e = 
            <div>
                <h2>Hello World</h2>
                <Welcome/>
                <Welcome>aaa</Welcome>
                <Welcome name="筱筱">bbb</Welcome>
            </div>
        //本质
        const e = React.createElement(
            "div", 
            null,
            React.createElement("h2", null, "Hello World"),
            React.createElement(Welcome, null),
            React.createElement(Welcome, null, "aaa"),
            React.createElement(Welcome, {name: "\u7B71\u7B71"}, "bbb")
        );
        
        //带组件的虚拟DOM解析(普通js对象) - 伪代码
        console.log(e);
        {
            type:'div',
            props:{
                children:[
                    {
                        type:'h1',
                        props:{children:'Hello World'}
                    }
                    {
                        type: f Welcome(props),
                        props:{}
                    },
                    {
                        type: f Welcome(props),
                        props:{children:'aaa'}
                    },
                    {
                        type: f Welcome(props),
                        props:{name:"筱筱",children:'bbb'}
                    }
                ]
            }
        }
        //虚拟DOM => 进行类型判断(如果是函数自动执行,并把props传入函数) => 真实DOM => 渲染到容器中
        ReactDOM.render(e,document.getElementById("app"));

在这里插入图片描述


 4.静态组件=>_PURE_不可改变,具备纯函数特点
  -01 纯函数:function fn(propos){} 传入相同的参数,返回相同的值

		function sum(a,b){
            return a + b
        }
        console.log(sum(1,2));//3
        console.log(sum(1,2));//3

-02 不是纯函数:function fn(propos){} 传入相同的参数,可能返回不同的值

		let i = 0
        function sum(a,b){
            a = ++i
            return a + b
        }
        console.log(sum(1,2));//3
        console.log(sum(1,2));//4
  1. 单向数据流:参数props传值是单向的,由根组件传向子组件,再传向子组件的子组件,依次传递
    扩展:组件组合
		//学校案例(一)
        function Teacher(props){
            return(
                <div>
                    <h3>{props.tea}</h3>
                </div>  
            )
                       
        }
        function Student(props){
            return(
                <div>
                    <h3>{props.st}</h3>
                </div> 
            )
                        
        }
        function Class(props){
            return(
                <div>
                    <h2>{props.cla}</h2>
                    <Teacher tea="Mr. Wang"></Teacher>
                    <Student st="s1"></Student>
                    <Student st="s2"></Student>
                    <Student st="s3"></Student>
                </div> 
            )
                        
        }
        function School(props){
            return(
                <div>
                    <h2>{props.School}</h2>
                    <Class cla="一班"></Class>
                    <Class cla="二班"></Class> 
                    <Class cla="三班"></Class>
                </div>
            )
                         
        }
        const e = <School School='黑河学院'/>
        ReactDOM.render(e,document.getElementById("app"));

在这里插入图片描述

		//学校案例(二)
        function Teacher(props){
            let {te}=props
            return(
                <div>
                    <h3>{te}</h3>
                </div>  
            )
                       
        }
        function Student(props){
            let {st} = props
            return(
                <div>
                    <h3>{st}</h3>
                </div> 
            )
                        
        }
        function Class(props){
            let {nam,tea,stus}=props.cl
            return(
                <div>
                    <h2>{nam}</h2>
                    <Teacher te={tea}></Teacher>
                    <Student st={stus[0]}></Student>
                    <Student st={stus[1]}></Student>
                    <Student st={stus[2]}></Student>
                </div> 
            )
                        
        }
        function School(props){
            let {nam,cla}=props.sol
            return(
                <div>
                    <h2>{nam}</h2>
                    <Class cl={cla[0]}></Class>
                    <Class cl={cla[1]}></Class> 
                    <Class cl={cla[2]}></Class>
                </div>
            )
                         
        }
        let msg = {
            school:{
                nam:'黑河学院',
                cla:[
                    {
                        nam:'一班',
                        tea:'Mr.Wang',
                        stus:['筱筱','潇潇','肖肖']
                    },
                    {
                        nam:'二班',
                        tea:'Mr.Li',
                        stus:['张张','林林','姜姜']
                    },
                    {
                        nam:'三班',
                        tea:'Mr.Zhang',
                        stus:['灰灰','绵绵','木木']
                    }
                ]
            }
        }
        const e = <School sol={msg.school}/>
        ReactDOM.render(e,document.getElementById("app"));

在这里插入图片描述

  1. 组件复用
    01 一个函数组件
		function Comment(props) {
            return (
                <div className='comment'>
                    {/*用户信息 */}
                    <div className="UserInfo">
                        <img className="Avatar"
                            src="https://img2.baidu.com/it/u=3745548308,3899350255&fm=26&fmt=auto&gp=0.jpg"
                            alt="girl"
                        />
                        <div className="UserInfo-name">
                            zhangsan
                        </div>
                    </div>

                    {/*评论内容 */}
                    <div className="Comment-text">
                        comment content
                    </div>

                    {/*日期内容 */}
                    <div className="Comment-date">
                        2021-08-02
                    </div>
                </div>
            )
        }
        const e = <Comment/>
        ReactDOM.render(e, document.getElementById("app"))

        02 拆分组件,实现组件复用

		// 用户信息复用
        //  -- 头像复用
        // 评论复用
        function Avatar(props) {
            let avatar=props.avatar
            return(
                <img className="Avatar"
                    src={avatar}
                    alt="girl"
                />
            )
        }
        function User(props) {
            let {name,avatar}=props.author
            return(
                <div className="UserInfo">
                    <Avatar avatar={avatar}></Avatar>
                    <div className="UserInfo-name">
                        {name}
                    </div>
                </div>
            )
        }
        function Content(props) {
            let content=props.content
            return (
                <div className="Comment-text">
                    {content}
                </div>
            )
        }
        // 重构组件
        // 获取数据
        // 同步数据
        var data = {
            author: {
                name: 'jack',
                avatar: "https://img2.baidu.com/it/u=3745548308,3899350255&fm=26&fmt=auto&gp=0.jpg"
            },
            content: 'aaa bbb cccc',
            date: '2021-08-02'
        }
        function Comment(props) {
            let {author,content,date}=props.data;
            let date1=props.date
            return (
                <div className='comment'>
                    {/*用户信息 */}
                    <User author={author}></User>

                    {/*评论内容 */}
                    <Content content={content}></Content>

                    {/*日期内容 */}
                    <div className="Comment-date">
                        {date1}
                    </div>
                </div>
            )
        }
        const e = <Comment data={data}/>
        ReactDOM.render(e, document.getElementById('app'))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐