前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >React 从入门到入土(二)--组件三大属性

React 从入门到入土(二)--组件三大属性

作者头像
小丞同学
发布于 2021-08-16 08:08:43
发布于 2021-08-16 08:08:43
93300
代码可运行
举报
文章被收录于专栏:小丞前端库小丞前端库
运行总次数:0
代码可运行

? 大家好? ,我是小丞同学,最近在学习 React、小程序、阅读 JS 高程,以及整理 Node 的笔记,这是关于 React 的第二篇文章,也是我学习的第一个框架,内容如有错误,欢迎大家指正 ? 愿你生活明朗,万物可爱

一、组件的使用

当应用是以多组件的方式实现,这个应用就是一个组件化的应用

注意:

  1. 组件名必须是首字母大写
  2. 虚拟DOM元素只能有一个根元素
  3. 虚拟DOM元素必须有结束标签 < />

渲染类组件标签的基本流程

  1. React 内部会创建组件实例对象
  2. 调用render()得到虚拟 DOM ,并解析为真实 DOM
  3. 插入到指定的页面元素内部

1. 函数式组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//1.先创建函数,函数可以有参数,也可以没有,但是必须要有返回值 返回一个虚拟DOM
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
//2.进行渲染
ReactDOM.Render(<Welcom name = "ljc" />,document.getElementById("div"));

上面的代码经历了以下几步

  1. 我们调用 ReactDOM.render() 函数,并传入 <Welcome name="ljc" /> 作为参数。
  2. React 调用 Welcome 组件,并将 {name: 'ljc'} 作为 props 传入。
  3. Welcome 组件将 Hello, ljc 元素作为返回值。
  4. React DOM 将 DOM 高效地更新为 Hello,ljc

2. 类式组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyComponent extends React.Component {
    state = {isHot:false}
    render() {
        const {isHot} = this.state
        return <h1 onClick={this.changeWeather}>今天天气很{isHot?'炎热':'凉爽'}</h1>
    }
    changeWeather = ()=>{
        const isHot = this.state.isHot
        this.setState({isHot:!isHot})
    }
}
ReactDOM.render(<MyComponent/>,document.querySelector('.test'))

这玩意底层不简单,this的指向真的需要好好学习

在优化过程中遇到的问题

  1. 组件中的 render 方法中的 this 为组件实例对象
  2. 组件自定义方法中由于开启了严格模式,this 指向 undefined 如何解决
    1. 通过 bind 改变 this 指向
    2. 推荐采用箭头函数,箭头函数的 this 指向
  3. state 数据不能直接修改或者更新

3. 其他知识

包含表单元素的组件分为非受控租价与受控组件

  • 受控组件:表单组件的输入组件随着输入并将内容存储到状态中(随时更新)
  • 非受控组件:表单组件的输入组件的内容在有需求的时候才存储到状态中(即用即取)

二、组件实例三大属性

1. state

React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。 React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。

简单的说就是组件的状态,也就是该组件所存储的数据

类式组件中的使用

使用的时候通过this.state调用state里的值

在类式组件中定义state

  • 在构造器中初始化state
  • 在类中添加属性state来初始化

修改 state

类式组件的函数中,直接修改state

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.state.weather = '凉爽'

页面的渲染靠的是render函数

这时候会发现页面内容不会改变,原因是 React 中不建议 state不允许直接修改,而是通过类的原型对象上的方法 setState()

setState()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.setState(partialState, [callback]);
  • partialState: 需要更新的状态的部分对象
  • callback: 更新完状态后的回调函数

有两种写法:写法1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.setState({
    weather: "凉爽"
})

写法2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 传入一个函数,返回x需要修改成的对象,参数为当前的 state
this.setState(state => ({count: state.count+1});

setState是一种合并操作,不是替换操作


  • 在执行 setState操作后,React 会自动调用一次 render()
  • render() 的执行次数是 1+n (1 为初始化时的自动调用,n 为状态更新的次数)

2. props

state不同,state是组件自身的状态,而props则是外部传入的数据

类式组件中使用

在使用的时候可以通过 this.props来获取值 类式组件的 props:

  1. 通过在组件标签上传递值,在组件中就可以获取到所传递的值
  2. 在构造器里的props参数里可以获取到 props
  3. 可以分别设置 propTypesdefaultProps 两个属性来分别操作 props的规范和默认值,两者都是直接添加在类式组件的原型对象上的(所以需要添加 static
  4. 同时可以通过...运算符来简化

函数式组件中的使用

函数在使用props的时候,是作为参数进行使用的(props)

函数组件的 props定义:

  1. 在组件标签中传递 props的值
  2. 组件函数的参数为 props
  3. props的限制和默认值同样设置在原型对象上

3. refs

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

在我们正常的操作节点时,需要采用DOM API 来查找元素,但是这样违背了 React 的理念,因此有了refs

有三种操作refs的方法,分别为:

  • 字符串形式
  • 回调形式
  • createRef形式

字符串形式refs

虽然这个方法废弃了,但是还能用,还很好用hhh~

回调形式的refs

组件实例的ref属性传递一个回调函数c => this.input1 = c(箭头函数简写),这样会在实例的属性中存储对DOM节点的引用,使用时可通过this.input1来使用

使用方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input ref={c => this.input1 = c } type="text" placeholder="点击按钮提示数据"/>

我的理解

c会接收到当前节点作为参数,ref的值为函数的返回值,也就是this.input1 = c,因此是给实例下的input1赋值

createRef 形式(推荐写法)

React 给我们提供了一个相应的API,它会自动的将该 DOM 元素放入实例对象中

我们先给DOM元素添加ref属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input ref={this.MyRef} type="text" placeholder="点击弹出" />
<input ref={this.MyRef1} type="text" placeholder="点击弹出" />

通过API,创建React的容器,会将DOM元素赋值给实例对象的名称为容器的属性的current,好烦…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MyRef = React.createRef();
MyRef1 = React.createRef();

注意:专人专用,好烦,一个节点创建一个容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//调用
btnOnClick = () =>{
    //创建之后,将自身节点,传入current中
    console.log(this.MyRef.current.value);
}

注意:我们不要过度的使用 ref,如果发生时间的元素刚好是需要操作的元素,就可以使用事件对象去替代。过度使用有什么问题我也不清楚,可能有 bug 吧

4. 事件处理

  1. React 使用的是自定义事件,而不是原生的 DOM 事件
  2. React 的事件是通过事件委托方式处理的(为了更加的高效)
  3. 可以通过事件的 event.target获取发生的 DOM 元素对象,可以尽量减少 refs的使用

三、高阶函数

关于这部分的知识,之前的笔记有记过了,我真是太棒了

链接 高阶函数,关于AOP,偏函数,柯里化都有不错的记录,感觉还是不错的


好了好了,这期就到这里,早点休息,晚安~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
React---组件实例三大核心属性(一)state
一、理解 state是组件对象最重要的属性, 值是对象(可以包含多个key-value的组合) 组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件) 二、 强烈注意 组件中render方法中的this为组件实例对象 组件自定义的方法中this为undefined,如何解决?     a) 强制绑定this: 通过函数对象的bind()     b) 箭头函数    3. 状态数据,不能直接修改或更新 三、内部原理 1. render调用次数:1+n次(1是初始化的那次 n是
半指温柔乐
2021/04/19
5700
React---组件实例三大核心属性(三)refs与事件处理
    获取值:const { input1 } = this.refs; console.log(input.value)
半指温柔乐
2021/04/22
1.2K0
【React】学习笔记(一)——React入门、面向组件编程、函数柯里化
用于构建用户界面的 Javascript 库,它主要专注于界面与视图。采用组件化模式、声明式编码,提高开发效率及组件复用率。在React Native中可以使用React语法进行移动端开发。使用虚拟DOM+优秀的Diffing算法,尽量减少与真实DOM的交互。
鸡先生
2022/10/29
5.2K0
【React】学习笔记(一)——React入门、面向组件编程、函数柯里化
React--10: 组件的三大核心属性3:refs与事件处理
如果你之前使用过 React,你可能了解过之前的 API 中的 string 类型的 ref 属性,例如 "textInput"。你可以通过 this.refs.textInput 来访问 DOM 节点。我们不建议使用它,因为 string 类型的 refs 存在一些效率上的问题。它已过时并可能会在未来的版本被移除(16.8版本还没有移除)。
用户4793865
2023/01/12
1.1K0
react基础--1
2.发现组件是函数定义的,随后调用该函数,将返回的虚拟DOM转换为真实DOM,随后展示在页面中
切图仔
2022/09/08
8050
React两大组件,三大核心属性,事件处理和函数柯里化
3.我们编码时基本只需要操作react的虚拟DOM相关数据, react会转换为真实DOM变化而更新界。
大忽悠爱学习
2021/11/15
3.2K0
react面试题
调用setState之后发生了什么? 在代码中调用setState函数之后,React 会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程(Reconciliation)。经过调和过程,React 会以相对高效的方式根据新的状态构建 React 元素树并且着手重新渲染整个UI界面。在 React 得到元素树之后,React 会自动计算出新的树与老树的节点差异,然后根据差异对界面进行最小化重渲染。在差异计算算法中,React 能够相对精确地知道哪些位置发生了改变以及应该如何改变,这就保证了按需更新,而不是全部重新渲染。 扩展1: setState的第一个参数除了对象,还能传什么? ---函数,参数为当前state
用户7162790
2022/03/23
7260
React——组件的三大核心属性【七】
思索
2024/08/16
2030
React——组件的三大核心属性【七】
React--7: 组件的三大核心属性1:state
标题深究其实是:组件(实例)的三大核心属性。 而 只有类组件才有实例,函数式组件根本没资格。为了解决函数式组件的这个问题 react 又推出了 hooks。
用户4793865
2023/01/12
1.6K0
01-React基础(JSX, State, Refs, Props组件交互, Event, 生命周期)
引入JS # react 开发JS react.development.js # react dom渲染JS react-dom.development.js # jsx语法转换JS babel.min.js # 参数传值校验JS prop-types.js JSX语法 # 容器 <div id="test"></div> # 注意写JSX语法需要定义为babel <script type="text/babel"> const myName = "flower"; # 创建虚拟DOM, 不需要写
彼岸舞
2022/08/24
1.1K0
01-React基础(JSX, State, Refs, Props组件交互, Event, 生命周期)
阿里前端二面高频react面试题
Props 是 React 中属性的简写。它们是只读组件,必须保持纯,即不可变。它们总是在整个应用中从父组件传递到子组件。子组件永远不能将 prop 送回父组件。这有助于维护单向数据流,通常用于呈现动态生成的数据。
beifeng1996
2022/10/24
1.2K0
从 0 到 1 实现 React 系列 —— 4.setState优化和ref的实现
看源码一个痛处是会陷进理不顺主干的困局中,本系列文章在实现一个 (x)react 的同时理顺 React 框架的主干内容(JSX/虚拟DOM/组件/生命周期/diff算法/setState/ref/...)
牧云云
2018/08/14
8480
从 0 到 1 实现 React 系列 —— 4.setState优化和ref的实现
百度前端高频react面试题(持续更新中)_2023-02-27
2. 尽量不要在 componentWillReviceProps 里使用 setState,如果一定要使用,那么需要判断结束条件,不然会出现无限重渲染,导致页面崩溃
用户10358021
2023/02/27
2.5K0
React框架基础
郭顺发
2023/07/17
2280
2021前端react面试题汇总
(2)区别 Redux更多的是遵循Flux模式的一种实现,是一个 JavaScript库,它关注点主要是以下几方面∶
zz1998
2021/09/24
2.4K0
常见react面试题(持续更新中)
每个React组件强制要求必须有一个 render()。它返回一个 React 元素,是原生 DOM 组件的表示。如果需要渲染多个 HTML 元素,则必须将它们组合在一个封闭标记内,例如 <form>、<group>、<div> 等。此函数必须保持纯净,即必须每次调用时都返回相同的结果。
beifeng1996
2022/12/16
2.7K0
滴滴前端二面react面试题总结
Refs 提供了一种方式,用于访问在 render 方法中创建的 React 元素或 DOM 节点。Refs 应该谨慎使用,如下场景使用 Refs 比较适合:
goClient1992
2022/09/14
1.1K0
react入门(三):state、ref & dom简解
作用:组件内部的状态重新更新时,可以控制组件内部重新渲染(不需要重新调取组件也可以重新渲染)
柴小智
2020/02/12
8970
React组件基础
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5zo7zriO-1668351209724)(images/组件.png)]
用户10169043
2022/11/18
3.1K0
React组件基础
前端二面高频react面试题集锦_2023-02-23
若虚拟DOM中的内容发生改变了,则生成新真实的DOM,随后替换页面中之前的真实DOM
用户10376779
2023/02/23
2.9K0
推荐阅读
相关推荐
React---组件实例三大核心属性(一)state
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验