react学习笔记(4) - ref属性以及状态初体验
react学习笔记(4) - ref
属性以及状态初体验
ref
属性
- 在我看来,
react
中的ref
属性与Vue
中的ref
属性是十分的相似的,两者的功能斗鱼原生js
中的id
选择器非常的相似,都是用于定位一个目标
(容器)使我们可以通过这个ref
属性去操作这个目标
,在组件内的标签可以定义ref
属性来标识自己(Vue,React
)
使用方法:
- 老版本使用(
不推荐使用,后续会被淘汰
)- 1. 给标签设置
ref="username"
- 通过这个获取
this.refs.username
, ref可以获取到应用的真实dom
- 通过这个获取
- 2. 给组件设置
ref="username"
- 通过这个获取
this.refs.username
,ref
可以获取到组件对象
- 通过这个获取
- 1. 给标签设置
import React, { Component } from 'react' |
- 结果展示:
- 新版本的使用(推荐使用)
- 切记在使用事件绑定的时候理清楚函数中的
this
指向,推荐使用箭头函数!
- 切记在使用事件绑定的时候理清楚函数中的
import React, { Component } from 'react' |
- 结果展示:
状态(state
)
- 状态就是组件描述某种显示情况的数据,由组件自己设置和更改,也就是说由组件自己维护,使用状态 的目的就是为了在不同的状态下使组件的显示不同(自己管理),可以对比
Vue
中的data
,也就是响应式数据,每一次修改状态,页面自动修改, 这就说明相较于Vue
中的data
,React
中是使用state
来保存数据(状态
)的
定义状态(数据)state
的两种方法
- 方法一(直接定义
state
)
import React, { Component } from 'react' |
- 方法二(使用构造函数定义)
import React, { Component } from 'react' |
结果展示
解析:
this.state
是纯js对象
,在vue
中,data
属性是利用object.defineProperty
处理过的,更改data
的数据的时候会触发数据的getter
和setter
的,也就是说我们在Vue
中可以直接修改data
中的数据状态,但是React
中没有做过这样的处理,如果直接更改的话React
是无法直接得知的,因此我们需要使用React
中提供的修改数据状态的方法setState()
来修改state
中的数据
列表渲染
React
中是不提供类似Vue
中的for in
语法的,也就是锁我们只能使用原生的js
语法来实现循环渲染数组或对象,这里推荐使用Es6
中的map
方法代码如下:(读取一个数组中的数据并以
ul-li
标签的组合形式渲染到页面上)
import React, { Component } from 'react' |
key
值解析(与Vue中的key值基本一致的认知即可
)
React
的高效依赖于所谓的Virtual-DOM
(虚拟Dom),尽量不碰DOM
。对于列表元素来说会有一个问题:元素可能会在一个列表中改变位置。要实现这个操作,只需要交换一下DOM
位置就行了,但是React
并不知道 其实我们只是改变了元素的位置,所以它会重新渲染后面两个元素(再执行Virtual-DOM
),这样会大大增加DOM
操作。但如果给每个元素加上唯一的标识(索引值
),React
就可以知道这两个元素只是交换了位置,这个标识就是key
值,且这个key
值必须是元素的唯一标识。(其实就跟Vue
中的理解基本一致就行了)
结果展示
条件渲染(对比Vue中的v-if,v-else等...
)
React
中的条件渲染还是使用原生的js
实现的,基本有以下三种方法:
{/* 条件渲染的两种方式,还是原生的js */} |
React
中的富文本编辑展示(dangeroutlySetInnerHTML
)
- 类似于
Vue
中的v-html
,用于使页面解析html
代码 - 处于安全的原因,
React
当中所有表达式的内容会被转义,如果直接输入,标签会被当成文本。这时候 就需要使用dangeroutlySetInnerHTML
属性,它允许我们动态的设置innerHTML
import React, { Component } from 'react' |
结果展示:
setState()
方法解析
- 我们都知道,在
React
中,想要修改state
中的状态就必须调用setState()
进行修改,且数据的更新是一种合并,不是替换,也就是说,我们可以直接使用setState()
来修改state
中的状态(数据
),但是却不会对未修改的状态进行任何的操作,且每一次调用setState()
来修改状态,页面都会重新渲染一次,也就是render
的调用次数。
由此图可以看见,我们1每一次更改
state
中的list
状态,flag
状态都是不变的,这也就说明了,状态的更新是一种合并操作。setState()
接受两个参数,第一个参数就是一个对象,用于指定修改state
中的状态操作,第二个参数是回调函数,这个回调函数是在使用setState()
修改完状态后,页面重新渲染完成(DOM重更新完成
)的时候调用的,
import React, { Component } from 'react' |
- 结果展示:
- 旧版本(
18以下
)setState()
还有一个特性就是,当我们调用setState()
时处于同步的逻辑中,状态是异步更新的,DOM
也是异步更新的,但是当我们处于异步的逻辑中去调用setState()
时,状态却是同步更新的,DOM
也是如此!!!但是18版本过后,多有的setState()
操作无论在同步还是异步逻辑下均为异步更新状态
!
小案例:todoList
- 案例要求: 在
input
框中填入想要做的事随后点击add
按钮将待办事项push
进入state
中的list
状态中,并且伴随着生成一个删除按钮,点击删除按钮调用原生的js
删除数组(splice
)中的某一项的方法删除对应的待办事项
,且每一次点击添加按钮添加待办事项后会清空输入框且每当没有待办事项的时候页面会显示当前暂无待办事项
代码展示:
import React, { Component } from 'react' |
结果展示:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0许可协议。转载请注明来自 肥林の仓库