比较HTML元素和Native组件的区别

时间:2021-12-24 22:14:16

我们开发web应用,会使用到各种Html基本元素,比较<div>,<span>,<img>等。

当我们在开发React Native时,我们不能使用HTML元素,但是我们可以使用各种组件类似如图:

HTML React Native
div View
img Image
span,p Text

虽然这些元素有很多类似的用途,但是他们是不可以等同的。让我们来下这些组件是如何在移动端运行的,

1、文本组件

渲染文本看似是一个基本功能,几乎任何应用都需要渲染文本。然而,它却不同于一般的Web的Text渲染方式。

在React Native中,只有<Text>组件能作为纯文本的子节点,换句话说,这样是无效的:

<View>

文本不能放在这里

</View>

反之,使用<Text>组件将文本内容包起来:

<View>

<Text></Text>

</View>

在React Native中,在你处理<Text>组件时,你将不需要使用子标签列如:<strong>和<em>,不过你可以应用样式来实现类似的效果,通过使用属性如 fontWeight 和fontStyle.下面使用到了内联样式来实现类似的效果:

<Text>

The quick <Text style={{fontStyle:"italic"}}>brown</Text>
fox jumped over the lazy<Text style={{fontWeight:"bold"}}>dog</Text> </Text>

上面这种写法,可能看起来非常冗余。我们可以创建样式组件来处理文本,就像下面这样:

var styles=StyleSheet.create({

bold:{fontWeight:"bold"},

italic:{fontStyle:"italic"}

});

 var Strong=React.createClass({

render:function(){

return(

<Text style={styles.bold}>

{this.props.children}

</Text>);

}

});

上面就创建了可重用的文本样式。一旦你申明了这些样式组件,你就可以*的嵌套样式。

2、图片组件

如果在一个应用中,文本是一个最基本的元素,那么图像在在移动端和Web端也是最重要的元素之一。在Web中,我们可以写HTML和CSS等。在React Native中,我们使用<Image>组件,但是它展示的有所不同。

<Image>基本组件的用法很简单,仅仅需要设置source属性:

<Image source={require('image!puppies')}/>

但是Require方法是如何工作的呢?这些资源是在放在那里呢?

二、使用触摸和手势

基于web的接口通常为鼠标控制设计,我们使用诸如悬停来与用户交互,对于手机,这是触摸的事件。您将要设计的移动平台都有自己的规范

和标准,不同的平台有些不同,如:Android平台和IOS平台的方式就有所不同。

React Native 提供了一系列API来帮助你构建界面。在这章节中,我们将看看<TouchableHighlight>容器组件,

作为一个低级API提供构建一个手势响应系统。

2.2使用TouchableHighlight

用户触摸做出响应的任何界面元素(如 按钮,控制元素等)通常需要使用<TouchableHighlight>来包装,视图被点击,<TouchableHighlight>会触发一个遮罩层,来给用户以反馈。这样会使一个移动应用更接近于原生,而不是为了移动设备而优化的网站。根据一般的经验,你使用<TouchableHighlight>的地方会有一个按钮或者链接。

最基本的用法,你只需要在<TouchableHighlight>包装组件,按下时会新增一个简单遮罩。<TouchableHighlight>组件也提供一些事件如:onPressIn,onPressOut,onLongPress等等,所以在React应用中你可以使用这些事件。

下面这个列子就像我们展示如何在一个<TouchableHighlight>中包装一个组件来给用户反馈:

<TouchableHighlight

onPressIn={this._onPressIn}

onPressOut={this._onPressOut}

style={styles.touchable}>
<View style={styles.button}> <Text style={styles.welcome}> {this.state.pressing?'EEK':'PUSH ME'} </Text> </View> </TouchableHighlight>

当用户点击该按钮,会出现一个遮罩层,并且文本内容改变。如下图:

比较HTML元素和Native组件的区别

这仅仅是一个列子,但是它说明了一个基本的交互,使一个按钮上的感觉像一个可触摸的手机。遮罩层是一个反馈的关键部分,当一个元素被按下,会通知该用户。请注意为了应用这种遮罩,我们不要任何逻辑应用到我们的样式,<TouchableHighlight>会帮我们处理这些逻辑代码。完整的代码如下图:

touchButton.js

var React=require('react-native');
var{StyleSheet,
Text,
View,
TouchableHighlight}=React;
var myButton=React.createClass({
//初始化基本变量
getInitialState:function(){
return{
pressing:false
}
},
_onPressIn:function(){
this.setState({pressing:true});
},
_onPressOut:function(){
this.setState({pressing:false});
},
render:function(){
return(
<View style={styles.container}>
<TouchableHighlight
onPressIn={this._onPressIn}
onPressOut={this._onPressOut}
style={styles.touchable}>
<View style={styles.button}>
<Text style={styles.welcome}>
{this.state.pressing?'被点击了':'长按我'}
</Text>
</View>
</TouchableHighlight>
</View>
)
}
}); module.exports=myButton;
var styles=StyleSheet.create({
container:{
flex:1,
justifyContent:'center',
alignItems:'center',
backgroundColor:'#F5FCFF',
},
touchable:{
borderRadius:100
},
welcome:{
fontSize:20,
textAlign:'center',
margin:10,
color:'#FFFFFF'
},
button:{
backgroundColor:'#FF0000',
borderRadius:100,
height:200,
width:200,
justifyContent:'center'
}
});

index.android.js:

var React=require('react-native');

var{AppRegistry}=React;
//var reactNative=require('./reactNative');
//AppRegistry.registerComponent('reactNative',()=>reactNative); var myButton=require('./touchButton');
//mytouchTest一般指项目名称,myButton指需要的组件名称
AppRegistry.registerComponent('mytouchTest',()=>myButton);

 2.3.使用手势系统

如果你想做更多的事,而不仅仅是简单的点击。React Native也提供了2种自定义触摸事件:手势响应。

设计移动方面是相当复杂的,大多数平台提供多点触控,这就意味屏幕上在同一时刻可以点击多个触摸点。

这里,我们使用<TouchableHighlight>组件来处理触摸响应。我们也可以使自己的组件作为触摸处理,一个视图想要获得触摸响应状态必须实现下面4个属性:

View.props.onStartShouldSetResponder

View.props.onMoveShouldSetResponder

View.props.onResponderGrant

View.props.onResponderReject

上面调用过程通过下面的流程图来说明,

比较HTML元素和Native组件的区别

是的!上面看起来有些复杂,我们来梳理下这部分。首先,一个触摸事件主要有三个生命周期状态:开始(Start),拖动(move),释放(release)(这和浏览器里的鼠标按下,鼠标拖动和鼠标释放很相似)。

这些动作被定义在onStartShouldSetResponder和onMoveShouldSetResponder中。当其中一个函数返回true,视图就会尝试去得到应答器状态。

当视图获得了获得了应答器的状态,可能是失败,或成功的。他就会调用合适的回调函数可能是onResponderGrant或者onResponderReject。

这种判断函数执行的方法叫做冒泡模式。如果多视图要得到响应器状态,最底层组件将成为响应器。

比较HTML元素和Native组件的区别的更多相关文章

  1. 在Flutter中嵌入Native组件的正确姿势是&period;&period;&period;

    引言 在漫长的从Native向Flutter过渡的混合工程时期,要想平滑地过渡,在Flutter中使用Native中较为完善的控件会是一个很好的选择.本文希望向大家介绍AndroidView的使用方式 ...

  2. beeshell —— 开源的 React Native 组件库

    介绍 beeshell 是一个 React Native 应用的基础组件库,基于 0.53.3 版本,提供一整套开箱即用的高质量组件,包含 JavaScript(以下简称 JS)组件和复合组件(包含 ...

  3. react native组件的生命周期

    react native组件的生命周期 一.当页面第一次加载时,会依次调用: constructor() componentWillMount(): 这个函数调用时机是在组件创建,并初始化了状态之后, ...

  4. React Native组件(二)View组件解析

    相关文章 React Native探索系列 React Native组件系列 前言 了解了RN的组件的生命周期后,我们接着来学习RN的具体的组件.View组件是最基本的组件,也是首先要掌握的组件,这一 ...

  5. React Native组件(一)组件的生命周期

    相关文章 React Native探索系列 前言 React Native有很多组件比如Image.ListView等等,想要合理的使用组件,首先要先了解组件的生命周期. 1.概述 无论你是开发And ...

  6. Android React Native组件的生命周期及回调函数

    熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开 ...

  7. 【RN - 基础】之React Native组件的生命周期

    下图描述了React Native中组件的生命周期: 从上图中可以看到,React Native组件的生命周期可以分为初始化阶段.存在阶段和销毁阶段. 实例化阶段 实例化阶段是React Native ...

  8. React Native组件之Text

    React Native组件之Text相当于iOS中的UILabel. 其基本属性如下: /** * Sample React Native App * https://github.com/face ...

  9. React Native组件之Switch和Picker和Slide

    React Native组件Switch类似于iOS中的UISwitch:组件Slide类似于iOS中UIslider,组件Picker类似于iOS的UIPickerView.他们的使用方法和相关属性 ...

随机推荐

  1. js键盘事件

    弱鸡今天在写键盘事件,发生一个小bug,排查了1小时(">皿<)可恶的浏览器竟然还不报错!!原因是将e.ctrlKey写成了e.ctrLKey,o(゚Д゚)っ 想想都要生气&lt ...

  2. 深入浅出设计模式——单例模式(Singleton Pattern)

    模式动机对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号) ...

  3. CSS ID选择器&lpar;三&rpar;

    一.ID选择器 ID选择器使用"#"前缀标识符进行标识,后面紧跟指定的元素的ID名称. 如 #box{ width:100px; height:100px;} 元素的ID名称是唯一 ...

  4. db&colon;seed 更好的生成测试数据

    make:model -m -> 在database/migrations/目录下生成的table表中设置表的字段名和字段类型->在app/目录下对应的模型文件中设置可添加字段 -> ...

  5. Java程序猿学习当中各个阶段的建议

    回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议   引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的 ...

  6. 一个简单的freemark输入输出的案例(二)

    freemarker入门实例 1.设计思路 (1)新建Maven Project (2)生成freemarker模板 (3)写freemarker页面ftl文件 (4)写测试文件 2.新建Maven ...

  7. CF1110H Modest Substrings AC自动机、DP

    传送门 如果\(r-l\)比较小,可以将所有满足条件的串扔进\(AC\)自动机然后在上面DP,从前往后确定字符串的每一位. 但是\(l,r \leq 10^{800}\)就十分不可行,所以需要优化这个 ...

  8. 二级菜单&lpar;avalon&plus;jquery动画&rpar;

    by 司徒正美 var vm = avalon.define({ $id: "test", array: [ { name: 111111, child: [ {name: 1.1 ...

  9. mysql联表更新使用join

    update TableA  as a inner join TableB as b on a.order_id=b.order_id set a.last_time='2018-01-01' whe ...

  10. JQ的ready&lpar;&rpar;方法与window&period;onload&lpar;&rpar;的区别与联系

    JQ的ready()与window.onload()方法都是在文档加载完毕之后才会被触发的方法,但它们之间的区别也是很明显的. 1.区别与联系:   $(document).ready() windo ...