博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React Native填坑之旅--Button篇
阅读量:6464 次
发布时间:2019-06-23

本文共 3387 字,大约阅读时间需要 11 分钟。

从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 (
{
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')}, ] ) } }>
Button
); }}

效果就是这样的:

800

点击以后是这样的:

800

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

填坑

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

样式

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

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

应用这个样式:

{ 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}>
Button

看起来就是这样了。

800

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

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

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

按下,hold住

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

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

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

{ // 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})}}>
Button

完毕

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

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!
本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/5906421.html
,如需转载请自行联系原作者
你可能感兴趣的文章
Java内部类总结
查看>>
NeHe OpenGL第二课:多边形
查看>>
让WP7下复杂列表选项生动起来
查看>>
WINFORM WPF字体颜色相互转换
查看>>
能力不是仅靠原始积累(三)
查看>>
实战:使用终端服务网关访问终端服务
查看>>
彻底学会使用epoll(一)——ET模式实现分析
查看>>
路由器的密码恢复
查看>>
Samba日志分析
查看>>
【Android 基础】Android中全屏或者取消标题栏
查看>>
R语言学习笔记:分析学生的考试成绩
查看>>
uploadfy 常见问题收集
查看>>
[转]OllyDBG 入门系列(三)-函数参考
查看>>
EXTJS学习系列提高篇:第二十篇(转载)作者殷良胜,ext2.2打造全新功能grid系列--批量删除篇...
查看>>
Gradle动态配置项目
查看>>
VUE2.0从零开始 学习路线
查看>>
Slog61_NodejsGUI之Electron模块的安装和测试
查看>>
phoneGap iOS插件开发(二)插件自动安装配置
查看>>
撩课大前端-面试宝典-第十五篇
查看>>
学编程有什么用
查看>>