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",即属性)并 ...
随机推荐
- SSH_框架整合2—查询显示
4. 完成功能. (1)com.atguigu.ssh.actions包下新建EmployeeAction.java package com.atguigu.ssh.actions; import j ...
- 设计模式初学者笔记:Factory Method模式
如果要选择一种最多人熟悉的Factory Method模式的具体应用,那么就应该是MFC的App/Doc架构了.Factory Method主要在类框架中使用,以解决以下问题:框架必须实例化类,但框架 ...
- Nmap命令的29个实用范例
Nmap即网络映射器对Linux系统/网络管理员来说是一个开源且非常通用的工具.Nmap用于在远程机器上探测网络,执行安全扫描,网络审计和搜寻开放端口.它会扫描远程在线主机,该主机的操作系统,包过滤器 ...
- NodeJS的异步编程风格
NodeJS的异步编程风格 http://www.infoq.com/cn/news/2011/09/nodejs-async-code NodeJS运行环境因其支持Javascript语言和异步编程 ...
- rdynamic和-whole-archive
遇到如下情况,主程序通过dlopen来打开.so文件,但是.so用到了主程序的log函数. 编译so时,通过引用主程序头文件来编译通过,头文件有log函数声明: extern "C" ...
- 在eclipse中设计BPMN 2.0工作流定义的根本步骤
原文地址:http://www.myexception.cn/eclipse/1863140.html 在eclipse中设计BPMN 2.0工作流定义的基本步骤 1. Activiti问我们提供了A ...
- 黄聪:PHP使用Simple_HTML_DOM遍历、过滤及保留指定属性
<? /* * 参考资料: * http://www.phpddt.com/manual/simplehtmldom_1_5/manual_api.htm * http://www.phpddt ...
- Java事务处理全解析(二)——失败的案例
在本系列的上一篇文章中,我们讲到了Java事务处理的基本问题,并且讲到了Service层和DAO层,在本篇文章中,我们将以BankService为例学习一个事务处理失败的案例. BankService ...
- Tomcat的ServletAPI与Jetty的不能混用,否则会出现Serlvt类无法编译
- JAVA NIO中selectedKeys返回的键集,对其中的SelectionKey执行操作之后,是否需要在selectedKeys()中对其执行remove 操作
今天一个东西需要用到java nio的东西.在网上查了一下资料,发现有Apache的Mina,Netty等,感觉JDK中带的NIO有点鸡肋啊.之前看过这部分的内容,但好长一段时间没有用,也就忘得七七八 ...