reactjs入门到实战(五)---- props详解

1》》》基础的props使用     不可修改父属性    getDefaultProps   对于外界/父组件的属性值,无法直接修改,它是只读的。

<script type="text/babel">
            var Hello = React.createClass({
                getDefaultProps:function(){
                    return{
                        name:'Default'
                    }
                },
                render:function(){
                    return (
                        <span>Hello {this.props.name} !</span>
                    );
                }
            });
            ReactDOM.render(
                <Hello />,
                document.getElementById('example')
            )
        </script>

2》》》父子传递

<script type="text/babel">
            //两层以上的传递
            //1、props 属性值提倡显示的传递到下一级
            //子组件
            var Child = React.createClass({
                render:function(){
                    return(
                        <span>Hello {this.props.fullName}</span>
                    );
                }
            });
            
            var Parent = React.createClass({
                addFamilyName:function(name){
                    return (name + 'chen');
                },
                render:function(){
                    return(
                        <div>
                            <Child fullName={this.addFamilyName(this.props.name)} name={this.props.name}/>
                        </div>
                    );
                }
            });
            
            ReactDOM.render(
            <Parent name="jin" />,document.getElementById('example')
            )
        </script>

》》》state和props的区别

1、state 本组件内的数据   相对封闭的单元/结构的数据  状态     组件的无状态

2、props 组件直接的数据流动  单向的 ,从owner向子组件

<script type="text/babel">
            //props和state的区别
            var Msg = React.createClass({
                render:function(){
                    return(
                        <div>
                            <span style={{color:this.props.color}}>Hello {this.props.master}.IT is {this.props.time} now.the color is {this.props.color} </span>
                        </div>
                    
                    );
                }
            });
            var Hello = React.createClass({
                getInitialState:function(){
                    return{
                        time:new Date().toDateString(),
                        color:'red'
                    }
                },
                changeColor:function(){
                    this.setState({color:'green'})
                },
                render:function(){
                    return(
                        <div>
                            <span onClick={this.changeColor}>The ownerName is {this.props.name}</span>
                            <br/>
                            <Msg master={this.props.name} time={this.state.time} color={this.state.color} />
                        </div>
                    );
                }
                
            });
            
            ReactDOM.render(
                <Hello name="world" />,
                document.getElementById('example')
            )
        </script>

 》》》propTypes  

Prop 验证

   1、React.PropTypes.string   2、React、PropTypes.bool   3、React.PropTypes.number  4、React.PropTypes.instanceOf(Message)  5、optionalUnion:React.PropTypes.oneOfType([])   6、React.PropTypes.arrayOf(React.PropTypes.number) 7、customProp:function(props,propName,componentName)

propTypesReact.PropTypes 提供很多验证器 (validator) 来验证传入数据的有效性。当向 props 传入无效数据时,JavaScript 控制台会抛出警告。注意为了性能考虑,只在开发环境验证 propTypes。下面用例子来说明不同验证器的区别:

React.createClass({
  propTypes: {
    // 可以声明 prop 为指定的 JS 基本类型。默认
    // 情况下,这些 prop 都是可传可不传的。
    optionalArray: React.PropTypes.array,
    optionalBool: React.PropTypes.bool,
    optionalFunc: React.PropTypes.func,
    optionalNumber: React.PropTypes.number,
    optionalObject: React.PropTypes.object,
    optionalString: React.PropTypes.string,

    // 所有可以被渲染的对象:数字,
    // 字符串,DOM 元素或包含这些类型的数组。
    optionalNode: React.PropTypes.node,

    // React 元素
    optionalElement: React.PropTypes.element,

    // 用 JS 的 instanceof 操作符声明 prop 为类的实例。
    optionalMessage: React.PropTypes.instanceOf(Message),

    // 用 enum 来限制 prop 只接受指定的值。
    optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),

    // 指定的多个对象类型中的一个
    optionalUnion: React.PropTypes.oneOfType([
      React.PropTypes.string,
      React.PropTypes.number,
      React.PropTypes.instanceOf(Message)
    ]),

    // 指定类型组成的数组
    optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),

    // 指定类型的属性构成的对象
    optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),

    // 特定形状参数的对象
    optionalObjectWithShape: React.PropTypes.shape({
      color: React.PropTypes.string,
      fontSize: React.PropTypes.number
    }),

    // 以后任意类型加上 `isRequired` 来使 prop 不可空。
    requiredFunc: React.PropTypes.func.isRequired,

    // 不可空的任意类型
    requiredAny: React.PropTypes.any.isRequired,

    // 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接
    // 使用 `console.warn` 或抛异常,因为这样 `oneOfType` 会失效。
    customProp: function(props, propName, componentName) {
      if (!/matchme/.test(props[propName])) {
        return new Error('Validation failed!');
      }
    }
  },
  /* ... */
});

栗子:》》》》

<script type="text/babel">
            //设定props的属性
             var Hello = React.createClass({
                 propTypes:{
                     //name:React.PropTypes.string
                     //name:React.PropTypes.oneOf(['News','world'])
                     //type:React.PropTypes.oneOfType([
                     //    React.PropTypes.string,
                     //    React.PropTypes.number,
                     //]),
                     //type:React.PropTypes.arrayOf(React.PropTypes.number),
                     name:function(props,propName,componentName){
                         if(!/^W/.test(props[propName])){
                             return new Error(
                                 'Invalid prop `' + propName + '`supplied to' + '`' + componentName + '`.Validtion failed.' 
                             );
                         }
                     }
                 },
                 
                 render:function(){
                     return (
                         <div>
                             <span>Hello {this.props.name}!</span>
                         </div>
                     );
                 }
             });
             
             ReactDOM.render(
                 <Hello name='world' />,
                 document.getElementById('example')
             );
        </script>    

》》》this.props.children  

<script type="text/babel">
                //this.props.children
                
                var Note = React.createClass({
                    render:function(){
                        return(
                            <li>{this.props.text}</li>    
                        );
                    }
                });
                
                var NotesList = React.createClass({
                    render:function(){
                        return(
                            <ol>
                                {
                                    this.props.children.map(function(child,index){
                                        return <Note key={index} text={child}/>
                                    })
                                }
                            </ol>
                        );
                    }
                });
                
                ReactDOM.render(
                    <NotesList>
                        <span>hello</span>
                        <span>world</span>
                    </NotesList>,
                    document.getElementById('example')
                )
            </script>

>>>结构赋值利用es6   ...

<script type="text/babel">
                var Child = React.createClass({
                    render:function(){
                        return(
                            <div>
                                <span>
                                    I am {this.props.name}! I am {this.props.age} years old. It is {this.props.time} now 
                                </span>
                            </div>
                        );
                    }
                });
                
                var Parent = React.createClass({
                    getInitialState:function(){
                        return{
                            time: new Date().toDateString()
                        }
                    },
                    
                    render:function(){
                        var {...others} = this.props;
                        return(
                            <Child {...others} time={this.state.time} />
                        );
                    }
                });
                
                ReactDOM.render(
                    <Parent name="chen" age="24" />,
                    document.getElementById('example')
                );
            </script>

 

posted @ 2016-06-05 00:18  快乐~  阅读(12800)  评论(0编辑  收藏  举报