一.ref是通过ReactDOM.render返回的

  定义在组件上的render方法返回的是一个虚拟的DOM节点,jsx返回的是一个ReactElement,ReactDOM.render返回的是一个组件实例的引用

var myComponentElement = <MyComponent />; // This is just a ReactElement.

// Some code here...

var myComponentInstance = ReactDOM.render(myComponentElement, myContainer);
myComponentInstance.doSomething();

二.ref的类型

ref有两种类型的值分别是:字符串和函数。组件的ref只有组件被装载之后才能访问得到。

1.ref属性值是一个字符串

  (1)给一个DOM组件(如:div,input等)设置一个ref属性,通过this.refs.refName获取到的是一个实际的DOM节点

var TextInput = React.createClass({
render:function(){
return <input type='text' className='text' ref='input'/>;
},
componentDidMount:function(){
console.log(this.refs.input.type);//text
}
});

  (2)给一个复合组件设置一个ref属性,通过this.refs.refNamde获取到的是一个组件实例的引用,因此可以调用这个组件实例上的方法

var TextInput = React.createClass({
render:function(){
return <input type='text' className='text'/>;
}
check:function(){
console.log('我是组件中的方法');
}
});
var DivBox = React.createClass({
render:function(){
return <TextInput ref='TextInputClass'/>;
},
componentDidMount:function(){
this.refs.TextInputClass.check();//我是组件中的方法
}
});

2.ref的值是一个函数

  (1)给一个DOM组件设置一个ref属性。这个回调函数在组件mounted之后立即调用,可以给这个回调函数传递一个参数,该参数指这个DOM节点

var Div = React.createClass({
render:function(){
return <div ref={function(curDivNode){
console.log(curDivNode.firstChild.nodeValue);//kfjdk
}
}>
kfjdk
</div>
}
});

(2)给一个复合组件设置一个ref属性,这个回调函数在组件mounted之后立即调用,可以给这个回调函数传递一个参数,这个参数指这个组件实例的引用,因此可以调用这个实例上的方法。

var Div = React.createClass({
render:function(){
return <div ref={function(curDivNode){console.log(curDivNode);}}>
kfjdk
</div>
},
check:function(){
console.log('我是组件方法')
}
});
var OutDiv = React.createClass({
render:function(){
return <Div ref={function(outDivNode){
outDivNode.check();//我是组件上的方法
}}/>
} });

补充:(1)不要将ref设置到用函数类型声明的组件上,在函数类型声明的组件上,通过this.refs.refName得到的是一个null,但是你可以在函数类型组件内部的DOM组件或者class类型组件上设置ref

(2)建议使用函数类型ref代替字符串类型ref

var Liu = React.createClass({
render:function(){
return <StateLess ref='stateless'/>
},
componentDidMount:function(){
console.log(this.refs.stateless);//null
}
});
function StateLess(){
return <p>StateLess</p>
}

  (2)在render函数内部不要访问ref

  (3)ref自动管理。如果孩子被摧毁,它的ref也被摧毁,不用担心内存

  (4)ref可以被设置在任何组件上

3.将子组件中的dom元素暴露到父组件中

在一些情况中,需要将子组件中的元素节点暴露到父组件中(这并不推荐),但是当在父组件中需要让子组件中的元素取得焦点,或者管理子组件中元素的位置或大小
时这很有用。我们可以给子组件设置ref,但是这并不是理想的解决方案,因为这仅仅得到了一个组件实例而不是DOM节点。代替的方案是:给子组件设置一个函数类型
的prop,然后在子组件中将这个函数类型的prop设置到元素节点ref上。如下:
class ParentCom extends React.Component{
   render(){
      return <ChildrenCom propFunc={elem => this.input = elem}/>
   }
}
function ChildrenCom(props){
   return <input ref={props.propFunc}/>
}

当ref回调是一个行内函数,这个函数在组件更新期间会调用两次,第一次调用时的参数时null,第二次调用时参数时DOM元素。

Refs to Components的更多相关文章

  1. Refs & DOM

    Refs 提供了一种访问在 render 方法中创建的 DOM 节点或 React 元素的方式. 在典型的 React 数据流中, 属性(props)是父组件与子代交互的唯一方式.要修改子组件,你需要 ...

  2. 用vue2.x注册一个全局的弹窗alert组件

    一.在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间.本文将分享如何定义 ...

  3. vue 前端框架 (三)

    VUE 生命周期 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  4. Vue.js 子组件的异步加载及其生命周期控制

    前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...

  5. 用vue2.x注册一个全局的弹窗alert组件、confirm组件

    一.在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间.本文将分享如何定义 ...

  6. Vue基础操作

    一.Vue入门基础知识 1.Vue使用的基本操作 i. 先下载,引入vue.jsii. Vue,实例化一个vue实例化对象(new Vue({})) 1. 新建一个vue实例化对象(Vue是一个构造函 ...

  7. [React Fundamentals] Using Refs to Access Components

    When you are using React components you need to be able to access specific references to individual ...

  8. [React] React Fundamentals: Using Refs to Access Components

    When you are using React components you need to be able to access specific references to individual ...

  9. 24-React Components组件

    Components 组件 1.组件 可以让UI独立的分割出来,可以让UI重复利用. 2.组件就像是JavaScript函数,它们能够接收任意的输入(称为"props",即属性)并 ...

随机推荐

  1. LintCode "Backpack"

    A simple variation to 0-1 Knapsack. class Solution { public: /** * @param m: An integer m denotes th ...

  2. IDrac的console无法键盘输入

    IDrac的console无法键盘输入问题? 解:disable IE 的protect 功能 (Idrac的正常工作需要先安装Java,同时IDrac只支持IE和Firefox.) 方法: IE-& ...

  3. jdk RSA算法类使用

    package com.security.rsa; import java.security.Key;import java.security.KeyFactory;import java.secur ...

  4. GTD_百度百科

    GTD就是Getting Things Done的缩写,翻译过来就是"把事情做完",GTD的核心理念概括就是必须记录下来要做的事,然后整理安排并自己一一去执行.GTD的五个核心原则 ...

  5. 【Linux】系统 之 RAID

    本人从事DBA相关的工作,最近遇到了IO抖动伴随shread running抖动的情况,主机宕机重启后备库及下游解析binlog出现损坏的案例,向一些有经验的同事咨询学习,其中最大的嫌疑是:raid卡 ...

  6. Spark配置参数调优

    1.配置多个executor 在项目中,由于数据量为几百万甚至千万级别,如果一个executor装载的对象过多,会导致GC很慢.项目中,我们使一个worker节点执行app时启动多个executor, ...

  7. BEvent_客制化Event Agent通道(案例)(待整理)

    2014-09-09 Created By BaoXinjian

  8. hdu 1536 S-Nim(sg函数模板)

    转载自:http://blog.csdn.net/sr_19930829/article/details/23446173 解题思路: 这个题折腾了两三天,参考了两个模板,在这之间折腾过来折腾过去,终 ...

  9. mysql 正则

    mysql 正则学习 基本字符匹配 select desk from dealer_info where desk regexp "82107777"; . 表示匹配任意一个字符 ...

  10. C#使用EmguCV实现视频读取和播放,及多个视频一起播放的问题

    大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 1)第一种方法,使用委托: private delega ...