·

给Web开发者写的React Native简介,React Native与React的区别与对比(2)

发布时间:2025-03-14 19:01:49阅读量:132
转载请注明来源

本文我们继续之前的话题给Web开发者写的React Native简介,React Native与React的区别与对比(1),在上文中我们讲到在React Native想要写<p>或者<span>需要用Text组件。除了展示文本,还有一个很重要的东西就是展示图片。在React Native中你无法使用HTML的<img>,而要用React Native提供的Image组件。

处理图片可以说是React Native中的一个难点,因为在React Native中无论是什么图片都需要你设置一个宽度和高度,见实例:

import React from 'react';
import {Image} from 'react-native';
import {SafeAreaView, SafeAreaProvider} from 'react-native-safe-area-context';

const DisplayAnImage = () => (
  <SafeAreaProvider>
    <SafeAreaView style={styles.container}>
      <Image
        style={{ width: 50, height: 50 }}
        source={require('@expo/snack-static/react-native-logo.png')}
      />
      <Image
        style={{ width: 50, height: 50 }}
        source={{
          uri: 'https://reactnative.dev/img/tiny_logo.png',
        }}
      />
      <Image
        style={{ width: 66, height: 58 }}
        source={{
          uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAAEXRFWHRTb2Z0d2FyZQBwbmdjcnVzaEB1SfMAAABQSURBVGje7dSxCQBACARB+2/ab8BEeQNhFi6WSYzYLYudDQYGBgYGBgYGBgYGBgYGBgZmcvDqYGBgmhivGQYGBgYGBgYGBgYGBgYGBgbmQw+P/eMrC5UTVAAAAABJRU5ErkJggg==',
        }}
      />
    </SafeAreaView>
  </SafeAreaProvider>
);

export default DisplayAnImage;

你不能像在Web端那样直接写个width: 100%就完事了,由于React Native并不会计算图片的高度,所以如果你没有给高度设置一个数值,那么图片将会不可见。因此,在React Native想要实现Web端里width: 100%; height: 100%的图片,就需要你动态计算每张图片的高度(宽度固定)。好在React Native提供了getSize() API,允许你得到每张图片的原始宽度和高度,你可以根据自己的需要用这个API来造轮子。

图片除了宽度和高度两个重要属性,还有一个很重要的属性就是resizeMode,这个对应Web端CSS的object-fit。而跟Web端不同,resizeMode的取值并非跟object-fit一一对应,并且resizeMode的默认值是cover,即图片会自动裁剪以保持宽高比。

除了使用React Native本身的Image组件,你也可以使用expo-image,或者react-native-fast-image。不过fast-image已经没有维护了,倒是有个fork这个库的有维护,有需要的可以自行寻找。

说完Image,还有一个很重要的东西就是列表List了。在Web端只要你的内容超出了屏幕高度,那么滚动是很自然的事情。但是在React Native仅仅使用View组件是不能滚动的,内容超出屏幕高度的结果就是内容不可见,想要滚动就需要用到ScrollView。而ScrollView提供了大量的API,可以让你非常方便的设置需要跟滚动相关的东西,这跟Web端相比是一个优势。

比如说实现无限滚动,在Web端你要么使用别的组件,要么自己实现,实现方法大多都比较复杂,不仅要监听滚动,还要考虑很多其他东西。而在React Native你只需要将相应的handler放到onEndReached这个prop里,当滚动到底部时就会自动执行一次你的handler。又比如监听滚动,在Web端你需要在页面挂载时添加监听器,然后在页面卸载时去掉监听器,而在React Native你只需要直接将handler放到onScroll这个prop里就可以了。见下面例子:

const App = () => {
    
    function load_more(){
        console.log('end!')
    }
    
    function ScrollHandler(e){
        console.log(e)
    }

    return (
      <SafeAreaProvider>
        <SafeAreaView style={styles.container} edges={['top']}>
          <ScrollView style={styles.scrollView} 
          onEndReached={load_more} 
          onScroll={ScrollHandler}>
            <Text style={styles.text}>
                Long Text......
                Long Text......
                Long Text......
                Long Text......
                Long Text......
                Long Text......
                Long Text......
                Long Text......

            </Text>
          </ScrollView>
        </SafeAreaView>
      </SafeAreaProvider>
    );
}

除此之外,你还可以设置水平滚动,甚至水平换页实现走马灯效果。ScrollView只是List最简单的一种方式,它会一次性渲染所有子节点,因此性能不好。这时,FlatListSectionList就派上用场了,他们继承了ScrollView的几乎所有特征,并且性能更好。而FlatList是其中使用率最高的,它提供了numColumns属性,允许你轻松构建网格布局。

而除了React Native本身提供的组件,对于大数据列表,你还可以使用第三方库FlashList或者RecyclerListView,来替代FlatList获得更好的性能。值得一提的是,FlashList除了是高性能列表,还提供了瀑布流布局的列表组件MasonryFlashList

说完列表,我们来讲一下React Native的触碰事件。在React Native你不能像在React Web端那样,随便一个地方都能设置onClick。并且React Native只有Press事件,你需要在特定的组件如TouchablePressableTextButton才能处理Press事件。其中Touchable组件分为TouchableHighlightTouchableOpacityTouchableWithoutFeedback,顾名思义他们分别对应触碰高亮、触碰改变透明度、触碰无反馈(触碰不改变样式)。而Press事件在PressableText又分为Press和LongPress。

<Pressable onPress={onPressFunction} onLongPress={onLongPressFunction}>
  <Text>I'm pressable!</Text>
</Pressable>

最后,想要写按钮和输入框,需要ButtonTextInput组件,React Native的按钮自带样式比HTML的按钮要好看,并且安卓版点击按钮自带波纹效果。而React Native的输入框使用体验跟Web端的大体一样,就是提供props有些不同,这里就不多说了。

本文到这里,已经将React Native跟React的主要区别过一遍了。由于篇幅问题,更多的内容以及细节就不详细展开了。之后我还会更更多React Native相关的文章,如果你对React Native感兴趣,欢迎在评论区交流讨论。

0 人喜欢

评论区

暂无评论,来发布第一条评论吧!

弦圈热门内容

有兄弟知道李代数那本书比较好吗

目前在做机器人,想学习李代数的知识咨询一下各位大佬

数学圈小众中的小众

运营弦圈这么长时间,我终于发现一个事实就是:小众圈子千千万万,而数学圈则是小众中的小众,才是真正的小众😎!对于这句话是不是有种熟悉的感觉:20世纪代数几何天才很多,但上帝只有Grothendieck一个。😇由于目前弦圈的人气比较低,并且经过我多次艰难的尝试,效果都挺一般,短期内看这个问题应该不太能改善。毕竟我只是个没钱没人脉的普通人,唯有一腔热血😅。但这不影响我的决心和计划,我想要给弦圈引入更多的小众圈子,让大家能够鉴赏更多的小众文化,这种理念是来源于数学的。在我看来,数学是包容的,能够将宇宙万物都融入其内,因此数学文化是开明的,能够跟无数其他文化相互交织,从而碰撞出火花。在是否存在人类大脑永远无法理解的数学结构?这篇文章中,我曾提到宇宙能否完全被数学所解释是一个理念之争,而我所持的观点即是爱因斯坦的那种,所有的一切都能被简洁、美妙、优雅的数学所描述。在了解了很多的圈子,尤其是小众圈子,以及跟不少数学圈外的人交流后,我才发现似乎很难找个一个比数学圈更小众的圈子。大家都说数学+学术实在是太小众了。在我这个沉浸于数学圈多年的人看来,很多其他所谓的小众圈子一点都不小众,比如说二次元圈、铁路迷 ...

如果中国拿了菲尔兹奖,那中国是不是可以算作数学强国了?

我的回答:如果中国有持续培养纯本土菲尔兹奖得主的能力,那么才可算作数学强国。这东西都得谈可持续性,不能因为个别一两个华人拿了菲尔兹奖就觉得很厉害了。现在中国很多杰出的年轻一辈数学家,都是接受过海外教育的,或者在海外任职的,证明中国数学界还脱离不了国外的培养体系。一个中国国籍的学者经过国外的教育后得到菲尔兹奖,与一个华裔学者在国外得到菲尔兹奖,除了能够满足民族自信心外,没多大区别。Yuhang Liu的回答:等中国自己建设的数学期刊进入中科院自己评的一区再说吧。我不记得中国科学-数学是不是一区,别的应该都不是。这也不是什么不合理的要求。Annals 本来也就相当于普林的一个校刊而已。你有足够多学术地位受认可的编辑,然后华人数学家把自己的大作品都往这上面投,学术地位高了,自然国外的牛人也会往中国的期刊投稿。若是连这一步都不敢想象,也不必谈数学强国了。家里蹲大学的回答:谢邀,你是想说最近王虹解决三维Fakeya猜想的工作吗?即使拿了,我也不觉得这么认为,如果一枚菲尔茨奖章就作为数学强国,我想 巴西,越南,韩国,都可以算作数学强国了。如果有一天,本土(所有教育都在国内完成)真的出现了获得菲尔茨 ...

中国教育最大的成功在哪里?谈谈中国教育的优点

珑霖君的回答:清华大学,计算机水平,2018年最新数据,世界第一。一年5000元,四年20000元,相当于3100美元。走绿色通道,学费毕业后再交。去不发达地区就业,学费全免。我堂妹美国加州大学洛杉矶分校,读计算机,一年70000美元,四年280000美元,相当于176万人民币。排名还不如清华大学。二叔的家庭在美国属于中产偏上了,面对这笔巨款也是卖了国内的房才能支付。就这点,我真心觉得中国教育在给寒门学子留出路。数据来源:2018年全球最佳大学排行榜:清华大学计算机专业排名全球第一刚一天就10K的赞,吓尿。————————鉴于答案很火,也跑个题,说两句这种低廉教育的弊端,就是对个人的严重不尊重。我国教育是一种低成本的“工业化”教育,一个班里多个学生的成本也仅仅是多套桌椅,目的是最大程度普及教育,保障尽量多人的受教育权。但是也很容易把所有人培养成一模一样的人,并且充满了粗暴的强制性,我有时候觉得中国的教育根本就不是教育,而是一种强硬的规训。加上我国的这种集体主义,对部分人很摧残。比如我这种很自我的人,极其厌恶这种教育方式,也导致了我对于集体的严重反感。这让我小学和中学这12年很痛苦,到了 ...

国内的教育体系已崩溃?如何客观地看待中国应试教育?

NIO倒闭了嘛的回答:国内的教育体系趁着2024年的就业市场反馈已经崩盘了,大部分人大四和硕士期间的实习日薪还没现在补课的时薪高。绝大部分人读十几年书不如去学捏十年寿司,现在想靠卷高考翻身就跟1900年梭哈科举差不多了。十年前大家只是调侃一下文编理润,但那时候二本靠谱点的考编都是一次上岸,区别就是上哪里的。二本理科读个江苏大学,上海理工这种级别的硕士,三十岁也能混到三十万的年薪。江苏大学和上海理工进个上汽泛亚校招22W当年是有手就行,有点实力的应届生都能拿到30+的年薪。2024年的行情大致就是,高中本科硕士十年的培训完的80%的人时薪是干不过隔壁日本的零工。而且大部分工科硕士的就业环境真比便利店差远了。便利店至少不会爆炸和时不时冒出来一个工伤,也没什么难闻的气味和可吸入粉尘。而文科方面,十几年前大家印象还是硕士还来银行?24年是双非硕士还敢投我们银行的简历?除了编制外,文科整体就业就靠新东方一类的第三产业挽尊,去个新东方还能看见落地玻璃和高楼,不用面对奇奇怪怪的人。而其他招文科的制造业普遍都是杵在车间隔壁开个四五千的月薪,时不时要面对一下油腻领导的骚扰。而现在广告,传媒,游戏,留学这 ...

为何似乎中国大学教育那么烂,却在科技上看似大有成就?

体制老司机​的回答:中国的教育没那么烂。杨振宁对中国教育讲过一段话,大意是:中国的教育模式,对大多数90分以下的学生,是非常好的,能让这些学生更快地成材。美国的基础教育太过注重个性发展,非常的松散,如果不是很优秀的孩子,在美国的教育环境里,容易放任自我,养成一些不良习性。而本身很优秀的孩子,也就是90分以上的孩子,在美国的教育环境里面,反而能够发挥出自己的特长,取得人生的成功。杨振宁这段话比较委婉地批评了,中国的教育,对于那些最优秀的孩子成长,是不利的,对这些人还是不够尊重其个性和自由。所以,中国的教育,能培养出世界上数量最多的基本素质不错的产业工人,也能培养出世界上最多的工程师等中高端人才。但是,中国在最最顶尖的人才教育培养上,和美国等西方最先进的国家相比,还是有明显的差距的。因此,中国的制造业全世界第一,电子产品、玩具服装,以及什么高楼大厦、铁路公路、大水坝等基建工程建设,大型机械等等,都是世界数一数二的。但毫无疑问,在非常基础的科学研究方面,比如物理、化学、数学等等,和英美差距还是较大。在非常尖端的技术上,也有很大的差距。比如说光刻机、芯片、材料等等。杰克马也讲过一段话,大致意思 ...

关于中国教育的根本问题

关于中国教育的根本问题。还是听听两个外国人的一针见血。给大家介绍两个德国人。第一个,名叫西洛特,最近因对中国教育的一番控诉刷爆了中国的互联网。他在苏州一所私立学校当外教,一干就是八年,但春节前,他离职回国了。他是带着挫败感离开的,他说:“我一辈子也无法在中国看到真正的教育!”他在中国看到4岁的孩子背诵拼音,5岁的孩子做加减法。而在德国,8岁的孩子只需要会播种,栽花,除草。从幼儿园起,中国的学生就不断被灌输政治教育,这些对几岁甚至十几岁的孩子来说,简直是天书,就连很多政治老师也搞不懂,这些教育的功能只是为了应付试卷上的标准答案,别无用处,大多数学生的学习目标也是短暂的——为了考试。与此同时,人性教育、逻辑教育却是空白。人性是人格的基础,缺乏人性体验和认识的人,又怎么形成健全的人格呢,连健全的人格都没有,又拿什么爱自己,爱家人,爱社会呢?西洛特还认为,中国教育的扭曲还体现在安全教育方面。很多学校实行的是无缝对接管理,从学生进门到出校门,每一分每一秒都有老师看着,下一个老师不到,上一个老师不能离开。就像看管羊圈一样。放学时,离学校不足50米的地方,是密密麻麻的家长及形形色色的车辆。孩子到家后 ...

弦圈如何完成新手任务和每日任务 - 任务中心介绍

在弦圈你可以完成新手任务和每日任务,然后获得任务奖励。如何进入任务中心界面呢?首先进入个人中心接着在左侧菜单栏,点击任务中心这时我们就能看到新手任务和每日打卡任务。新手任务,顾名思义是给刚注册弦圈的用户准备的一次性任务,目的是让他快速熟悉弦圈的各个功能和板块。每日打卡任务,就是每天都可以完成一次的任务,希望能够给弦圈的用户一种真实的成长的感觉,让大家使用弦圈能够有更多的正反馈。需要注意的是,新手任务完成后,需要前往任务中心领取奖励,而每日任务完成后,奖励会自动发放,无需每次都前往任务中心。

读完了大学依然是社会的底层,那读书的意义是什么呢?

从小学开始到大学毕业,整整16年,读书可以说贯穿了我们每一个人最青春的时候。然而相信很多人都大学以后都会感悟到,自己回学校读书仅仅只是为了一个毕业证,平时要辛辛苦苦的上课,完成各种作业以及学校的要求。结果最后有用的东西没学到多少,时间却浪费在了诸多琐事当中,详细见 中国当前的教育最缺少什么?于是我们不经会想,既然读完书还是底层,还得受社会的毒打,那还读书来干嘛,不如早早的进社会赚取?其实读书对于普通人,尤其是我们底层人而言,好歹也算是条相对公平,且看得到头的出路。对于底层人来说,相对于搞科研、创业、投资等其他出路,读书风险较低、且付出努力能有一定收益。你想想看,如今很多人都觉得读书努力不一定有回报,那更何况其他的出路,风险更是直线上升,所有付出打水漂都算轻的了。除了是一条出路,读书也是教育的一种方式,能让你学习并掌握未来工作生活所需要的某些技能,这无疑有利于你毕业之后的就业问题(虽然学校在培养工作技能方面差强人意)。而且在学校也意味着有很多可能,你可以利用学校的资源去完成一些单独个人完成不了的事情,比如说现在很火的AI大模型,训练一次模型,单单是买GPU就不知道得花多少钱,而且还需要有 ...