从React过来,发现React Native(以下简称RN)居然没有Button。隔壁的iOS是有UIButton的,隔壁的隔壁的Android里也是有的。没有Button,就没有点击效果啊。这还真是让人郁闷了。

坑

什么叫Button。略去各种细节可以得出一个定义:可以处理用户点击,在用户按下的时候有按下的效果,松开之后立即回复到原来的效果上。

在React里,可以使用直接使用HTML的元素。比如,<button />或者<input type="button" value="button" />。但是,在RN里是没有类似标签直接作为Button使用的。

发现

于是乎找了找RN官网的文档,发现了一个可以处理点击的TouchableHighlight。具体可以看这里。

既然可以处理点击就实现了Button很大的一个功能点了。动手实现一个:

import React from 'react';
import {
TouchableHighlight,
Text,
Alert
} from 'react-native'; export default class TouchableButton extends React.Component {
render() {
return (
<TouchableHighlight onPress={
()=> {
Alert.alert(
`你点击了按钮`,
'Hello World!',
[
{text: '以后再说', onPress: () => console.log('Ask me later pressed')},
{text: '取消', onPress: () => console.log('Cancel Pressed'), style: 'cancel'},
{text: '确定', onPress: () => console.log('OK Pressed')},
]
)
}
}>
<Text>Button</Text>
</TouchableHighlight>
);
}
}

效果就是这样的:

点击以后是这样的:

目前这个按钮只可以被称为是一个可以点击的Label。如果你保持按下的手势,不会有任何的变化。

填坑

我们的目标就是让按钮在按下的时候让用户知道他按钮处在按下的状态。

样式

但是,在这之前需要让用户知道这个按钮在哪里,范围是多大。这就需要样式出马了。React可以使用HTML的CSS样式,但是推荐使用的是自包含(self-contain)的样式。正好这个推荐的方式也是React-Native支持的。

const styles = StyleSheet.create({
button: {
padding: 10,
borderColor: 'blue',
borderWidth: 1,
borderRadius: 5
},
});

应用这个样式:

    <TouchableHighlight onPress={
()=> {
Alert.alert(
`你点击了按钮`,
'Hello World!',
[
{text: '以后再说', onPress: () => console.log('Ask me later pressed')},
{text: '取消', onPress: () => console.log('Cancel Pressed'), style: 'cancel'},
{text: '确定', onPress: () => console.log('OK Pressed')},
]
)
}
+ } style={styles.button}>
<Text>Button</Text>
</TouchableHighlight>

看起来就是这样了。

Style果然是很好用啊,来看看这些样式都实现了什么。

        padding: 10,
borderColor: 'blue',
borderWidth: 1,
borderRadius: 5

padding就不用说了。其他的就是画了边框,边框的宽为1px,颜色是蓝色,最后指定了圆角。

按下,hold住

如何区分什么时候是按下的,什么时候是按下松开的这就提上日程了。

处理这个问题需要请出React的State了。默认状态State是未按下(pressed为false),按下了改为pressed为true。就酱。

这需要用到TouchableHighlight的两个事件onShowUnderlay按下调用和onHideUnderlay,这个在按下松开后调用。 在这两个事件发生的时候修改state, 这样就会触发整个组件重绘。

    <TouchableHighlight onPress={
()=> {
// Alert.alert(
// `你点击了按钮`,
// 'Hello World!',
// [
// {text: '以后再说', onPress: () => console.log('Ask me later pressed')},
// {text: '取消', onPress: () => console.log('Cancel Pressed'), style: 'cancel'},
// {text: '确定', onPress: () => console.log('OK Pressed')},
// ]
// )
}
+ } style={[styles.button, this.state.pressed ? {backgroundColor: 'green'} : {}]}
+ onHideUnderlay={()=>{this.setState({pressed: false})}}
+ onShowUnderlay={()=>{this.setState({pressed: true})}}>
<Text>Button</Text>
</TouchableHighlight>

完毕

这样实现出来之后Android和iOS都可以用。多省事儿,而且这样的定制并不费事。

React Native填坑之旅--Button篇的更多相关文章

  1. React Native填坑之旅--Flow篇(番外)

    flow不是React Native必会的技能,但是作为正式的产品开发优势很有必要掌握的技能之一.所以,算是RN填坑之旅系列的番外篇. Flow是一个静态的检查类型检查工具,设计之初的目的就是为了可以 ...

  2. React Native填坑之旅--布局篇

    代码在这里: https://github.com/future-challenger/petshop/tree/master/client/petshop/src/controller 回头看看RN ...

  3. React Native填坑之旅--Navigation篇

    React Native的导航有两种,一种是iOS和Android通用的叫做Navigator,一种是支持iOS的叫做NavigatorIOS.我们这里只讨论通用的Navigator.会了Naviga ...

  4. React Native填坑之旅--ListView篇

    列表显示数据,基本什么应用都是必须.今天就来从浅到深的看看React Native的ListView怎么使用.笔者写作的时候RN版本是0.34. 最简单的 //@flow import React f ...

  5. React Native填坑之旅--LayoutAnimation篇

    比较精细的动画可以用Animated来控制.但是,在一些简单的界面切换.更新的时候所做的动画里再去计算开始值.结束值和插值器如何运作绝对是浪费时间. RN正好给我们提供了LayoutAnimation ...

  6. React Native填坑之旅--与Native通信之iOS篇

    终于开始新一篇的填坑之旅了.RN厉害的一个地方就是RN可以和Native组件通信.这个Native组件包括native的库和自定义视图,我们今天主要设计的内容是native库方面的只是.自定义视图的使 ...

  7. React Native填坑之旅--组件生命周期

    这次我们来填React Native生命周期的坑.这一点非常重要,需要有一个清晰的认识.如果你了解Android或者iOS的话,你会非常熟悉我们今天要说的的内容. 基本上一个React Native的 ...

  8. React Native填坑之旅--重新认识RN

    如同黑夜里的一道光一样,就这么知道了F8. F8是每年一次Facebook每年一次的开发者大会.每次大会都会release相应的APP,iOS.Android都有.之前都是用Native开发的,但是2 ...

  9. React Native填坑之旅--动画

    动画是提高用户体验不可缺少的一个元素.恰如其分的动画可以让用户更明确的感知当前的操作是什么. 无疑在使用React Native开发应用的时候也需要动画.这就需要知道RN都给我们提供了那些动画,和每个 ...

随机推荐

  1. Uart的Verilog建模

    开发工具:Quartus II 9.1: 仿真软件:Questa Sim 10.0c: 硬件平台:Terasic DE2-115(EP2C35F672C6): 外设:MAX3232: 3个工程文件:& ...

  2. activeamq启动失败

    启动activeamq,启动时控制台显示: INFO: Using java '/usr/bin/java'INFO: Starting - inspect logfiles specified in ...

  3. lua 高级

    io操作: io.input(filename):指定一个输入流,可以是标准输入stdin,也可以是一个文件路径,返回一个文件句柄: io.output(filename):指定一个输出流,可以是标准 ...

  4. 修改安全策略组 -- windows

    1.新建安全策略组文件SAMTool.inf md C:\SAMLog & echo [Version] >C:\SAMLog\SAMTool.inf &echo signatu ...

  5. noip2007解题报告

    T1.统计数字 给出n个数,统计每个数字出现的个数. n小,快排解决. T2.字符串的展开 给出一个字符串,其中形如 d-h,4-9之类的就展开,(前面比后面小的保留,相等也是),三个参数,P1表示大 ...

  6. Xshell

    http://baike.baidu.com/link?url=5lc5IxVVauitYSbqlOXJBvrvM3qVfMhzz6x_xu2cOMb108Ln9Wk7iJ3f46vG0kBninKw ...

  7. LINUX内核分析第七周学习总结:可执行程序的装载

    LINUX内核分析第七周学习总结:可执行程序的装载 韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  8. 同一web系统,不同端口的跨域问题

    部署web系统的时候,发现了跨域问题,子系统是用Iframe嵌入到系统里面的,导致父窗口获取子系统的webService和图片时发现跨域问题,如下图所示:问题1:父窗口获取子系统的对象跨域 原因:用这 ...

  9. [整理]PCB阻抗控制

    之前一直听说PCB设计中信号完整性及阻抗方面的要求,但是本人对此还是有很多的不了解,每次和别人讨论到这里后就不知道该怎么继续就这个问题交谈下去.正巧最近手头有一点工作有这方面的一些需求,就拿来花了一点 ...

  10. AsyncTask异步加载和Gson

    public class MainActivity extends Activity {    private List<Goods> goods=new ArrayList<Goo ...