接触过React的人应该都知道它是一个非常快的前端框架,或许也听说过shouldComponentUpdate可以让它更快。但你知不知道它们在什么情况下才能发挥作用?也就是说,你知道什么时候需要动手写shouldComponentUpdate方法吗?James指出,如果你在React
组件中写了shouldComponentUpdate方法后不能获得可
测量的,并且是可察觉到的性能提升,那就不要写。
你的意思是我不应该用它?按照React团队的说法,shouldComponentUpdate是保证性能的紧急出口,既然是紧急出口,那就意味着我们轻易用不到它。但既然有这样一个紧急出口,那说明有时候它还是很有必要的。所以我们要搞清楚到底什么时候才需要使用这个紧急出口。为了讲清楚这个问题,James对React的渲染机制做了深入地剖析。他首先指出:添加shouldComponentUpdate方法一般都会拖慢组件的更新速度。为什么会这样呢?因为在他看来,React基本上就是一个非常聪明的shouldComponentUpdate实现。它不仅知道应该在什么时候更新组件,还知道应该如何更新组件,并且这两件事情它都做得很好。那么React是如何知道是否应该更新组件的呢?这要从组件中的render方法说起。尽管在写代码时,我们看到render返回的都是JSX或者ReactElement,但实际上,它返回的都是下面这种普通的JavaScript对象:{type:'ul',props:{className:'what-do-you-want-to-do-tonight'},children:[{type:'li',children:'Thesamethingwedoeverynight,pinky'},]}React就是用这种对象来描述要在界面中渲染的标签。如果跟上次渲染时所用的对象比较,数据没有发生变化,显然就不用更新界面中的DOM。换句话说,React已经替我们实现了一个shouldComponentUpdate。为了简化,我们可以假装props不是绑在组件的this上的,而是直接传给了render,那么React的实现基本上就是下面这样的:shouldComponentUpdate(nextProps){return!deepEquals(render(thisprops),render(nextProps))}你是知道的,对于比较小的对象来说,deepEquals很快,但如果是个层层嵌套的大家伙,它的速度就不行了。因此我们可以得出第一条结论:如果render的返回值很小,但props是个大家伙,那自己写shouldComponentUpdate很可能不会带来什么好结果。那这是不是说,如果render返回的值足够大,我们自己写shouldComponentUpdate就会比较划算呢?实际上也不尽然。讲到这里,James又给出了他观察到的第二个事实:使用shouldComponentUpdate得到的收益一般是微乎其微的。他举了一个例子:比如要渲染一个table,我们从props中得到数据,然后又对这些数据做了些计算。并且这些数据都是放在Immutablejs的结构中的,因此通过比较引用是否相等就能判断出props是否发生了变化。在这样一个场景中,如果我们自己写shouldComponentUpdate,那速度要比React默认实现的处理速度快很多。James说他观察到的结果是最少快十倍!对,你没看错,他确实是这样说的,但他紧接着又说:不足一毫秒的渲染时间在速度提升了10倍之后,依然也还是不足一毫秒。嗯,我也觉得他这是在耍我们。James还搬出大神高德纳的那句名言来警告我们不要掉进过早优化的陷阱。为了引起足够的重视,他又指出了使用shouldComponentUpdate所引发的问题:shouldComponentUpdate很难维护React团队说shouldComponentUpdate是个紧急出口,而不是加速按钮应该就是出于这个原因。但James给出了一个更形象的比喻,他说用shouldComponentUpdate就是没有采取安全措施的性行为。因为他觉得有时候很有必要写shouldComponentUpdate,并且那些时候shouldComponentUpdate肯定会让你的app有更好的表现。但是这也是导致bug的主要原因之一,并且还都是一些不太容易察觉的bug。接着他又给出了几个具体的例子,并指出这些bug在测试中很难发现。如果在给客户演示的时候跳出来,那后果就不堪设想了。什么时候需要写shouldComponentUpdate?因此还是回到了最初的那个问题上,什么时候需要自己动手写shouldComponentUpdate方法?他再次重申了前文中给出的那个答案:只有经过测量,发现有了shouldComponentUpdate后组件的渲染速度确实有可察觉的提升,你才应该用它。James还在fiddle中给了一个例子,供我们练习如何测量,并比较使用shouldComponentUpdate前后的渲染速度。在开始测量之前先搞清楚如何在你的浏览器中打开分析器(如果你还不知道怎么做,Chrome请看这里,Firefox看这里)。测量的过程很简单:第一步:测量标准版先从点击一个动作时render所花的时间开始测量:在fiddle例子的窗口中打开JavaScript分析器。开始记录。点击"Togglesynergy!",让页面循环5秒钟左右。点击开始记录时点过的那个按钮,停止记录。按“self”时间排序,找到耗时最多的那个render方法,应该在列表的顶端附近。把它用的时长记下来,这里我们要的是“总时长”,即render本身所用的时间及它调用的函数所用的时间。如果在这个列表顶部没找到render,那么恭喜你!你完全没必要写shouldComponentUpdate,最起码在解决掉其他性能问题之前没必要。第二步:测量有shouldComponentUpdate的版本这一步是要测量给App组件添加了shouldComponentUpdate之后渲染所花的时间。下面有个提前准备好的实现,你可以把它加到组件中:shouldComponentUpdate(nextProps,nextState){return!Immutableis(thisstatesynergy,nextStatesynergy)},加好之后,按步骤一中的过程测量一遍。得到测量结果后,还要找到shouldComponentUpdate用的时间,然后加上去。应该差不多像下面这样:组件中有shouldComponentUpdate的render:shouldComponentUpdate:就是这样,测过之后你就能大概知道shouldComponentUpdate能带来什么样的好处了。注意这里说的是大概,因为这种方法得不到精确的结果。一定要记住,真实结果跟测量结果比可能会有很大的差异,不信你可以多试几次。做出决定既然测量结果不精确,那我们凭什么做出决定呢?要凭好得不容置疑的测量结果。那什么才算是好得不容置疑的结果呢?按照James的经验,如果加上shouldComponentUpdate之后渲染时间减少了一半,那用shouldComponentUpdate应该是真的对你有好处的。但同时也不要忘记,只有原来的渲染时间足够长时,这种性能上的提升才是有意义的。假如本来只用了100ms,那你折腾半天加快的那点速度人们依然是感觉不到的。所以在最终要做决定的时候,你要记住使用shouldComponentUpdate会带来维护上的挑战;并且测量结果是不准确的;而且性能改善的幅度还要是能感觉到的那种,只有记住这三点,你才能做出正确的决定。当然,这一切的前提是你的shouldComponentUpdate实现是没有问题的。写出有效的shouldComponentUpdate在经过不懈地努力找到应该使用shouldComponentUpdate的点后,接下来的问题就是应该怎么写呢?James给出的答案非常:“Immutablejs!”。看到这个答案你的感觉是不是像看到下面这幅画一样?当然,Immutablejs不是唯一的答案,用Objectassign也可以,关键是不可变的状态。首先要确认已经配置好react-native的环境。
# 创建一个native应用,SimpleApp,然后进入项目目录
react-native init SimpleApp
cd SimpleApp
# 通过npm安装最新版本的react-navigation
npm install --save react-navigation
# 运行程序
react-native run-android
引入Stack Navigator
对于我们的应用程序,我们想要使用堆栈式导航器,因为我们想要一个概念的“堆栈”导航,其中每个新屏幕都放在堆栈顶部,然后从堆栈顶部移除一个屏幕。
import React from 'react';import { AppRegistry, Text,} from 'react-native';import { StackNavigator } from 'react-navigation';
class HomeScreen extends ReactComponent { static navigationOptions = { title: 'Welcome world', }; render() { return <Text>Hello, Navigation!</Text>; }}
const SimpleApp = StackNavigator({ Home: { screen: HomeScreen },});
AppRegistryregisterComponent('SimpleApp', () => SimpleApp);
屏幕的title在静态导航选项中是可配置的,在这里可以设置许多选项来配置导航器中的屏幕显示。
不太熟悉的可以不写,挑自己熟悉的领域写。不太熟悉的不要写成熟悉,以免考核时被发现简历造假,从而被拉入黑名单。简历(英语:resume),顾名思义,就是对个人学历、经历、特长、爱好及其它有关情况所作的简明扼要的书面介绍。简历是有针对性的自我介绍的一种规范化、逻辑化的书面表达。对应聘者来说,简历是求职的"敲门砖"。
2020年12月24日,人力资源和社会保障部公布《网络招聘服务管理规定》,明确要求招聘机构要对用人单位所提供材料的真实性、合法性进行审查,同时不得泄露或者非法出售、非法向他人提供其收集的个人信息,违者将被处罚。
评论列表(0条)