问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Reactjs component 中 prop 和 state 的区别

发布网友 发布时间:2022-05-14 13:32

我来回答

2个回答

懂视网 时间:2022-05-14 17:53

本篇文章给大家带来的内容是关于React中props和state属性的用法详解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

本篇文章主要介绍了React props和state属性的具体使用方法,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。

props

不知道大家还记不记得xml标签中的属性,就像这样:

<class id="1">
 <student id="1">John Kindem</student>
 <student id="2">Alick Ice</student>
</class>

这样一个xml文件表达的意思是1班有两个学生,学号为1的学生名字为John Kindem,学号为2的学生名字为Alick Ice,其中id就是属性,你可以把它看做一个常量,它是只读的。
html继承自xml,而JSX从莫种意义上又是html和js的扩展,属性的概念自然得到了传承。
在React中,我们使用props这一概念向React组件传递只读的值,就像这样:

// 假设我们已经自定义了一个叫Hello的组件
ReactDom.render(
 <Hello firstName={'John'} lastName={'Kindem'}/>,
 document.getElementById('root')
);

在调用React组件的时候,我们可以像上面一样向组件传递一些常量,以便组件在内部调用。而调用的方法,就像下面这样:

class Hello extends React.Component {
 constructor(props) {
 super(props);
 }
 
 render() {
 return (
 <p>
 <h1>Hello, {this.props.firstName + ' ' + this.props.lastName}</h1>
 </p>
 );//欢迎加入前端全栈开发交流圈一起学习交流:864305860
 }//面向1-3年前端人员
}//帮助突破技术瓶颈,提升思维能力
 
ReactDom.render(
 <Hello firstName={'John'} lastName={'Kindem'}/>,
 document.getElementById('root')
);

在组件内部获取传递过来的props,只需要使用this.props对象即可,但是在使用之前,记得复写组件的构造函数,并且接受props的值以调用父类构造。
当然,props也能够设置默认值,向下面这样:

class Hello extends React.Component {
 constructor(props) {
 super(props);
 }
 
 static defaultProps = {
 firstName: 'John',
 lastName: 'Kindem'
 };
 
 render() {
 return (
 <div>
 <h1>Hello, {this.props.firstName + ' ' + this.props.lastName}</h1>
 </div>
 );//欢迎加入前端全栈开发交流圈一起吹水聊天学习交流:864305860
 }//面向1-3年前端人员
}//帮助突破技术瓶颈,提升思维能力
 
ReactDom.render(
 <Hello/>,
 document.getElementById('root')
);

只需在ES6类中声明一个static的props默认值即可,运行效果和上面一样。
props没有多复杂,稍微练习即可习得。

state、组件生命周期

你可能回想,如果我想在React组件中添加动态效果怎么办?这一问题需要使用React组件的state来解决,state即状态的意思,在React中,所有会变化的控制变量都应该放入state,每当state中的内容变化时,页面的相应组件将会被重新渲染,另外,state完全是组件内部的东西,外部无法向内部传递state,也无法直接改变state的值。
先来举一个例子:

import React from 'react';
import ReactDom from 'react-dom';
 
class Time extends React.Component {
 constructor(props) {
 super(props);
 
 // 初始化state
 this.state = {
 hour: 0,
 minute: 0,
 second: 0
 }
 }
 componentDidMount() {
 this.interval = setInterval(() => this.tick(), 1000);
 }
 
 componentWillUnmount() {
 clearInterval(this.interval);
 }
 
 tick() {
 // 计算新时间
 let newSecond, newMinute, newHour;
 let carryMinute = 0, carryHour = 0;
 newSecond = this.state.second + 1;
 if (newSecond > 59) {
 carryMinute = 1;
 newSecond -= 60;
 }
 newMinute = this.state.minute + carryMinute;
 if (newMinute > 59) {
 carryHour = 1;
 newMinute -= 60;
 }
 newHour = this.state.hour + carryHour;
 if (newHour > 59) newHour -= 60;
 
 // 设置新状态
 this.setState({
 hour: newHour,
 minute: newMinute,
 second: newSecond
 });
 }
 
 render() {
 return (
 <div>
 <h1>current time: {this.state.hour + ':' + this.state.minute + ':' + this.state.second}</h1>
 </div>
 );
 }
}
ReactDom.render(
 <Time/>,
 document.getElementById('root')
);

这样就完成了一个计数器,数值一秒钟变化一次,来讲解一下代码:首先,state的初始化是在构造函数中,像这样:

constructor(props) {
 super(props);
 
 // 在这初始化state
 this.state = {
 ...
 }
}

而改变state是使用React组件基类中的一个自带函数:

this.setState({
 ...
});

使用这个函数之前一定要注意this的作用域,箭头函数中的this指向外部this,而普通函数中的this指向函数本身。
另外,这里使用到了两个React组件的生命周期回调:`

componentDidMount() {
 // React组件被加载到dom中的时候被调用
 ...
}
componentWillUnmount() {
 // React组件从dom中卸载的时候被调用
 ...
}

所以这样一下上面的计时器代码应该就不是什么难事了,在React组件被加载到dom中的时候设置一个计时器,每秒钟更新一次state,state更新的同时页面中的组件将会被重新渲染,而当组件被卸载的时候,则需要清除定时器,就那么简单。
不过React对于state的更新频率,有一个最大的限度,超过这个限度则会导致页面渲染的性能下降,大家需要注意不要在高频函数中使用setState。

热心网友 时间:2022-05-14 15:01

props和state都是用于描述component状态的,并且这个状态应该是与显示相关的。
State
如果component的某些状态需要被改变,并且会影响到component的render,那么这些状态就应该用state表示。
例如:一个购物车的component,会根据用户在购物车中添加的产品和产品数量,显示不同的价格,那么“总价”这个状态,就应该用state表示。
Props
如果component的某些状态由外部所决定,并且会影响到component的render,那么这些状态就应该用props表示。
例如:一个下拉菜单的component,有哪些菜单项,是由这个component的使用者和使用场景决定的,那么“菜单项”这个状态,就应该用props表示,并且由外部传入。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
高考560分能上211大学吗? - 知乎 河北高考多少分能上211大学 河北2023高考211分数线是多少? 考560分能上211大学吗河北 刀剑英雄合王者武器多少费用 刀剑英雄帝辰王者现在什么价位 2021年度工程施工合同范本 2021承包转让简单的合同范本 2021医院食堂承包合同范本 div+css+js实现菜单的收缩与展开 调用数据库内容的时候为什么内容字段... 中国式关系45集沈运朗诵的的那首诗灰色的贝雷帽是谁 结婚一个月祝福语大全简短 中国式关系中沈运读的诗 中国式关系里的沈运念的的诗出自哪里 中国式关系沈运读的诗 《中国式关系》中灰色的贝雷帽那几句诗都是什么 中国式关系中沈运给刘俐俐诵读的那首诗,什么“眼里的火焰”“蓝色的风信子” 结婚祝福的话语简短精辟 中国式关系35集关于秋天的诗。新是老罗半夜起来给女友说,记的去年秋天她戴着贝蕾帽,说的哪段描写秋天 中国式关系35集中老沈念给她老婆念的诗是什么 谁知道电视剧“中国式关系”中沈运给刘俐俐朗诵的那首诗 新婚祝福语句简短祝福 中国式关系第35集老沈朗诵的是什么诗? 中国式关系35集里面的诗 中国式关系35集沈运说的那首诗是什么? 我记得你去年秋天的样子改作文 中国式关系35集里 老沈的那首诗词是什么? 中国式关系里沈运对刘莉莉读的一首诗是什么? 中国式关系35集里,最后沈运念的是啥诗? 《中国式关系》中灰色的贝雷帽的那几句诗都是什么? 天津哪好玩,我们小学同学聚会! 晚上梦到蛇受伤醒来有小鸟窗前叫唤这预示着什么? 天塔湖怎么样?可以说说吗? 8岁男童上课注意力不集中,成绩下滑严重 湖埠十景指的是哪十景 韩阳十景的岩湖板障 胎儿下腹部部分肠管回声稍强是什么原因 乐扣保鲜盒能放蜂蜜吗,能放自榨的纯柠檬汁吗 孕25周去做四维 医生说胎儿肠管回声增强 想问这严重吗 好担心宝宝 新鲜柠檬如何保存? 用蜂蜜腌制柠檬能放在保鲜盒吗 肠管回声增强2.8×2.2,懂的帮忙回答下 右下腹肠管局部肠壁回声增强是什么问题 胎儿部分肠管回声增强严重么 帆状胎盘严重不 我应该都注意些什么 乐扣保鲜盒用来装醋可以吗? 胎儿肠管回声稍增强是怎么回事? 中秋节300字作文!急急急! 用过的新鲜柠檬能用保鲜袋装起来吗 柠檬密封起来更容易保存呢还是直接放盒子里跟空气流通更不会坏嘞? 水加热变成水蒸气,水和水蒸气是不是同