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()源码解析(三)的更多相关文章

  1. Celery 源码解析三: Task 对象的实现

    Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...

  2. Mybatis源码解析(三) —— Mapper代理类的生成

    Mybatis源码解析(三) -- Mapper代理类的生成   在本系列第一篇文章已经讲述过在Mybatis-Spring项目中,是通过 MapperFactoryBean 的 getObject( ...

  3. react 中间件相关的一些源码解析

    零.随便说说中间件 在react的使用中,我们可以将数据放到redux,甚至将一些数据相关的业务逻辑放到redux,这样可以简化我们组件,也更方便组件抽离.封装.复用,只是redux不能很好的处理异步 ...

  4. ReactiveCocoa源码解析(三) Signal代码的基本实现

    上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...

  5. ReactiveSwift源码解析(三) Signal代码的基本实现

    上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...

  6. Spring源码解析三:IOC容器的依赖注入

    一般情况下,依赖注入的过程是发生在用户第一次向容器索要Bean是触发的,而触发依赖注入的地方就是BeanFactory的getBean方法. 这里以DefaultListableBeanFactory ...

  7. jQuery 源码解析(三十) 动画模块 $.animate()详解

    jQuery的动画模块提供了包括隐藏显示动画.渐显渐隐动画.滑入划出动画,同时还支持构造复杂自定义动画,动画模块用到了之前讲解过的很多其它很多模块,例如队列.事件等等, $.animate()的用法如 ...

  8. vuex 源码解析(三) getter属性详解

    有时候我们需要从store中的state中派生出一些状态,例如: <div id="app"> <p>{{reverseMessage}}</p> ...

  9. jQuery 源码解析(三) pushStack方法 详解

    该函数用于创建一个新的jQuery对象,然后将一个DOM元素集合加入到jQuery栈中,最后返回该jQuery对象,有三个参数,如下: elems Array类型 将要压入 jQuery 栈的数组元素 ...

随机推荐

  1. 视频中“5s后可跳过广告” 设计目的

    来源:https://wen.woshipm.com/question/detail/0quoes.html 1.保证你在看.用户关掉广告这5秒内,他的眼睛会盯着屏幕,因为他知道5秒之后就能跳过广告. ...

  2. Selenium3+python自动化007-警告框

    警告框 alert = driver.switch_to.alert alert.text() alert.accpet() alert.dismiss() # 导selenium包 from sel ...

  3. Hackintosh相关资源站

    猫叔博客 https://www.maoshu.cc/ 大神RehabMan https://bitbucket.org/RehabMan/ dsdt/ssdt打补丁译文 https://blog.c ...

  4. Win10 JDK 环境变量配置

    1.安装JDK 到指定的目录 2.配置环境变量 2.1   配置 CLASSPATH    .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; 2. ...

  5. 杭电oj————2057(java)

    question:A+ B again 思路:额,没啥思路/捂脸,用java的long包里的方法,很简单,只是有几次WA,有几点要注意一下 注意:如果数字有加号要删除掉,这里用到了正则表达式“\\+” ...

  6. zabbix4.2配置监控MySQL

    1.在被监控主机安装好MySQL 相关步骤省略. 2.创建监控所需要的MySQL账户(MySQL服务器端) MariaDB [(none)]>grant usage on *.* to zabb ...

  7. 原来window 也可以使用pthreads

    https://blog.csdn.net/clever101/article/details/101029850

  8. [SDOI2016] 生成魔咒 - 后缀数组,平衡树,STL,时间倒流

    [SDOI2016] 生成魔咒 Description 初态串为空,每次在末尾追加一个字符,动态维护本质不同的子串数. Solution 考虑时间倒流,并将串反转,则变为每次从开头删掉一个字符,即每次 ...

  9. xrdp---远程桌面连接

    xrdp is an Open Source Remote desktop Protocol server, which allows you to RDP to your Linux server ...

  10. [Luogu]中位数

    Description Luogu1168 Solution 一种神奇的做法:开一个大根堆和小根堆,保证大根堆比小根堆多1个元素,且大根堆堆顶元素比小根堆堆顶元素小,那么大根堆堆顶就是中位数.插入的时 ...