微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React Native填坑之旅--Button篇

从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(
                `你点击了按钮`,[
                    {text: '以后再说',]
            )
        }
   + } style={styles.button}>
        <Text>Button</Text>
    </TouchableHighlight>

看起来就是这样了。

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

padding: 10,borderRadius: 5

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

按下,hold住

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

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

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

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

完毕

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...