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. Python-Django学习笔记(一)-MTV设计模式

    Django是开源的.大而且全的Web应用框架. 它独具特色,采用了MTV设计模式. MTV框架包括:Model(模型).Template(模板)和View(视图) Model(模型):负责业务对象与 ...

  2. c# 删除功能

    html界面: js: controller: app:

  3. centos7添加多个网段

    # service network restart是重启所有网卡.例如下面的例子:>ifconfig eth0 up|down>service network restart|start| ...

  4. Wannafly Camp 2020 Day 2J 邦邦的2-SAT模板

    #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; cout<<n& ...

  5. [CF1034A] Two Rabbits - 数学

    判断能否整除即可 #include <bits/stdc++.h> using namespace std; int x,y,a,b; int main() { int t; ios::s ...

  6. jQuery里ready方法用原生js实现原理

    function ready(fn){ if(document.addEventListener){ //标准浏览器 document.addEventListener('DOMContentLoad ...

  7. 【做题笔记】洛谷P1506 拯救oibh总部

    跑一遍染色法,最后判断哪些位置没被染色即可 一些技巧: 为了判断方便,把字符转换成 int 型的数字. 注意边界问题 详细解释见代码 #include <iostream> #includ ...

  8. php单例模式封装数据库操作类增删改查

    <?php//三私一公 单例class Db{ //数据库连接对象 private static $instance; private static $table_name; private $ ...

  9. HTML div标签

    看成一个 纯净的箱子吧.....啥属性都没有....默认宽度100% 高度0高度是 按DIV里的 内容而变高也可以在 CSS里 设置 宽高....DIV就是 典型的 标签.. P UL LI 等 标签 ...

  10. C#连接数据库时Appsettings 与connectionStrings的区别

    C#连接数据库时Appsettings 与connectionStrings的区别 转载lscyo 最后发布于2018-08-08 18:38:04 阅读数 3366  收藏 展开 一..Appset ...