• React入门---可复用组件-10


    主要对props更多重要的特性进行学习;

    还是用之前代码,

    index.js代码为:

    var React = require('react');
    var ReactDOM = require('react-dom');
    import ComponentHeader from './components/header'; 
    import ComponentFooter from './components/footer.js';
    import BodyIndex from './components/BodyIndex.js';
    
    class Index extends React.Component{
        render(){
            return(
                <div>
                    <ComponentHeader/>
                    <BodyIndex/>
                    {/*在这里给footer组件,添加props外来属性*/}       
                    <ComponentFooter userid={123456}/> 
                </div>
                );
        }
    }
    //与app.html进行一个绑定 
    ReactDOM.render(<Index/>,document.getElementById('test'));

    footer.js的代码为:

    import React from 'react';
    import ReactDOM from 'react-dom';
    
    export default class ComponentFooter extends React.Component{
        constructor(){
            super();
            this.state = {
                username:"azedada",
                age:24
            }
        }
    
        render(){
            return(
                    <div>
                        <h1>这里是底部</h1>
                        <p>接收到父页面的属性:{this.props.userid}</p> 
                    </div>
                )
        }
    
    }

    1.判断类型

    现在我们需要对父页面传来的 userId进行 类型判断,只能接受number类型的:

    由于React.PropTypes不再适用于React v15.5,改用prop-types库,我们进行配置npm install prop-types -D

    import React from 'react';
    import ReactDOM from 'react-dom';
    //引用prop-types
    import PropTypes from 'prop-types';
    
    export default class ComponentFooter extends React.Component{
    
        render(){
            return(
                    <div>
                        <h1>这里是底部</h1>
                        {/*接收的userId只能为number类型*/}
                        <p>接收到父页面的属性:{this.state.username}:{this.state.age},{this.props.userid}</p> 
                    </div>
                )    
        };    
    }
        //对类型的判断,es6的写法
        //注意:React.PropTypes不再适用于React v15.5,改用prop-types库; npm install prop-types -D
        ComponentFooter.propTypes={
                userid:PropTypes.number
            }

    运行结果:如果userid为number类型则正常,如果为其他类型则报错;

    2.当其他人通过父页面调用子页面,忘记传userid了,但是我们需要他必须传,这时候需要用到isRequired属性

    (下面代码就在上面基础上直接修改)

    //对类型的判断,es6的写法
        //注意:React.PropTypes不再适用于React v15.5,改用prop-types库; npm install prop-types -D
        ComponentFooter.propTypes={
                userid:PropTypes.number.isRequired
            }

    运行结果:如果userid存在则正常,如果没有则会发出warning警告;

    3.如果父页面还有一个username,它不强制必须有,我们可以给它一个默认值,下面是footer.js的代码

    import React from 'react';
    import ReactDOM from 'react-dom';
    //引用prop-types
    import PropTypes from 'prop-types';
    
    
    //给父页面username的值赋一个默认值
    const defaultProps={
        username:"这是一个默认值"
    }
    
    
    export default class ComponentFooter extends React.Component{
        constructor(){
            super();
            this.state = {
                username:"azedada",
                age:24
            }
        }
    
        //事件函数 改变state的age
        changeAge(){
            this.setState({age:18})
        }
    
        render(){
            return(
                    <div>
                        <h1>这里是底部</h1>
                        <p>{this.state.username}:{this.state.age}</p> 
                        {/*接收的userId只能为number类型*/}
                        <p>接收到父页面的属性:{this.props.userid},{this.props.username}</p>
                        {/*这里写点击事件,注意写法是es6*/}
                        <input type="button" value="点击改变年龄" onClick={this.changeAge.bind(this)}/>
                    </div>
                )    
        };    
    }
        //对类型的判断,es6的写法
        //注意:React.PropTypes不再适用于React v15.5,改用prop-types库; npm install prop-types -D
        ComponentFooter.propTypes={
                userid:PropTypes.number.isRequired
            }
        //对username赋默认值
        ComponentFooter.defaultProps=defaultProps;    

    运行结果:如果父页面index.js没有传username,则会显示"这是一个默认值",如果传入了"内容",则被"内容"替换;

    4.父页面传入的所有数据,注意是所有数据,子页面接收到后,继续传给子页面的子页面;即index.js--->footer.js--->footchild.js;

    首先创建footchild.js文件,然后引入到父页面footer.js,相信到这里,大家都能自己完成这一步;

    {/*下面是子页面footchild*/}{/*{...this.props} 可以把父页面所有的属性收到,并且可以自己定义*/}
     <FootChild {...this.props} id={2121}/>

    在FootChild组件里面调用出来:既能调用根父级index里面有的,也能调用在自己父级定义的;

    import React from 'react';
    
    export default class FootChild extends React.Component{
        render(){
            return(
                    <div>
                        {/*既能调用根父级index里面有的,也能调用在自己父级定义的*/}
                        <p>{this.props.username} {this.props.userid} {this.props.id} </p>
                        }
                    </div>
                )
        }
    }

    总结:

  • 相关阅读:
    变量按数据类型分类
    构造方法重载 及注意事项
    构造方法-带参
    构造方法-无参
    对对象中的属性赋值(两种方法)
    局部变量的值赋给成员变量 案例(红色字体)
    成员变量与局部变量区别
    创建对象综合案例
    20151015css3 部分css2的内容
    20151012jq4
  • 原文地址:https://www.cnblogs.com/azedada/p/6863096.html
Copyright © 2020-2023  润新知