React基础的思考题

作者: 朋友喜欢叫我春哥 | 来源:发表于2017-11-21 21:16 被阅读34次
      1. 组件为什么要大写?
        其实JSX是React.createElement()的语法糖,标签名为小写表示为DOM标签,而大写表示为组件。

        大小写组件,渲染的结果是不一样的,小写被当成HTML标签来渲染。虽然不会报错,但是只是当成普通HTML标签来体现在DOM结构里。

    var app1 = <div>谁跟我一样</div>
    var app2 = <foot game='test'></foot>
    var app3 = <Foot game='test'></Foot>
      
    // babel转义过后
    var app1 = React.createElement(
     'div',
     null,
     '\u8C01\u8DDF\u6211\u4E00\u6837'
    );
    var app2 = React.createElement('foot', { game: 'test' });
    var app3 = React.createElement(Foot, { game: 'test' });
    
    
      1. 如何进行props的类型检测?
        使用 PropTypes 进行类型检查
    import PropTypes from 'prop-types';
    
    class Greeting extends React.Component {
      render() {
        return (
          <h1>Hello, {this.props.name}</h1>
        );
      }
    }
    
    Greeting.propTypes = {
      name: PropTypes.string
    };
    
      1. 三种转this作用域的方法哪个更好?为什么?
        组件类的方法默认是不会绑定this值,默认执行undefined,所以需要我们明确绑定方法的this值,一般会有以下三种绑定方式。

    值得注意的是,通过 bind 方式向监听函数传参,在类组件中定义的监听函数,事件对象 e 要排在所传递参数的后面,代码请看绑定方式Function.prototype.bind()

    • 构造函数绑定this(官方推荐)
      • 好处:是一次到位,避免重新渲染时重复绑定
      • 坏处:多写点代码而已
    import React, {Component} from 'react'
    
    class Test extends React.Component {
        constructor (props) {
            super(props)
            this.state = {message: 'Allo!'}
            this.handleClick = this.handleClick.bind(this)
            // 构造函数里直接箭头函数赋值也是可以的,就不用重复写下面函数代码了
            this.handleClick = (e) => {
                console.log(this.state.message)
            }
        }
    
        handleClick (e) {
            console.log(this.state.message)
        }
    
        render () {
            return (
                <div>
                    <button onClick={ this.handleClick }>Say Hello</button>
                </div>
            )
        }
    }
    
    • Function.prototype.bind()
      好处:无
      坏处:一是重复调用函数,重复绑定this值,二是重复渲染时重复构造新函数
    import React, {Component} from 'react'
    
    class Test extends React.Component {
        constructor (props) {
            super(props)
            this.state = {message: 'Allo!'}
        }
    
        handleClick (name, e) {
            console.log(this.state.message + name)
        }
    
        render () {
            return (
                <div>
                    <button onClick={ this.handleClick.bind(this, '赵四') }>Say Hello</button>
                </div>
            )
        }
    }
    
    • 箭头函数
      • 好处:自动隐性绑定this值
      • 坏处:一是重新渲染时,重复构造新函数;二是本身是匿名函数,无法通过函数名移除函数
    class Test extends React.Component {
        constructor (props) {
            super(props)
            this.state = {message: 'Allo!'}
        }
    
        handleClick (e) {
            console.log(this.state.message)
        }
    
        render () {
            return (
                <div>
                    <button onClick={ ()=>{ this.handleClick() } }>Say Hello</button>
                </div>
            )
        }
    }
    
      1. 如何避免列表里下标的1和3渲染?
    shouldComponentUpdate (nextProps, nextState) {
      return nextProps.id !== this.props.id;
    }
    

    参考链接

    相关文章

      网友评论

        本文标题:React基础的思考题

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