React的React.createRef()/forwardRef()源码解析(三)
1.refs三种使用用法
1.字符串
1.1 dom节点上使用 获取真实的dom节点
//使用步骤:
1. <input ref="stringRef" />
2. this.refs.stringRef
//值:<input />
1.2 类组件上使用 获取引用类组件的实例
//使用步骤
1. <Child ref="compStringRef" />
2.this.refs.compStringRef
//值:{props:{},refs:{},state:null,....}
2.回调函数
2.1 dom节点上挂载回调函数 函数的入参为dom节点
//使用步骤
1.<input ref={(ref) => { this.callBackRef = ref }} />
2.this.callBackRef //值:<input />
2.2 类组件上挂载回调函数 函数的参数为类组件实例
//使用步骤
1.<Child ref={(com) => { this.comCallbackRef = com }} />
2.this.comCallbackRef
3.CreateRef方法
3.1 React.createRef()创建一个ref 赋值给一个变量 使用ref.current属性获取dom节点
//使用步骤
1.this.myCreateRef = React.createRef();
2. <input ref={this.myCreateRef} />
3.this.myCreateRef.current
3.2 React.createRef()创建一个ref 赋值给一个变量 使用ref.current属性获取类组件实例
//使用步骤
1.this.myCompCreateRef = React.createRef()
2.<Child ref={this.myCompCreateRef} />
3.this.myCompCreateRef.current
2.React.forwardRef()使用用法
1.为啥会出现forwardRef()?
对于函数类型 function(props){return(<div>1111</div>)} 无法获取ref的值 如果要获取ref的值 必须要把ref传递进去
2.获取函数组件的实例
//使用步骤
1.this.myCompCreateRef = React.createRef();
2.<Child ref={this.myCompCreateRef} />
3.this.myCompCreateRef.current
4.const Child = React.forwardRef((props, ref) => (
<input ref={ref} />
)); //平时组件传递 只能传递props 调用forwardRef 可以传递第二个参数ref
3.React.createRef()源码解析
//返回一个具有current属性的refObject对象
function createRef() {
var refObject = {
current: null
};
{
Object.seal(refObject);
}
return refObject;
}
4.React.forwardRef()源码解析
function forwardRef(render) {
{
if (render != null && render.$$typeof === REACT_MEMO_TYPE) {
warningWithoutStack$1(false, 'forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');
} else if (typeof render !== 'function') {
warningWithoutStack$1(false, 'forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);
} else {
!( // Do not warn for 0 arguments because it could be due to usage of the 'arguments' object
render.length === 0 || render.length === 2) ? warningWithoutStack$1(false, 'forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.') : void 0;
}
if (render != null) {
!(render.defaultProps == null && render.propTypes == null) ? warningWithoutStack$1(false, 'forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?') : void 0;
}
}
//返回一个对象,对象里面包含一个$$typeof属性 它依然是ReactElement 使用时候:React.createElement(React.forwardRef(Child))
//该对象在传入ReactElement方法之后,保存在type属性里 而$$typeof仍然是REACT_ELEMENT_TYPE
return {
$$typeof: REACT_FORWARD_REF_TYPE,
render: render
};
}
React的React.createRef()/forwardRef()源码解析(三)的更多相关文章
- Celery 源码解析三: Task 对象的实现
Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...
- Mybatis源码解析(三) —— Mapper代理类的生成
Mybatis源码解析(三) -- Mapper代理类的生成 在本系列第一篇文章已经讲述过在Mybatis-Spring项目中,是通过 MapperFactoryBean 的 getObject( ...
- react 中间件相关的一些源码解析
零.随便说说中间件 在react的使用中,我们可以将数据放到redux,甚至将一些数据相关的业务逻辑放到redux,这样可以简化我们组件,也更方便组件抽离.封装.复用,只是redux不能很好的处理异步 ...
- ReactiveCocoa源码解析(三) Signal代码的基本实现
上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...
- ReactiveSwift源码解析(三) Signal代码的基本实现
上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...
- Spring源码解析三:IOC容器的依赖注入
一般情况下,依赖注入的过程是发生在用户第一次向容器索要Bean是触发的,而触发依赖注入的地方就是BeanFactory的getBean方法. 这里以DefaultListableBeanFactory ...
- jQuery 源码解析(三十) 动画模块 $.animate()详解
jQuery的动画模块提供了包括隐藏显示动画.渐显渐隐动画.滑入划出动画,同时还支持构造复杂自定义动画,动画模块用到了之前讲解过的很多其它很多模块,例如队列.事件等等, $.animate()的用法如 ...
- vuex 源码解析(三) getter属性详解
有时候我们需要从store中的state中派生出一些状态,例如: <div id="app"> <p>{{reverseMessage}}</p> ...
- jQuery 源码解析(三) pushStack方法 详解
该函数用于创建一个新的jQuery对象,然后将一个DOM元素集合加入到jQuery栈中,最后返回该jQuery对象,有三个参数,如下: elems Array类型 将要压入 jQuery 栈的数组元素 ...
随机推荐
- 链表问题----删除链表的中间节点和a/b处的节点
删除链表的中间节点和a/b处的节点 对于给定一个链表的头节点head,实现删除链表的中间节点的函数. 例如 不删除任何节点: 1->2,删除节点1 1->2->3,删除节点2 1-& ...
- Android_几种菜单
Android中的菜单有如下几种: OptionMenu:选项菜单,android中最常见的菜单,通过Menu键来调用 SubMenu:子菜单,android中点击子菜单将弹出一个显示子菜单项的悬浮框 ...
- TCL namespace
命名空间可从Tcl 8.0版开始使用.引入命名空间之前,有一个全局范围.现在有了命名空间,我们可以分区全局范围. 创建命名空间: 结果:33 嵌套命名空间: 结果: test1 test2 导入命名空 ...
- CF399B Red and Blue Balls
题目 CF399B 洛谷RemoteJudge 思路 很容易发现,栈中靠上的蓝色球的出栈,对它下方的蓝色球没有影响. 举个例子: 第一步中靠上的蓝色球在第三步出栈了,这一过程对它下面的蓝色球(即第一步 ...
- 回顾 Monty Hall (三门问题)
一.问题描述 Monty Hall Problem 源于美国的一档电视节目<Let's Make a Deal>,其中Monty Hall 是这个节目的主持人. 节目中有三扇门1.2.3, ...
- K3修改字段名
在K3的BOS中,自定义字段之后我们往往会修改字段名,便于记忆和理解,但是修改字段名之后,只是数据库中的字段名被修改了,BOS中的字段标识并没有被修改,可以通过以下语句将标识和字段名改成一致. sel ...
- Qt- 图形界面应用程序的运行模式
main() 定义主窗口 ————>fd = DefineMainWindow() 创建主窗口————>win = CreateMainWindow() 创建主窗口中的元素-----> ...
- 显示当前目录命令 - pwd
1) 命令名称:pwd 2) 英文原意:print working directory 3) 命令所在路径:/bin/pwd 4) 执行权限:所有用户 5) 功能描述:显示当前目录 6) 语法: pw ...
- 基于Java在线学习系统设计与实现
Spring+SpringMVC+MyBatis+Bootstrap+Vue开发在线学习系统 本课题的主要内容是开发基于Java EE的在线学习平台,使用MVC经典开发模式. ...
- 12c的PDB创建DIRECTORY要注意与PATH_PREFIX的关系(ORA-65254)
在创建PDB过程中如果使用了带PATH_PREFIX的参数,意味着在创建DIRECTORY目录时需要指定相对路径,而不能指定其它绝对路径.来自博客园AskScuti 11g整库作为一个PDB迁移至阿里 ...