一.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. 【java基础学习-2--】关于Hashcode()的使用

    摘要 Java中equals()和hashCode()有一个契约: 如果两个对象相等的话,它们的hash code必须相等: 但如果两个对象的hash code相等的话,这两个对象不一定相等; 这个约 ...

  2. bzojj1764: [Baltic2009]monument

    Description 给一个p*q*r的立方体,它由p*q*r个1*1*1的小立方体构成.每个立方体要么被虫蛀,要么不被.现在郑爽要选出一个a*a*b的立方体(方向任意),使得它没有被虫蛀过,并且4 ...

  3. zend studio 12汉化和破解

    首先提供一个 zend studio 12汉化的百度连接地址(我的网盘里有) http://pan.baidu.com/s/1dD5x1cd 下载后解压 安装方法 Help–> Install  ...

  4. Python Paramiko模块

    代码来自:http://www.cnblogs.com/wupeiqi/articles/4356675.html 今天学到了一个运维方面的利器:python的paramiko模块. paramiko ...

  5. android的Looper例子

    直接贴代码 MsgThread.java package bb.aa.looperdemo; import android.os.Handler; import android.os.Looper; ...

  6. 怎样进行Android UI元素设计

    Android UI元素里面包含了许多的内容,比如:该平台由操作系统.中间件.用户界面和应用软件组成,一个应用程序要想受用户喜爱,那么UI可不能差. Android为相似的编程名词引入了一些新的术语, ...

  7. linux 屏幕亮度调节

    Brightness sudo gedit  /etc/default/grub find this  line  :   GRUB_CMSLINE_LINUX_DEFAULT="quiet ...

  8. [运维-服务器 – 1A] – nginx.conf(转)

    #定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...

  9. POJ 1611 The Suspects(并查集,简单)

    为什么ACM的题意都这么难懂,就不能说的直白点吗?还能不能好好的一起刷题了? 题意:你需要建一个n的并查集,有m个集合,最后要输出包含0的那个集合的元素的个数. 这是简单并查集应用,所以直接看代码吧! ...

  10. dede图片横向滚动

    <div id=demo style="overflow:hidden; width:960px;" > <table border=0 align=" ...