React Native-组件的引用
之前文章中,我们使用了许多React Native组件,也定义了一些组件。但是我们都没有定义组件的标识,我们都是通过回调方法处理组件对应的事件,这种情况能满足绝大多数需求,有些情况我们需要对组件进行操作,此时就需要获取组件的引用,进而通过该应用对组件进行操作。比如,我们可以通过引用拿到组件,修改组件的属性。
定义组件的引用
通过在JSX代码中加入 ref=”某个字符串”,就可以定义一个组件的引用名称,如:
<TextInput ref="textInputRefer"
...
/>
通过 this.refs.textInputRefer就可以得到这个组件的引用。
还可以调用组件里的公开函数:
this.refs.aReferName.公开成员函数名()
重新设定组件的属性
每一个React Native 组件都有一个公开的成员函数setNativeProps,它可以增加或者修改React Native组件的属性。
但是不建议使用setNativeProps函数,就因为它太简单粗暴了,它可以直接操作任何层面的组件属性,而不是使用React Native组件的状态机变量,这样会使代码逻辑混乱,可能打乱原来设计编写好的业务逻辑。
在使用之前还是先尝试使用setState和shouldComponentUpdate方法来解决问题。
在不得不频繁刷新,同时避免渲染组件结构和同步太多的视图变化带来的大量开销时,才考虑使用setNativeProps函数。
示例代码:
...
class AwesomeProject extends Component {
// 构造
constructor(props) {
super(props);
// 初始状态
this.state = {
textInputValue: ''
};
this.buttonPressed = this.buttonPressed.bind(this);
}
buttonPressed() { //当按钮按下的时候执行此函数
let textInputValue = 'new value';
this.setState({textInputValue});
//修改文本输入框的属性值
this.refs.textInputRefer.setNativeProps({
editable:false
});
this.refs.text2.setNativeProps({
style:{
color:'blue',
fontSize:30
}
});
//使文本输入框变为不可编辑
}
render() {
return (
//ref={'text2'}> //指定本组件的引用名
<View style={styles.container}>
<Text style={styles.buttonStyle}
onPress={this.buttonPressed}>
按我
</Text>
<Text style={styles.textPromptStyle}
ref="text2">
文字提示
</Text>
<View>
<TextInput style={styles.textInputStyle}
ref="textInputRefer"
value={this.state.textInputValue}
onChangeText={(textInputValue)=>this.setState({textInputValue})}/>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center'
},
buttonStyle: { //文本组件样式,定义简单的按钮
fontSize: 20,
backgroundColor: 'grey'
},
textPromptStyle: { //文本组件样式
fontSize: 20
},
textInputStyle: { //文本输入组件样式
width: 150,
height: 50,
fontSize: 20,
backgroundColor: 'grey'
}
});
...
当按钮点击的时候就会修改属性,让TextInput组件不能再编辑,让字体变大,这个操作最好通过setState完成, 上面的做法只是为了给大家演示如何修改属性。
测量控件measure
使用View组件的onLayout回调函数是获取组件的宽,高与位置信息的最好办法,但是有时候组件是代码生成的,只能使用组件的measure成员函数测量控件了,这时候就需要根据组件的引用去调用组件的measure函数
下面代码不是通过代码生成的组件,主要是为了演示通过组件的引用调用measure函数。
...
class AwesomeProject extends Component {
// 构造
constructor(props) {
super(props);
// 初始状态
this.state = {};
this.tempfunc = this.tempfunc.bind(this);
this.getPosition = this.getPosition.bind(this);
}
componentDidMount() {
// this.tempfunc();
//在componentDidMount执行完后才可以获取位置,不能直接调用tempfunc函数
var aref = this.tempfunc;
//这个位置保险起见延迟1毫秒,其实把数字改成0默认也在componentDidMount之后执行
window.setTimeout(aref, 1);//延迟一毫秒执行tempfuc
}
tempfunc() {
//测量 获取位置, 参数是回调方法
this.refs.textInputRefer.measure(this.getPosition)
}
getPosition(fx, fy, width, height, px, py) {
console.log('getPosition');
console.log("width:" + width); //控件宽
console.log("height:" + height);//控件高
console.log("fx:" + fx); //距离父控件左端 x的偏移量
console.log("fy:" + fy); //距离父控件上端 y的偏移量
console.log("px:" + px); //距离屏幕左端 x的偏移量
console.log("py:" + py); //距离屏幕上端 y的偏移量
}
render() {
return (
// 为了保重TextInput组件居中显示多用一个View包裹
<View style={styles.container}>
<View style={{borderWidth:1}}>
<TextInput style={styles.textInputStyle}
ref="textInputRefer"
value={this.state.textInputValue}
onChangeText={(textInputValue)=>this.setState({textInputValue})}/>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center'
},
textInputStyle: { //文本输入组件样式
width: 200,
height: 55,
fontSize: 50,
alignItems: 'center',
justifyContent: 'center',
paddingTop: 0,
paddingBottom: 0,
backgroundColor: "blue"
}
});
...
运行结果:
更多精彩请关注微信公众账号likeDev
React Native-组件的引用的更多相关文章
- beeshell —— 开源的 React Native 组件库
介绍 beeshell 是一个 React Native 应用的基础组件库,基于 0.53.3 版本,提供一整套开箱即用的高质量组件,包含 JavaScript(以下简称 JS)组件和复合组件(包含 ...
- React Native组件的结构和生命周期
React Native组件的结构和生命周期 一.组件的结构 1.导入引用 可以理解为C++编程中的头文件. 导入引用包括导入react native定义的组件.API,以及自定义的组件. 1.1 导 ...
- React Native组件之Text
React Native组件之Text相当于iOS中的UILabel. 其基本属性如下: /** * Sample React Native App * https://github.com/face ...
- React Native组件之Switch和Picker和Slide
React Native组件Switch类似于iOS中的UISwitch:组件Slide类似于iOS中UIslider,组件Picker类似于iOS的UIPickerView.他们的使用方法和相关属性 ...
- React Native 组件之TextInput
React Native 组件之TextInput类似于iOS中的UITextView或者UITextField,是作为一个文字输入的组件,下面的TextInput的用法和相关属性. /** * Sa ...
- react native组件的生命周期
react native组件的生命周期 一.当页面第一次加载时,会依次调用: constructor() componentWillMount(): 这个函数调用时机是在组件创建,并初始化了状态之后, ...
- react native组件的创建
react native组件的创建 react文件加载顺序: react项目启动后,先加载index.js.在index.js中可以指向首页. import { AppRegistry } from ...
- React Native组件(三)Text组件解析
相关文章 React Native探索系列 React Native组件系列 前言 此前介绍了最基本的View组件,接下来就是最常用的Text组件,对于Text组件的一些常用属性,这篇文章会给出简单的 ...
- React Native组件(二)View组件解析
相关文章 React Native探索系列 React Native组件系列 前言 了解了RN的组件的生命周期后,我们接着来学习RN的具体的组件.View组件是最基本的组件,也是首先要掌握的组件,这一 ...
- Android React Native组件的生命周期及回调函数
熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开 ...
随机推荐
- spring cloud深入学习(二)-----服务注册中心spring cloud eureka
服务治理 主要用来实现各个微服务实例的自动化注册与发现,为啥需要这玩意呢?在一开始比如A系统调用B服务,可能通过手工维护B服务的实例,并且还得采用负载均衡等方式,这些全部都得需要手工维护,等后面系统越 ...
- 直接在安装了redis的Linux机器上操作redis数据存储类型--对Sorted-Sets操作
一.概述: Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score ...
- 锋利的jQuery学习笔记之jQuery选择器
在介绍jQuery选择器之前,先简单介绍一下CSS选择器---> 一.CSS选择器 常见的CSS选择器有以下几种: 选择器 语法 描述 示例 标签选择器 E{CSS规则} 以文档元素为选择符 t ...
- gitlab上fork别人的代码后更新的2种解决方式
1.解决方式1 首先要先确定一下是否建立了主repo的远程源: git remote -v如果里面只能看到你自己的两个源(fetch 和 push),那就需要添加主repo的源: git remote ...
- 2019.10.20 csp-s模拟测试 lrd试题 反思总结
赶进度赶进度,丢个代码两三句备注一下完事了. day1: 前面两道题没实际写代码怕印象不深所以描述一下大意. T1: 题目大意:给出两个数&.|.^的结果(可能只给出其中某一项或者某两项),求 ...
- 2019.9.18 csp-s模拟测试46 反思总结
神志不清: 回去休息(x)继续考试(√) 非常爆炸的一次考试.看错题码完T1回去再看发现自己过于幼稚,T2读完题看着16mb的空间秒出正解然后逻辑出现致命失误100pts->0pts,T3看了一 ...
- mysql8下载安装及配置
mysql8下载和安装 一.下载 官网地址:https://dev.mysql.com/downloads/mysql/8.0.html 选择“downloads”-->"mysql ...
- Laravel 使用 JWT 做 API 认证之tymon/jwt-auth 1.0.0-beta.1实践 - moell - SegmentFault
安装 将"tymon/jwt-auth": "1.0.0-beta.1" 添加到 composer.json 中,执行 composer update Prov ...
- java简单jdbc查询操作
所采用的mysql的数据库驱动版本:5.0.8 mysql-connector-java-5.0.8-bin.jar 程序结构图: 表结构: 创表sql: Create Table CREATE TA ...
- HR招聘_(五)_招聘方法论(电话邀约)
.主动候选人 这部分候选人通过职位广告直接投递,大多对公司意愿度高(排除少数海投候选人),所以电话中一般需要了解如下信息: 目前状态,在职还是离职: 离职原因以及真实诉求: 岗位职责和团队情况: 薪资 ...