- ReactJS 教程
- ReactJS 教程
- ReactJS - 简介
- ReactJS - 安装
- ReactJS - 特性
- ReactJS - 优点和缺点
- ReactJS - 架构
- ReactJS - 创建 React 应用程序
- ReactJS - JSX
- ReactJS - 组件
- ReactJS - 嵌套组件
- ReactJS - 使用组件
- ReactJS - 组件集合
- ReactJS - 样式
- ReactJS - 属性(props)
- ReactJS - 使用属性创建组件
- ReactJS - props 验证
- ReactJS - 构造函数
- ReactJS - 组件生命周期
- ReactJS - 事件管理
- ReactJS - 创建事件感知组件
- ReactJS - 在Expense Manager APP中引入事件
- ReactJS - 状态管理
- ReactJS - 状态管理 API
- ReactJS - 无状态组件
- ReactJS - 使用 React Hooks 进行状态管理
- ReactJS - 使用 React 钩子的组件生命周期
- ReactJS - 组件的布局
- ReactJS - 分页
- ReactJS - Material 用户界面
- ReactJS - Http 客户端编程
- ReactJS - 表单编程
- ReactJS - 受控组件
- ReactJS - 不受控制的组件
- ReactJS - Formik
- ReactJS - 条件渲染
- ReactJS - 列表
- ReactJS - 键
- ReactJS - 路由
- ReactJS - 冗余
- ReactJS - 动画
- ReactJS - 引导程序
- ReactJS - 地图
- ReactJS - 表格
- ReactJS - 使用 Flux 管理状态
- ReactJS - 测试
- ReactJS - CLI 命令
- ReactJS - 构建和部署
- ReactJS - 示例
- ReactJS - 钩子简介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定义钩子
- ReactJS - 可访问性
- ReactJS - 代码拆分
- ReactJS - 上下文
- ReactJS - 错误边界
- ReactJS - 转发引用
- ReactJS - 片段
- ReactJS - 高阶组件
- ReactJS - 与其他库集成
- ReactJS - 优化性能
- ReactJS - 分析器 API
- ReactJS - 门户
- ReactJS - 没有 ES6 ECMAScript 的 React
- ReactJS - 没有 JSX 的 React
- ReactJS - 协调
- ReactJS - 引用和 DOM
- ReactJS - 渲染属性
- ReactJS - 静态类型检查
- ReactJS - 严格模式
- ReactJS - Web 组件
- ReactJS - 日期选择器
- ReactJS - Helmet
- ReactJS - 内联样式
- ReactJS - 属性类型
- ReactJS - 浏览器路由器
- ReactJS - DOM
- ReactJS - 旋转木马
- ReactJS - 图标
- ReactJS - 表单组件
- ReactJS - 参考 API
ReactJS - 引用和 DOM
当组件的状态发生变化时,React 会自动发出 HTML 元素。这极大地简化了 UI 开发,因为它足以更新组件的状态。但是,传统上,直接访问 DOM 元素是更新组件 UI 的规范。
有时我们可能需要回退到直接访问 DOM 元素,并在 react 应用程序中更新 UI。React ref 在这种情况下提供帮助。它提供对 DOM 元素的直接访问。此外,它还确保组件与 react Virtual DOM 和 HTML DOM 一起顺利运行。
React 提供了一个函数 createRef 来在基于类的组件中创建 ref。在本章中,让我们学习如何使用 createRef。
createRef 方法的签名
createRef 的目的是返回一个可变对象,该对象将在重新渲染之间持续存在。createRef的签名如下:
<refObj> = React.createRef()
这里,refObj 是钩子返回的对象
要自动将 DOM 对象附加到 refObj,应在元素的 ref props 中设置它,如下所示 -
<input ref={refObj} />
要访问附加的 DOM 元素,请使用 refObj 的 current 属性,如下所示 -
const refElement = refObj.current
应用参考文献
在本章中,让我们通过创建一个 react 应用程序来学习如何应用 createRef。
首先,创建一个新的 react 应用程序并使用以下命令启动它。
cd myapp
npm start
接下来,在组件文件夹(src/components/SimpleRef.js)下创建一个 react 组件 SimpleRef
import React from "react";
class SimpleRef extends React.Component {
render() {
return (
<div>Hello World</div>
);
}
}
export default SimpleRef;
接下来,打开 App.css (src/App.css) 并删除所有样式。然后,打开 App 组件 (src/App.js) 并使用我们的新 SimpleRef 组件更新内容,如下所示 -
import './App.css'
import SimpleRef from './Components/SimpleRef'
function App() {
return (
<div className="container">
<div style={{ padding: "10px" }}>
<div>
<SimpleRef />
</div>
</div>
</div>
);
}
export default App;
接下来,向 SimpleRef 组件添加计数器功能,如下所示 -
import React from "react";
class SimpleRef extends React.Component {
constructor(props) {
super(props)
this.state = {
count: 0
}
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState(
prevState => ({
count: prevState.count + 1
})
)
}
render() {
return (
<div>
<div>Counter: {this.state.count} <button onClick={this.handleClick}>+</button></div>
</div>
)
}
}
export default SimpleRef;
在这里,我们有,
- 使用 this.setState 处理计数器状态变量 (count)。
- 在 JSX 中呈现了计数器状态变量
- 添加了一个按钮并附加了一个点击处理程序事件 (this.handleClick),该事件将使用 this.setState 方法递增计数器
接下来,添加一个输入字段,并根据用户在输入字段中输入的值显示问候语,如下所示 -
import React from "react";
import { createRef } from "react";
class SimpleRef extends React.Component {
constructor(props) {
super(props)
this.state = {
count: 0
}
this.handleClick = this.handleClick.bind(this);
this.handleChange = this.handleChange.bind(this);
this.inputRef = createRef()
this.labelRef = createRef()
}
handleClick() {
this.setState(prevState => ({
count: prevState.count + 1
}))
}
handleChange() {
this.labelRef.current.innerText =
this.inputRef.current.value == "" ? "World" : this.inputRef.current.value
}
render() {
return (
<div>
<div>Counter: {this.state.count} <button onClick={this.handleClick}>+</button></div>
<div style={{ paddingTop: "5px"}}>
<label>Enter your name: </label><input type="text" name="username"
ref={this.inputRef} onChange={this.handleChange}/>
<br />
<div>Hello, <span ref={this.labelRef}></span></div>
</div>
</div>
)
}
}
export default SimpleRef;
在这里,我们有,
- 创建了一个 ref this.inputRef 来表示输入元素,并通过 ref props 将其附加到相关元素上
- 创建了一个 ref this.labelRef 来表示问候消息元素,并通过 ref props 将其附加到相关元素上
- 将事件处理程序 this.handleChange 附加到输入元素。事件处理程序使用 this.inputRef ref 获取问候消息,并使用 this.labelRef ref 更新消息
接下来,在浏览器中打开应用程序并输入您的姓名。应用程序将更新问候消息,如下所示。
检查您的控制台,您会注意到该组件未重新呈现。由于 react 仅在状态更改时重新渲染,而 ref 不执行任何状态更改,因此组件不会被重新渲染。
接下来,单击 + 按钮。它将通过重新渲染组件来更新计数器,因为状态(计数)发生了变化。如果你仔细观察,你会发现消息保持不变。此行为的原因是 ref 值在 react 渲染之间保留。
createRef 的用例
createRef的一些用例如下 -
访问 JavaScript DOM API − JavaScript DOM API 提供了丰富的功能集来操作 9 个应用程序的 UI。当应用程序特性需要访问 JavaScript DOM API 时,可以使用 createRef 来检索原始 DOM 对象。一旦检索到原始 DOM 对象,应用程序就可以使用 DOM API 来访问所有功能。DOM API的一些示例如下 -
- 聚焦输入元素
- 选择文本
- 使用媒体播放 API 播放音频或视频
命令式动画 - Web 动画 API 通过命令式编程而不是声明式编程提供一组丰富的动画功能。要使用 Web 动画 API,我们需要访问原始 DOM。
与第三方库集成 - 由于第三方库需要访问原始 DOM 才能执行其功能,因此必须使用 createRef 从 react 获取 DOM 引用并将其提供给第三方库。
总结
尽管 react 开发 UI 的方式简单易行,但在某些情况下基于 DOM API 开发 UI 有其自身的优势。createRef 钩子非常适合这些场景,并提供简单干净的 API 来直接访问 DOM 元素并随后访问其 API。