react无状态怎么写

技术react无状态怎么写这篇文章主要介绍了react无状态怎么写,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 react无

本文主要介绍如何编写react无状态,具有一定的参考价值。有兴趣的朋友可以参考一下。希望大家看完这篇文章后收获多多。让边肖带你去了解它。

React无状态书写为“{props.xxx}”,其无状态组件主要用于定义模板,接收父组件props的数据,使用表达式“{props.xxx}”将props插入模板。

本文操作环境:Windows7系统,react17.0.1,戴尔G3。

React中无状态组件和有状态组件的写法以及区别

React中的组件主要分为无状态组件和有状态组件。

1,无状态组件主要用来定义模板,接收来自父组件props传递过来的数据,使用{props.xxx}的表达式把props塞到模板里面。无状态组件应该保持模板的纯粹性,以便于组件复用。创建无状态组件如下:

varHeader=(道具)=(

p{props.xxx}/p

);

export DefaultHeader

2,有状态组件主要用来定义交互逻辑和业务数据(如果用了Redux,可以把业务数据抽离出去统一管理),使用{this.state.xxx}的表达式把业务数据挂载到容器组件的实例上(有状态组件也可以叫做容器组件,无状态组件也可以叫做展示组件),然后传递props到展示组件,展示组件接收到props,把props塞到模板里面。创建有状态组件如下:

CLaSS HomeExtendersReact。组件{

构造器(道具){ 0

超级(道具);

};

render(){ 0

返回(

表头///也可以写成表头/表头。

)

}

}

exportdefaultHome

这个是官方默认的写法,在构造函数里面默认要传递一个参数进去,并且要调用super()方法,来获取子类的实例。但是比较疑惑的地方是为什么要传递这些参数,传递这些参数有什么用?

因为从render()里面的组件来看,构造函数不传递参数也可以获取到组件实例上的props属性。如下:

classhomeextendresact。组件{

构造函数(){ 0

super();

};

render(){ 0

返回(

p

Headername='我是子组件实例上的道具属性'/

/p

nbsp; );
    };
};
class Header extends React.Component {
    constructor() {
        super();
    };
    render() {
        return (
            <p>{this.props.name}</p>  //构造函数中并没有传递props属性,这里通过{this.props.name}依然获取到了值
        );
    };
};

这个比较好理解,因为render()方法是子组件原型上的方法,获取实例属性的时候要通过this来访问,如果去掉this就获取不到了。

那问题来了,如果我们要在构造函数中访问props改怎么办呢?此时,我们就要在constructor构造函数中传递一个props参数,这样就可以访问到子组件实例上的props属性了。如下:

class Header extends React.Component {
    constructor(props) {
        super();
        this.name = props.name;  //获取到子组件实例上的props.name属性,赋值给实例属性name
    };
    render() {
        return (
            <p>{this.name}</p>
        );
    };
};
还有一个问题,super(props)方法中为什么也要传递一个props属性呢?看下面的例子:
class Header extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            nameOne: props.name,
            nameTwo: this.props.name  //super()方法中传递了props属性,this.props才可以获取到name属性
        }
    };
    render() {
        return (
            <p>{this.state.nameOne}{this.state.nameTwo}</p>
        );
    };
};

其实,props.name和this.props.name的值都是一样的,但是它俩还是有区别的,props.name中这个props就是子组件的属性props,但是this.props.name中的这个props却不是子组件的属性props,虽然值都是一样的,这个props其实在调用super方法的时候被传递到了Component这个父类中去了,所以this.props.name获取到的是Component父类中的props属性。看下React的源码:
react无状态怎么写
发现没,子类super方法把props参数传递给了父类Component,Component把props参数挂载到它的实例属性props上了。所以,你只有给super方法中传递props参数,在构造函数里才能用this,props.xxx

如果super方法中不传递props参数,获取this.props.name的值就会报错。获取this.props显示为undifined:如下:

class Header extends React.Component {
    constructor(props) {
        super();
        this.state = {
            nameOne: this.props.name, 
            nameTwo: this.props  
        };
        console.log(this.props.name);  //报错
        console.log(this.props);  //undifined
    };
    render() {
        return (
            <p>{this.state.nameOne}{this.state.nameTwo}</p>
        );
    };
};

这种写法本质是给子组件Header的实例属性state.nameOne和state.nameTwo赋值了一个子组件Header的实例属性props,简单来说,就是Header子组件创建了一个state属性,然后又把自己的props属性赋值给了自己的state属性。
为什么this.props打印出undefined?因为props是调用子组件的时候传入的参数,所以在构造函数内部是访问不到props的,那么对于this.props.name来说,毫无疑问肯定报错。

所以,对与构造函数中的props参数和super中的props参数来说,如果你不在构造函数中用this.props和props,完全可以不用传参。反之就要传参。但是对于this.props和props来说获取到的值都是一样的,所以写哪个都可以。但是官方文档上是两个参数都有写。所以为了严谨,还是都写上吧。

但是,我个人还是喜欢这样的写法。

constructor(props) {
    super(props);
    this.state = {
        name: props.name
    }
};

不加this的是value,加了this的是key。

React中的组件主要分为无状态组件和有状态组件两类。

1,无状态组件主要用来定义模板,接收来自父组件props传递过来的数据,使用{props.xxx}的表达式把props塞到模板里面。无状态组件应该保持模板的纯粹性,以便于组件复用。创建无状态组件如下:
var Header = (props) = (
    <p>{props.xxx}</p>
);
export default Header
2,有状态组件主要用来定义交互逻辑和业务数据(如果用了Redux,可以把业务数据抽离出去统一管理),使用{this.state.xxx}的表达式把业务数据挂载到容器组件的实例上(有状态组件也可以叫做容器组件,无状态组件也可以叫做展示组件),然后传递props到展示组件,展示组件接收到props,把props塞到模板里面。创建有状态组件如下:
class Home extends React.Component {
    constructor(props) {
        super(props);
    };
    render() {
        return (
            <Header/>  //也可以写成<Header></Header>
        )
    }
}
export default Home
这个是官方默认的写法,在构造函数里面默认要传递一个参数进去,并且要调用super()方法,来获取子类的实例。但是比较疑惑的地方是为什么要传递这些参数,传递这些参数有什么用?

因为从render()里面的组件来看,构造函数不传递参数也可以获取到组件实例上的props属性。如下:

class Home extends React.Component {
    constructor() {
        super();
    };
    render (){
        return(
            <p>
                <Header name="俺是子组件实例上props属性"/>
            </p>
        );
    };
};
class Header extends React.Component {
    constructor() {
        super();
    };
    render() {
        return (
            <p>{this.props.name}</p>  //构造函数中并没有传递props属性,这里通过{this.props.name}依然获取到了值
        );
    };
};

这个比较好理解,因为render()方法是子组件原型上的方法,获取实例属性的时候要通过this来访问,如果去掉this就获取不到了。

那问题来了,如果我们要在构造函数中访问props改怎么办呢?此时,我们就要在constructor构造函数中传递一个props参数,这样就可以访问到子组件实例上的props属性了。如下:

class Header extends React.Component {
    constructor(props) {
        super();
        this.name = props.name;  //获取到子组件实例上的props.name属性,赋值给实例属性name
    };
    render() {
        return (
            <p>{this.name}</p>
        );
    };
};
还有一个问题,super(props)方法中为什么也要传递一个props属性呢?看下面的例子:
class Header extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            nameOne: props.name,
            nameTwo: this.props.name  //super()方法中传递了props属性,this.props才可以获取到name属性
        }
    };
    render() {
        return (
            <p>{this.state.nameOne}{this.state.nameTwo}</p>
        );
    };
};

其实,props.name和this.props.name的值都是一样的,但是它俩还是有区别的,props.name中这个props就是子组件的属性props,但是this.props.name中的这个props却不是子组件的属性props,虽然值都是一样的,这个props其实在调用super方法的时候被传递到了Component这个父类中去了,所以this.props.name获取到的是Component父类中的props属性。看下React的源码:
react无状态怎么写
发现没,子类super方法把props参数传递给了父类Component,Component把props参数挂载到它的实例属性props上了。所以,你只有给super方法中传递props参数,在构造函数里才能用this,props.xxx

如果super方法中不传递props参数,获取this.props.name的值就会报错。获取this.props显示为undifined:如下:

class Header extends React.Component {
    constructor(props) {
        super();
        this.state = {
            nameOne: this.props.name, 
            nameTwo: this.props  
        };
        console.log(this.props.name);  //报错
        console.log(this.props);  //undifined
    };
    render() {
        return (
            <p>{this.state.nameOne}{this.state.nameTwo}</p>
        );
    };
};

这种写法本质是给子组件Header的实例属性state.nameOne和state.nameTwo赋值了一个子组件Header的实例属性props,简单来说,就是Header子组件创建了一个state属性,然后又把自己的props属性赋值给了自己的state属性。
为什么this.props打印出undefined?因为props是调用子组件的时候传入的参数,所以在构造函数内部是访问不到props的,那么对于this.props.name来说,毫无疑问肯定报错。

所以,对与构造函数中的props参数和super中的props参数来说,如果你不在构造函数中用this.props和props,完全可以不用传参。反之就要传参。但是对于this.props和props来说获取到的值都是一样的,所以写哪个都可以。但是官方文档上是两个参数都有写。所以为了严谨,还是都写上吧。

但是,我个人还是喜欢这样的写法。

constructor(props) {
    super(props);
    this.state = {
        name: props.name
    }
};

不加this的是value,加了this的是key。

感谢你能够认真阅读完这篇文章,希望小编分享的“react无状态怎么写”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/118532.html

(1)

相关推荐

  • 提问的英文,对于价格的提问,用英语怎么说

    技术提问的英文,对于价格的提问,用英语怎么说对于价格的提问的英文:How muchmuch 读法 英 [mʌtʃ] 美 [mʌtʃ] 1、det./pron.(与不可数名词连用,尤用于否定句;或与how连用以询问数

    生活 2021年10月26日
  • cmakelists文件如何写(cmakelists如何执行)

    技术怎么在CMakeLists.txt文件中包含Eigen本篇内容主要讲解“怎么在CMakeLists.txt文件中包含Eigen”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习

    攻略 2021年12月21日
  • Java中如何使用Iterator和Iterable接口

    技术Java中如何使用Iterator和Iterable接口这篇文章主要介绍“Java中如何使用Iterator和Iterable接口”,在日常操作中,相信很多人在Java中如何使用Iterator和Iterable接口

    2021年11月17日
  • 华为手机什么型号好,现在华为哪款手机值得购买

    技术华为手机什么型号好,现在华为哪款手机值得购买华为手机比较好的型号当然推荐华为mate 系列和P系列了华为手机什么型号好。华为手机现在型号系列不断拓展,型号分布也十分丰富了,最为顶尖的华为手机型号先推荐华为mate 系

    生活 2021年10月28日
  • 古典密码学——移位密码 Shift Cipher

    技术古典密码学——移位密码 Shift Cipher 古典密码学——移位密码 Shift Cipher移位密码的理论基础是数论中的模运算。模运算的基本定义:假设a和b均为整数,m是一正整数。若m整除a-

    礼包 2021年12月3日
  • c的发音,英语字母“C”应该读[si:]

    技术c的发音,英语字母“C”应该读[si:]拉丁字母 C 在通用的英语口音 [1] 里都念 see /si?/c的发音。电视播音员、主持人的英语口音都很严重。这不是有意要重读或怎样。好多主持人还有北京的「wa > va」

    生活 2021年10月27日