美文网首页
关于React的小知识(持续更新)

关于React的小知识(持续更新)

作者: sarah_wqq | 来源:发表于2019-01-14 18:04 被阅读0次

    1.JSX引用一个组件,实际上调用了React.createElement

    <MyButton color="blue" shadowSize={2}>Click Me</MyButton>
    

    编译为

    React.createElement(
      MyButton,
      {color: 'blue', shadowSize: 2},
      'Click Me'
    )
    

    2.PropTypes 类型检查

    React v16 之前可用 React.PropTypes

    class Greeting extends React.Component {
      render() {
        return (<h1>Hello, {this.props.name}</h1>);
      }
    }
    
    Greeting.propTypes = {
      name: React.PropTypes.string
    };
    

    React v16 之后React.PropTypes弃用,需使用prop-types库

    import PropTypes from 'prop-types';
    class Greeting extends React.Component {
      render() {
        return (<h1>Hello, {this.props.name}</h1>);
      }
    }
    
    Greeting.propTypes = {
      name: PropTypes.string
    };
    

    当给属性传递了无效值时,JavsScript 控制台将会打印警告。出于性能原因,propTypes 只在开发模式下进行检查。

    3.Ref属性访问组件

    组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做DOM diff,它可以极大提高网页的性能表现。

    this.refs.[refName] 属性可以获取真实 DOM ,但是必须等到虚拟 DOM 插入文档以后(componentDidMount),才能使用这个属性,否则会报错。

    能用state状态提升解决的,尽量不要用ref

    1) 使用React.createRef()创建ref

    class A extends React.Component{
        constructor(props){
            super(props);
            this.textInput = React.createRef();
        }
        componentDidMount(){
            this.textInput.current.focusTextInput();
        }
        render(){
            return (
                <B ref={this.textInput} />
            );
        }
    }
    

    这种方法仅对 class 声明的 B(组件) 有效,对函数式声明的B无效,因为函数式声明没有产生实例。

    class B extends React.Component {
        // class申明
        //...
        render(){
            return (<input />);
        }
    }
    
    function B(){
        // 函数申明
        return (<input />);
    }
    

    2) Ref回调

    React 将在组件挂载时将 DOM 元素传入ref 回调函数并调用,当卸载时传入 null 并调用它。
    ref 回调函数会在 componentDidMout 和 componentDidUpdate 生命周期函数前被调用

    class A extends React.Component{
        constructor(props){
            super(props);
        }
        saveFormRef = (form) => {
            this.form = form;  //将子组件Dom
        }
        render(){
            return (
                <BForm ref={ this.saveFormRef } />
            );
        }
    }
    
    class B extends React.Component{
        render(){
            return (<Form>...</Form>);
        }
    }
    const BForm = Form.create()(B);
    export default B;
    

    Ref可以读取组件的DOM,例子中由于BForm是一个Form组件,所以在A中可以直接读取B的表单数据。

    4.React.createClass和extends Component的区别

    1) 语法区别

    //ES5的语法
    var Hello = React.createClass({
        componentWillMount : function(){
            ......
        },
        render: function(){
            return (<div>Hello</div>);
        },
    })
    module.exports = Hello;
    
    //ES6的语法
    class Hello extends React.Component{
        constructor(props){
            super(props);
        }
        componentWillMount(){
            ...
        }
        render(){
            return (<div>Hello</div>);
        }
    }
    export default Hello;
    

    2)状态的区别

    React.createClass:通过getInitialState()方法返回一个包含初始值的对象

    const Hello = React.createClass({
        // return an object 返回的结果在state里
        getInitialState(){ 
            return {
                isEditing: false
            }
        }
        render(){
            return <div></div>
        }
    })
    

    React.Component:通过constructor设置初始状态

    class Hello extends React.Component{
        constructor(props){
            super(props);
            this.state = { // define this.state in constructor
                isEditing: false
            } 
        }
        render(){
            return <div></div>
        }
    }
    

    3)this区别

    React.createClass:会自动绑定this

    const Hello = React.createClass({  
      handleClick() {
        console.log(this); // React Component instance
      },
      render() {
        return (
          <div onClick={this.handleClick}></div>//会切换到正确的this上下文
        );
      }
    });
    

    React.Component:this属性并不会自动绑定到 React 类的实例上,默认的函数或者生命周期函数才会自动绑定this

    class Hello extends React.Component{
        constructor(props){
            super(props);
        }
        handleClick(){
            console.log(this); // null
        }
        handleFocus(){  // manually bind this
            console.log(this);
        }
        handleBlur: ()=>{  // use arrow function
            console.log(this); 
        }
        render(){
            return <input onClick={this.handleClick} 
                                  onFocus={this.handleFocus.bind(this)}  
                                  onBlur={this.handleBlur}/>
        }
    }
    

    也可以在constructor中绑定this (推荐使用这种方法)

    constructor(props){
        super(props);
        this.handleClick = this.handleClick.bind(this);
    }
    

    相关文章

      网友评论

          本文标题:关于React的小知识(持续更新)

          本文链接:https://www.haomeiwen.com/subject/girddqtx.html