https://facebook.github.io/react-native/docs/direct-manipulation.html

  setNativeProps可以直接修改底层native组件的属性,不与React相关(state不会跟着同步),其他原生方法还有measure、measureLayout等

  有时候有必要去直接操作组件而不是通过state或者props来触发整颗组件树的刷新。如浏览器直接修改dom,类比到RN中,可以使用setNativeProps这个方法来直接修改dom

  当频繁地重新渲染导致性能瓶颈时才使用这个方法,这个方法不应该用太多,仅当需要创建持续的动画时使用。这个方法把状态保存到原生layer中而不是react组件中,这回导致代码更难理解,可以的话尽量使用setState和shouldComponentUpdate来解决。

  当被按下的时候,TouchableOpacity内部会通过setNativeProps来更新子组件的透明度,子组件不需要关心自己如何改变透明度

<TouchableOpacity onPress={this._handlePress}>
<View style={styles.button}>
<Text>Press me!</Text>
</View>
</TouchableOpacity>

  假设setNativeProps不可用,则实现的方式就是就是父组件要频繁调用setState来重新渲染子树,即使子组件没有发生变化。通常来说这不需要担忧,但是当我们要执行持续动画以及响应手势时,精确地优化组件可以提高动画的效果

应用场景1:混合组件

  setNativeProps(原生方法)只能用在RN的核心组件(被native支持)上,不能用在混合组件上。

class MyButton extends React.Component {
render() {
return (
<View>
<Text>{this.props.label}</Text>
</View>
)
}
} export default class App extends React.Component {
render() {
return (
<TouchableOpacity>
<MyButton label="Press me!" />
</TouchableOpacity>
)
}
}

  以上代码 运行会报错:“Touchable child must either be native or forward setNativeProps to a native component”。这是因为TouchableOpacity内部会获取自己的子组件,然后调用他们的setNativeProps来改变透明度,而MyButton不是核心组件不支持这个方法。解决办法就是使这个混合组件MyButton支持这个方法,就自己定义一个setNativeProps:

class MyButton extends React.Component {
setNativeProps = (nativeProps) => {
this._root.setNativeProps(nativeProps);
}
render() {
return (
<View ref={component => this._root = component} {...this.props}>
<Text>{this.props.label}</Text>
</View>
)
}
}

  可以发现上面有{...this.props},这是因为需要子组件去处理触摸事件,这handler就要来自于Touchable,相当于调用了父组件的方法。

应用场景2:清空输入

  对于受控的TextInput,当bufferDelay设置比较小而且用户输入比较快时,可能会丢失字符。所以一些开发者干脆直接使用setNativeProps来TextInput的值。以下清空值

export default class App extends React.Component {
clearText = () => {
this._textInput.setNativeProps({text: ''});
}
render() {
return (
<View style={{flex: 1}}>
<TextInput
ref={component => this._textInput = component}
style={{height: 50, flex: 1, marginHorizontal: 20, borderWidth: 1, borderColor: '#ccc'}}
/>
<TouchableOpacity onPress={this.clearText}>
<Text>Clear text</Text>
</TouchableOpacity>
</View>
);
}
}

  注意,这原生方法仅仅改变了原生组件上的值,RN中的state并没有发生变化,也不会触发这个TextInput上的onChange事件

RN原生方法setNativeProps的更多相关文章

  1. RN原生调用一:安卓Toast

    首先安卓原生方法:Toast.makeText(getApplicationContext(), "默认的Toast", Toast.LENGTH_SHORT); 在RN中js如何 ...

  2. RN原生的安卓UI组件

    https://facebook.github.io/react-native/docs/native-components-android.html 这里有一大堆的原生组件可以用,一些是平台自带的, ...

  3. 通过js调用android原生方法

    有时候我们有这样一个需求,监听html中控件的一些事件.例如点击html中某个按钮,跳转到别的activity,复制某段文本. 首先是对webview的设置: myWebView = (WebView ...

  4. 再探JS数组原生方法—没想到你是这样的数组

    最近作死又去做了一遍javascript-puzzlers上的44道变态题,这些题号称"JS语言专业八级"的水准,建议可以去试试,这里我不去解析这44道题了, ...

  5. 【转】3篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:官方原生方法分析

    作者: 牛A与牛C之间 时间: 2013-11-17 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第3篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  6. javascript 原生方法监听DOM结构改变事件

    js原生方法监听DOM结构改变事件 document.addEventListener('DOMNodeInserted',function(){alert(1)},false);document.a ...

  7. javacpp-opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(增加实时帧率计算方法)

    javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...

  8. JS 中 原生方法 (四) --- Object

    Javascript 中 str. arr.date.obj 等常见的原生方法总结 本文也说主要阐释了 Javascript 中的基础类型和 引用类型的自带方法,那么熟悉的同学又可以绕道了 总是绕道, ...

  9. JS 中 原生方法 (三) --- Date 日期

    本文也说主要阐释了 Javascript 中的基础类型和 引用类型的自带方法,那么熟悉的同学又可以绕道了 总是绕道,真是羞耻悳boy 当然 本文阐述的主要类容 from MDN ( zh-cn ) D ...

随机推荐

  1. 生产者消费者 java.util.concurrent.lock包

    package com.mozq.thread.producer2; import java.util.concurrent.locks.Condition; import java.util.con ...

  2. 给ACM newer的编程技巧

    一.复杂度 1.1什么是复杂度? 在设计满足问题要求的算法时,复杂度的估算是非常重要的.我们不可能把每个想到的算法实现一遍看看是否足够快.应当通过估计算法的复杂度来判断所想的算法是否足够高效. 1.2 ...

  3. Codeforces Round #497 (Div. 2)B. Turn the Rectangles

    Bryce1010模板 http://codeforces.com/contest/1008/problems #include <bits/stdc++.h> using namespa ...

  4. Metasploits之ms10_018

    漏洞详情:https://technet.microsoft.com/library/security/ms10-018 一准备: 1:kali Linux系统 192.168.195.129 2:W ...

  5. SecureCRT无法连接虚拟机Linux—虚拟网卡(NAT方式)IP(169.254.xx.xx)无效问题

    搞了一晚上,终于解决了http://blog.csdn.net/zengxianyang/article/details/50394809

  6. Hadoop启动datanode失败,clusterId有问题

    问题: 搭建伪Hadoop集群的时候,运行命令: hdfs namenode -format 格式化或者说初始化namenode. 然后用命令: start-dfs.sh 来启动hdfs时,jps发现 ...

  7. 开源GIS-对比GeoServer和MapServer

    1  主流组合: 基于C.C++系列的:Mapserver(服务器)+QGIS(桌面软件)+PostGIS(数据库)+Openlayers(JS)/ openscale (FLex)(浏览器客户端) ...

  8. 洛谷P4017 最大食物链计数

    拓扑排序板子题 #include <iostream> #include <cstdio> #include <cstring> #include <queu ...

  9. Spring MVC异常统一处理(包括普通请求异常以及ajax请求异常)

    通常SpringMVC对异常的配置都是返回某个jsp视图给用户,但是通过ajax方式发起请求,即使发生异常,前台也无法获得任何异常提示信息.因此需要对异常进行统一的处理,对于普通请求以及ajax请求的 ...

  10. Android学习总结(二)——Service基本概念和生命周期

    好了,前面我们已经学习了Activity的知识,相信大家也有一定的理解,但是还是不能放松,Android四大组件,我们才学习了一个而已,接下我们继续学习Service.计划总结如下内容: 一.Serv ...