React基础的思考题

    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时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,292评论 2 21
  • 自己最近的项目是基于react的,于是读了一遍react的文档,做了一些记录(除了REFERENCE部分还没开始读...
    潘逸飞阅读 3,489评论 1 10
  • 使用 create-react-app 快速构建 React 开发环境 项目的目录结构如下: React JSX ...
    majun00阅读 522评论 0 0
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,106评论 2 35
  • _hzgoin阅读 184评论 0 0