Refs to Components
一.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的更多相关文章
- Refs & DOM
Refs 提供了一种访问在 render 方法中创建的 DOM 节点或 React 元素的方式. 在典型的 React 数据流中, 属性(props)是父组件与子代交互的唯一方式.要修改子组件,你需要 ...
- 用vue2.x注册一个全局的弹窗alert组件
一.在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间.本文将分享如何定义 ...
- vue 前端框架 (三)
VUE 生命周期 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- Vue.js 子组件的异步加载及其生命周期控制
前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...
- 用vue2.x注册一个全局的弹窗alert组件、confirm组件
一.在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间.本文将分享如何定义 ...
- Vue基础操作
一.Vue入门基础知识 1.Vue使用的基本操作 i. 先下载,引入vue.jsii. Vue,实例化一个vue实例化对象(new Vue({})) 1. 新建一个vue实例化对象(Vue是一个构造函 ...
- [React Fundamentals] Using Refs to Access Components
When you are using React components you need to be able to access specific references to individual ...
- [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 ...
- 24-React Components组件
Components 组件 1.组件 可以让UI独立的分割出来,可以让UI重复利用. 2.组件就像是JavaScript函数,它们能够接收任意的输入(称为"props",即属性)并 ...
随机推荐
- LintCode "Backpack"
A simple variation to 0-1 Knapsack. class Solution { public: /** * @param m: An integer m denotes th ...
- IDrac的console无法键盘输入
IDrac的console无法键盘输入问题? 解:disable IE 的protect 功能 (Idrac的正常工作需要先安装Java,同时IDrac只支持IE和Firefox.) 方法: IE-& ...
- jdk RSA算法类使用
package com.security.rsa; import java.security.Key;import java.security.KeyFactory;import java.secur ...
- GTD_百度百科
GTD就是Getting Things Done的缩写,翻译过来就是"把事情做完",GTD的核心理念概括就是必须记录下来要做的事,然后整理安排并自己一一去执行.GTD的五个核心原则 ...
- 【Linux】系统 之 RAID
本人从事DBA相关的工作,最近遇到了IO抖动伴随shread running抖动的情况,主机宕机重启后备库及下游解析binlog出现损坏的案例,向一些有经验的同事咨询学习,其中最大的嫌疑是:raid卡 ...
- Spark配置参数调优
1.配置多个executor 在项目中,由于数据量为几百万甚至千万级别,如果一个executor装载的对象过多,会导致GC很慢.项目中,我们使一个worker节点执行app时启动多个executor, ...
- BEvent_客制化Event Agent通道(案例)(待整理)
2014-09-09 Created By BaoXinjian
- hdu 1536 S-Nim(sg函数模板)
转载自:http://blog.csdn.net/sr_19930829/article/details/23446173 解题思路: 这个题折腾了两三天,参考了两个模板,在这之间折腾过来折腾过去,终 ...
- mysql 正则
mysql 正则学习 基本字符匹配 select desk from dealer_info where desk regexp "82107777"; . 表示匹配任意一个字符 ...
- C#使用EmguCV实现视频读取和播放,及多个视频一起播放的问题
大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 1)第一种方法,使用委托: private delega ...