• react ( 二 )


    ref属性

    • 当我们在 react组件中要访问真实的DOM元素时,你可能需要用到ref属性,ref接收一个函数作为属性值,函数接收一个参数,这个参数就是真实的DOM元素。真实的DOM元素渲染到页面上之后,ref函数就会执行。
    
    ReactDOM.render(
        <div>
            <input
                {/* 这里的el就是原生的input元素 */}
                ref={ (el)=> console.log( el ) }
            />
        </div> ,
        root
    
    );
    
    
    • ref属性也可以用在react组件上面,用在组件上时,ref函数接收的参数是组件的实例,(但是不建议这样做)。
    
    
    ReactDOM.render(
        <div>
            <input
                {/* 这里的el就是原生的input元素 */}
                ref={ (el)=> console.log( el ) }
            />
        </div> ,
        root
    
    );
    
    
    • 当父组件需要获取子组件的DOM元素时,我们也可以利用 ref 接收父组件传的,把元素绑定到父组件
    class App extends Component {
        constructor(props) {
            super(props);
            this.child = null;
        }
    
        logEl = ()=>{
    
            console.log( this.child );  //打印子组件的input元素
        }
    
        render(){
            return (
                <div>
                    {/* 传一个函数给子组件 */}
                    <Child
                        getEl={ (el)=> this.child = el }
                    />
                    <button
                        onClick={ logEl }
                    >获取子组件元素</button>
                </div>
            );
        }
    }
    
    class Child extends Component{
    
        constructor(props) {
            super(props);
        }
    
        render(){
    
            let {getEl} = this.props;
    
            return (
                    <div>
                        {/* 子组件的元素用ref接收父组件传来的函数,元素渲染到页面时,就绑定到了父组件的属性上面  */}
                        <input
                            ref={ getEl }
                             type="text"/>
                    </div>
                );
        }
    };
    
    
    

    组件受控和不受控

    • 受控:
      组件的状态变化,是 react 控制的 (大多数时候, 接受 state 和 props 的控制)
    • 不受控:
      某些组件, 比如 input, select 这种组件,状态的变化可能是控件本身具有功能, 它状态的变化,并不是 react 控制的
      让这类组件受控很简单:给一个 value 的属性, 这个时候,react 就接管了这个组件

    默认参数 defaultProps

    给属性声明默认值 , 值是 undefined 的时候才会启用

    class App extends Component{
        constructor(props){
            super(props);
            this.bb = 8;
        }
    
        // 默认参数: es6 的写法
        static defaultProps = {
                a: 'a 没有传',
                b: 'b 没有传',
                c: 'c 没有传',
                d: 'd 没有传'
        }
    
        render(){
            let {a,b,c,d} = this.props;
            return (
                <div>
                    <ul>
                        <li>{a}</li>
                        <li>{b}</li>
                        <li>{c}</li>
                        <li>{d}</li>
                    </ul>
                </div>
            )
        }
    }
    
    //react的写法 
    // App.defaultProps={
    //     a: 'a 没有传',
    //     b: 'b 没有传',
    //     c: 'c 没有传',
    //     d: 'd 没有传'
    // };
    
    

    参数类型检测:propTypes

    
    
    class App extends Component{
        constructor(props){
            super(props);
        }
    
        render(){
            let {a,b,c,d} = this.props;
            return (
                <div>
                    <ul>
                        <li>a是字符串:{a}</li>
                        <li>b是数字:{b}</li>
                        <li>c是函数:{c()}</li>
                    </ul>
                    <p>{d.a}:{d.b}</p>
                </div>
            )
        }
    }
    
    App.propTypes = {
        a: PT.string,
        b: PT.number.isRequired,
        c: PT.func.isRequired,
        d: PT.shape({
            a: PT.string.isRequired,
            b: PT.number.isRequired
        })
    }
    App.defaultProps = {
        b: '88879',
        c: f=>f,
        d: {}
    }
    
    ReactDOM.render(
        <div>
            <App
                a="aaa"
                b={12499}
                c={ ()=><p>ppppp</p> }
            />
            <br/>
            <App
                a="aaa"
                // b={12499}
                c={ ()=><p>ppppp</p> }
            />
            <br/>
            <App
                a="aaa"
                b={12499}
                d={{
                    a: 'dfsj',
                    b: 999
                }}
            />
            <br/>
        </div>
        ,
        document.getElementById('root')
    );
    
    // 对开发有帮助
    // 在开发的阶段用, 上线的时候需要移除验证的代码
    // 默认属性也会参与数据验证
    
    
    
  • 相关阅读:
    HDU2027 统计元音 一点点哈希思想
    湖南工业大学第一届ACM竞赛 数字游戏 字符串处理
    湖南工业大学第一届ACM竞赛 我素故我在 DFS
    HDU3293sort
    HDU2082 找单词 母函数
    HDU1018 Big Number 斯特林公式
    湖南工业大学第一届ACM竞赛 分糖果 位操作
    UVA 357 Let Me Count The Ways
    UVA 147 Dollars
    UVA 348 Optimal Array Multiplication Sequence
  • 原文地址:https://www.cnblogs.com/koala0521/p/7995453.html
Copyright © 2020-2023  润新知