您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

前端框架篇:React类组件的三大核心属性

时间:2023-06-19 15:23:50  来源:  作者:尚硅谷教育

React类组件是通过创建 class 继承 React.Component创建的。类组件中通过render函数返回react元素。react组件的三大核心属性是建立在react的类组件基础上的,即:state、props、refs。

一、state

概念

state是组件对象最重要的属性,值是对象(可以包含多个key:value的组合),组件被称为"状态机",通过更新组件的state来更新对应的页面显示(重新渲染组件),有state称为复杂组件。

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8" />

<title>State</title>

<!-- 引入react核心库 -->

<script src="https://cdn.bootcdn.NET/ajax/libs/react/18.2.0/umd/react.development.js"></script>

<!-- 引入操作dom的扩展库 -->

<script src="https://cdn.bootcdn.net/ajax/libs/react-dom/18.2.0/umd/react-dom.development.js"></script>

<!-- 引入babel来解析jsx语法 -->

<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

</head>

<body>

<div id="App"></div>

<script type="text/babel">

class Content extends React.Component {

//state:定义当前组件内部的状态,状态是当前组件私有的

state = {

content: "React真好用",

count: 0,

isHot: true,

};

render() {

const { content, isHot, count } = this.state;

return (

<div>

<h1>State</h1>

<p>{content}</p>

<p>{count}</p>

<p>{isHot ? "热啊" : "冷啊"}</p>

</div>

);

}

}

const root = ReactDOM.createRoot(document.getElementById("app"));

root.render(<Content />);

</script>

</body>

</html>

执行结果如下:

如何修改state的值

  • 不可以直接通过this.state.xxx=xxx的方式修改state对象的内容。
  • 修改state一定要调用setState这个方法去修改。
  • 使用语法:setState({key:value})。
  • setState做了两件事:1. 改变state 2. 重新调用了一次render。

<div id="app"></div>

<script type="text/babel">

class Demo extends React.Component {

state = {

isHot: true,

};

render() {

const { isHot } = this.state;

return (

<div>

<p>今天天气很{isHot ? "很热" : "凉快"}</p>

<button onClick={this.changeWea}>修改天气</button>

</div>

);

}

/*

state不能直接修改,需要使用组件实例的setState方法

setState接受的参数是一个对象,将来会合并给原有的state中

*/

changeWea = () => {

const { isHot } = this.state;

// this.state.isHot = false; XXX

this.setState({ isHot: !isHot });

};

}

const root = ReactDOM.createRoot(document.getElementById("app"));

root.render(<Demo />);

</script>

执行结果如下:

二、props

概念

  • props就是组件定义属性的集合,它是组件对外的接口,由外部通过JSX属性传入设置(也就是从外部传递给内部组件的数据)。
  • 每个组件对象都会有props(properties的简写)属性。
  • 组件标签的所有属性都保存在props中。

作用

1.通过标签属性从组件外向组件内传递变化的数据,外部世界(组件)就是通过prop来和组件进行对话数据传递的。

2.组件内部不要修改props数据,props是只读的。

<script type='text/babel'>

class Myself extends React.Component{

render(){

console.log(this.props);

let {name,age,sex} = this.props.mes

//如果真的要修改props 则可以解构出来某个属性 然后对变量进行修改

name+="~"

return (

<ul>

<li>姓名是{name}</li>

<li>性别是{sex}</li>

<li>年龄是{age}</li>

</ul>

}

}

class App extends React.Component{

state = {

persons:[

{name:"laowang",age:19,sex:"man"},

{name:"laoli",age:29,sex:"man"},

{name:"laowan",age:12,sex:"woman"},

]

}

render(){

console.log(this);

const {persons} = this.state;

return (

<div>

{

persons.map((item,index)=>{

return <Myself mes={item} key={index}/>

})

}

</div>

}

}

const root = ReactDOM.createRoot(document.getElementById("app"));

root.render(<App />);

</script>

批量传递props

当需要把一个对象内所有的key-value都传递到组件中,可以使用批量传递。比如一个对象obj,我们可以在传递props的时候直接书写为{...obj}即可。当然,我们可以传递额外的props来添加和修改批量传递的内容。

return (

<div>

{

persons.map((item,index)=>{

// return <Myself name={item.name} sex={item.sex} age={item.age} key={index}/>

//{...o}在jsx中书写时,可以展开对象为key-value(jsx+react实现的 不是js语法)

return <Myself {...item} key={index}/>

})

}

</div>

执行结果如下:

配置props限制

1.引入react的propType.js第三方包。

<!-- 对props中数据类型进行检测及限制 -->

<script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.js"></script>

2.prop-types的主要作用:对props中数据类型进行检测及限制

3.propType的使用:

  • 给组件扩展静态属性propTypes,值是一个对象。
  • key就是被限制的props属性。
  • value值的写法:可以限制值的数据类型(number、string、bool、func、object、array等)PropTypes.XXXX;限制特定的内容:PropTypes.oneOf(['a', 'b']),值只能是a或者b;也可以在任何 PropTypes 属性后面加上 isRequired 后缀,这样如果这个属性父组件没有提供时,会打印警告信息。

<script type="text/babel">

class Myself extends React.Component {

render() {

console.log(this.props);

const { name, age, nicknames, address } = this.props;

return (

<div>

<h1>我是:{name}</h1>

<p>我今年:{age}岁</p>

<ul>

{nicknames.map((item, index) => {

return <li key={index}>{item}</li>;

})}

</ul>

<p>我家住在{address}</p>

</div>

);

}

static propTypes = {

name: PropTypes.string.isRequired,

age: PropTypes.number,

nicknames: PropTypes.array,

address: PropTypes.oneOf(["湖北", "湖南"]),

};

}

class App extends React.Component {

render() {

return (

<div>

<Myself

name="李红"

age={18}

nicknames={["小红", "lucy", "普罗"]}

address="湖北"

/>

</div>

);

}

}

const root = ReactDOM.createRoot(document.getElementById("app"));

root.render(<App />);

</script>

执行结果如下:

三、refs

概念

Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。

ref的字符串方法

只需要在被获取的DOM上设置ref属性 值为一个自定义名称XXX,在当前组件的其他位置可以通过this.refs.XXX获取当前DOM。

<script type="text/babel">

class App extends React.Component {

render() {

return (

<div>

<input type="text" ref="oIpt" />

<button onClick={this.showMsg}>点我弹出input中输入的内容</button>

</div>

);

}

showMsg = () => {

console.log(this.refs.oIpt.value);

};

}

const root = ReactDOM.createRoot(document.getElementById("app"));

root.render(<App />);

</script>

执行结果如下:

回调函数形式的ref

1.ref属性的值是一个函数(箭头函数)。

2.当读到ref属性的时候,react会当内部的函数调用,并传递当前的DOM为实参。

3.把这个接受实参的形参赋值给实例对象的一个属性,这个属性就是被获取的DOM。

<script type="text/babel">

class App extends React.Component {

render() {

console.log(this);

return (

<div>

<input type="text" ref={(c) => (this.oIpt = c)} />

<button onClick={this.showMsg}>点我弹出input中输入的内容</button>

</div>

);

}

showMsg = () => {

console.log(this.oIpt.value);

};

}

const root = ReactDOM.createRoot(document.getElementById("app"));

root.render(<App />);

</script>

createRef的使用

1.首先使用React.createRef()方法创建一个容器。

2.把这个容器给到被获取的DOM节点的ref属性上。

3.通过this.容器.current获取到当前的DOM。

<script type="text/babel">

class App extends React.Component {

//设置一个ref的容器

oIpt = React.createRef();

render() {

console.log(this);

return (

<div>

<input type="text" ref={this.oIpt} />

<button onClick={this.showMsg}>点我弹出input中输入的内容</button>

</div>

);

}

showMsg = () => {

alert(this.oIpt.current.value);

};

}

const root = ReactDOM.createRoot(document.getElementById("app"));

root.render(<App />);

</script>

总结

以上就是对react组件对象的三大核心属性的一个简单的演示。

简单的理解state就是状态,保存状态数据的属性,用来拿到状态数据对界面进行渲染,因为state是响应式的,所以向state中存放状态数据时需要使用setState方法进行更改,react会重新调用render函数进行渲染。

而props就可以理解为标签中的属性,通过props就可以读取组件外向组件内传递的数据。

refs就是组件用来标识自己的一个标志,通过这个属性就可以拿到标签的信息,比如value,但注意,字符串形式的ref官方已经不建议使用它,因为 string 类型的 refs 已过时并可能会在未来的版本被移除。



Tags:React   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
从0实现React18
要从零开始实现React 18,需要理解React的核心概念和一些主要特性。以下是一个简要的步骤:1. 了解React的基本概念: 组件: React应用的基本构建块。组件可以是函数组件(Functional...【详细内容】
2024-01-22  Search: React  点击:(47)  评论:(0)  加入收藏
React的核心概念
React是一个开源JavaScript库,用于构建用户界面。它由Facebook开发并维护,已成为构建Web和移动应用程序的流行选择。React的主要特点是组件化架构,它使开发人员能够将应用程序...【详细内容】
2024-01-09  Search: React  点击:(103)  评论:(0)  加入收藏
浅析五种 React 组件设计模式
作为一名 React 开发者,你可能会面临下面几个问题: 如何构建一个高复用度性的组件,使其适应不同的业务场景? 如何构建一个具有简单 API的组件,使其易于使用? 如何构建一个在 UI 和...【详细内容】
2024-01-09  Search: React  点击:(83)  评论:(0)  加入收藏
React与Vue性能对比:两大前端框架的性能
React和Vue是当今最流行的两个前端框架,它们在性能方面都有着出色的表现。React的加载速度:初次加载:由于React使用了虚拟DOM(Virtual DOM)技术,它可以通过比较虚拟DOM树与实际DOM...【详细内容】
2024-01-05  Search: React  点击:(107)  评论:(0)  加入收藏
Vanilla Design,新一代 React UI 库
这几天做需求,一堆 UI 库实在是不知道选哪个,各种角色的同事争论不休;还总有新轮子冒出来,所以我来插一脚,并借此来领悟写代码的哲学:The best way to write secure and reliable...【详细内容】
2024-01-04  Search: React  点击:(89)  评论:(0)  加入收藏
vue3中 ref和 reactive的区别 ?
最近有朋友在面试过程中经常被问到这么一个问题,vue3 中的ref 和 reactive的区别在哪里,为什么 要定义两个API 一个 api不能实现 响应式更新吗??带着这个疑问 ,我们 接下来进行逐...【详细内容】
2024-01-03  Search: React  点击:(38)  评论:(0)  加入收藏
React18 与 Vue3 全方面对比
1. 编程风格 & 视图风格1.1 编程风格 React 语法少、难度大;Vue 语法多,难度小例如指令:Vue<input v-model="username"/><ul> <li v-for="(item,index) in list" :key="inde...【详细内容】
2024-01-03  Search: React  点击:(72)  评论:(0)  加入收藏
使用React微前端的完整指南
译者 | 李睿审校 | 重楼事实表明,前端开发伴随着许多挑战。而寻找简化开发过程和加快任务执行的方法是每个开发团队的目标。在开发大型复杂产品时,让开发团队成员在任务上进行...【详细内容】
2023-12-26  Search: React  点击:(90)  评论:(0)  加入收藏
什么是React的错误边界(Error Boundary)?
React的错误边界(ErrorBoundary)是一种React组件,用于捕获并处理其子组件树中任何位置的JavaScript错误。它允许开发人员在应用程序中定义错误边界,以便在发生错误时显示备用UI...【详细内容】
2023-12-21  Search: React  点击:(125)  评论:(0)  加入收藏
如何设计更优雅的 React 组件?
在日常开发中,团队中每个人组织代码的方式不尽相同。下面我们就从代码结构的角度来看看如何组织一个更加优雅的 React 组件!1. 导入依赖项我们通常会在组件文件顶部导入组件所...【详细内容】
2023-12-21  Search: React  点击:(101)  评论:(0)  加入收藏
▌简易百科推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(12)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(54)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(47)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(50)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(68)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(86)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
花 15 分钟把 Express.js 搞明白,全栈没有那么难
Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。Express 框...【详细内容】
2024-01-16  程序员成功  微信公众号  Tags:Express.js   点击:(88)  评论:(0)  加入收藏
站内最新
站内热门
站内头条