React创建组件的三种方式

React常见的三种组件创建方式,具体如下:

1. 函数式定义的无状态组件

2. es5原生方式React.createClass定义的组件

3. es6形式的extends React.Component定义的组件

下面我们简单说一下,这三种方式的用法、适用场合以及区别

 函数式定义的无状态组件

    import React, { Component } from 'react';

    import PropTypes from 'prop-types';

    const NoState = (props) => {

        let{name} = props;

        const sayHi = () => {

            console.log(`Hello ${name}`);

        };

        return (

            <div className="outer no-state-outer">

                <div>我是无状态组件</div>

                <div>props.name--{props.name}</div>

                <button onClick ={sayHi}>Say Hello</button>

        )

    }

    NoState.propTypes = {

        name: PropTypes.number

        // name: PropTypes.string

    };

    export default NoState;

1、组件只有一个render方法实现,没有组件实例化过程,不需要分配多余的内存,性能得到很大提升

2、组件无法访问this对象,只能访问传入的props,所以渲染结果只于传入的props有关

3、无状态组件不需要生命周期管理与状态管理,内部没有相关实现。可以判断传入的类型

总结较大的组件应该被多个无状态组件分割,未来React也会这种面向无状态组件在譬如无意义的检查和内存分配领域进行一系列优化,所以只要有可能,尽量使用无状态组件

有状态组件

写法

1、React.createClass定义的组件

    import React from 'react';

    import ReactDOM from 'react-dom';

    import PropTypes from 'prop-types';

    const CreateClassCom = React.createClass({ 

        propTypes:{//定义传入props中的属性各种类型

            // name: PropTypes.number

            name: PropTypes.string

        },

        getDefaultProps:function() {

            return { name: 'init name' } 

        }, 

        getInitialState: function() { 

            return { name: this.props.name }; 

        }, 

        handleClick: function(event) { 

            this.setState({ name: 'name 变了' }); 

        }, 

        render: function() { 

            console.log(this.props,this.state)

            return ( 

            <div className="outer">

                <div>我是CreateClass状态组件</div>

                <div>props.name--{this.props.name}</div>

                <div>state.name--{this.state.name}</div>

                <button onClick ={this.handleClick}>改变name</button>

            </div>

            ); 

        } 

    });

    export default CreateClassCom;

2、extends React.Component定义的组件

    import React, { Component } from "react";

    import ReactDOM from 'react-dom';

    import PropTypes from 'prop-types';


    export default class CompinentCom extends Component {

        constructor(props){

            super(props)

            this.state={

                name:props.name,

            }

        }


        handleClick (event) { 

            this.setState({ name: 'name 变了' }); 

        };

        render() { 

            console.log(this.props,this.state)

            return ( 

                <div className="outer">

                    <div>我是Component状态组件</div>

                    <div>props.name--{this.props.name}</div>

                    <div>state.name--{this.state.name}</div>

                    <button onClick ={this.handleClick}>无bind改变name</button>

                    <button onClick ={this.handleClick.bind(this)}>bind改变name</button>

                </div>

            ); 

        } 

    };


    CompinentCom.propTypes = {

        name : PropTypes.number,

    }

    CompinentCom.defaultProps = {

        xx : 'ssss'

    }

区别:

1、createClass自动绑定this,Component需要手动绑定this。createClass会导致不必要的性能开销

2、createClass不可用constructor,用之会报错,默认props,state用getDefaultProps,getInitialState。

Component用constructor(props){super(props)this.state={}}

不可用getDefaultProps,getInitialState用之有warning。

3、react.16之后不可以再用createClass

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容