React及Nextjs知识点小结

函数式组件和类组件区别是什么

1、函数式组件是用于创建无状态的组件,组件不会被实例化,无法访问this中的对象,无法访问生命周期方法,是无副作用的,相比于类组件函数式组件代码可读性更好,减少了大量的冗余代码,可以很方便的创建一个组件
2、类组件是用于创建有状态的组件,该组件会被实例化,可以访问组件的生命周期方法

Component和PureCompoent区别是什么

1、PureCompoent是一个更具性能的Component的版本
除了为你提供了一个具有浅比较的shouldComponentUpdate方法,PureComponent和Component基本上完全相2、同。当props或者state改变时,PureComponent将对props和state进行浅比较。
3、另外,Component不会比较当前和下个状态的props和state。因此,每当shouldComponentUpdate被调用时,组件默认的会重新渲染。

属性Props和States应该在何时使用

组件私有数据时用state  外部数据传入则用props

简单说明React Component的生命周期

react组件的生命周期有四个阶段:初始化、创建阶段、运行阶段和销毁阶段

1、初始化:

construct,初始化state,并且把props转化为state

2、创建阶段:

componentWillMount,相当于 Vue 中的 created,组件将要被挂载,此时还没有开始渲染虚拟 DOM
componentDidMount,相对于 Vue 中的mounted,组件完成挂载,此时,组件已经显示到页面上了,通常我们会在这里请求ajax数据,或是操作dom改变样式

3、运行阶段

componentWillReceiveProps(注:未来17版本中将被弃用):组件接收到一个新的props时被调用,但也有可能props没有改变的时候也触发,比如父组件更新导致的触发,有时候可能需要比较props是否发生了改变,这个方法在第一次渲染时不会被调用。
shouldComponentUpdate:用于判断组件是否需要被更新,一般在这里做一些性能优化,减少不必要的渲染
componentWillUpdate(注:未来17版本中将被弃用),组件更新之前(componentshouldupdate返回true)时调用
componentDidUpdate,组件更新完成之后调用,此时页面又被重新渲染了, state、虚拟DOM和页面已经保持同步

4、销毁阶段

componentWillUnmount,组件卸载的时候触发,我们可以在这里做一些清除定时器的操作

新增加的钩子函数
1、getDerivedStateFromProps(nextProps,prevState)
新的静态getDerivedStateFromProps生命周期在组件实例化以及接收新props(只要父组件重新渲染,那么这个props不论值是否一样都是一个新的props)后调用。它可以返回一个对象来更新state,或者返回null来表示新的props不需要任何state更新。
2、getSnapshotBeforeUpdate()
新的getSnapshotBeforeUpdate生命周期在更新之前被调用(例如,在DOM被更新之前)。此生命周期的返回值将作为第三个参数传递给componentDidUpdate。 (这个生命周期不是经常需要的,但可以用于在恢复期间手动保存滚动位置的情况。)

HOC组件是什么,举一个合适使用HOC的例子

高阶组件就是一个函数,且该函数接受一个组件作为参数,并返回一个新的组件,是一个没有副作用的纯函数。
举个例子,如页面权限控制

// HOC.js
function withAdminAuth(WrappedComponent) {
return class extends React.Component {
state = {
isAdmin: false,
}
async componentWillMount() {
const currentRole = await getCurrentUserRole();
this.setState({
isAdmin: currentRole === 'Admin',
});
}
render() {
if (this.state.isAdmin) {
return <WrappedComponent {...this.props} />;
} else {
return (<div>您没有权限查看该页面,请联系管理员!</div>);
}
}
};
} 页面a
// pages/page-a.js
class PageA extends React.Component {
constructor(props) {
super(props);
// something here...
}
componentWillMount() {
// fetching data
}
render() {
// render page with data
}
}
export default withAdminAuth(PageA);

什么事RenderProps?举一个合适使用RenderProps的例子

The Render Props是一种在不重复代码的情况下共享组件间功能的方法,Render Props模式的出现主要是为了解决HOC所出现的问题

  • 不用担心props命名问题,在render函数中只取需要的state
  • 不会产生无用的组件加深层级
  • render props模式的构建都是动态的,所有的改变都在render中触发,可以更好的利用组件内的生命周期。

使用场景:
Render Props对于只读操作非常适用,如跟踪屏幕上的滚动位置或鼠标位置

怎样可以知道Nextjs现在的代码是在前端还是后端运行

服务端和客户端本质区别是谁来完成html内容的拼接,如是在服务器端完成的,然后返回给客户端则是服务器端渲染,如果是客户端来拼接页面内容数据,则是客户端渲染。
判断当前页面是客户端还是服务器端渲染有三种方式:
a、可以通过查看Network请求来区分,如果是客户端请求,Respone返回的是Json数据,否则返回的是html格式的内容数据
b、查看源代码,如果页面中展示的数据在源代码中可以看到说明是服务器端渲染,否则是客户端渲染
c、通过 isServer 变量可以判断当前环境是服务端还是客户端

static async getInitialProps(ctx) {
const isServer = ctx.isServer
}

简单说明Nextjs中页面的生命周期

Next.js为我们提供了一个区别于React的新生命周期——getIntialProps(),这个生命周期是脱离于React的正常生命周期的,不过我们依然可以在组件里正常使用react组件的各种生命周期函数。
getInitialProps ,它用于获取并处理组件的属性,返回组件的默认属性。我们可以在该方法中请求数据,获取页面需要的数据并渲染返回给前端页面。


当页面初始化加载时,getInitialProps只会加载在服务端。只有当路由跳转(Link组件跳转或 API 方法跳转)时,客户端才会执行getInitialProps。
注意:getInitialProps将不能使用在子组件中。只能使用在pages页面中。

static async getInitialProps({ req, query, store }) {
store.dispatch(getPromoItemRequest())
store.dispatch(getHomePageDataRequest())
return {}
}

请说明Router,Link以及location.href在Nextjs中的区别

Router是一个路由对象,提供了route、pathname、query、push、replace等常用的API

<span onClick={() => Router.push('/about')}>here</span>

Link是一个组件,其实现原理是基于Router
组件默认将新 url 推入路由栈中,可以使用replace属性来防止添加新输入

<Link href="/about" replace>
<a>here</a>
</Link>

location.href是Js提供的原生跳转方式,相较于 location.href,Router和Link更加的强大和方便

请说明Link中,href和as分别代表什么

href链接跳转的真实路径
as为展现在浏览器上的实际路径,是为了装饰 URL 作用

什么时候才需要使用_app.js及什么东西需要放进_app.js

1、通过重写_app.js文件,我们可以对App组件进行重构,在App组件中加入一些项目中不变的内容,比如页面的布局
2、设置全局公共样式css及状态
3、使用componentDidCatch自定义处理错误

Nextjs中的production ENV(NODE_ENV=production)有什么特别

什么事单元测试及其准则是什么

单元测试(unittesting),是指对_软件_中的最小可_测试单元_进行检查和验证
单元测试准则:

  1. 保持单元测试小巧, 快速
  2. 单元测试应该是全自动/非交互式的
  3. 让单元测试很容易跑起来
  4. 对测试进行评估
  5. 立即修正失败的测试
  6. 把测试维持在单元级别
  7. 由简入繁
  8. 保持测试的独立性
  9. Keep tests close to the class being tested
  10. 合理的命名测试用例
  11. 只测试公有接口
  12. 看成是黑盒
  13. 看成是白盒
  14. 芝麻函数也要测试
  15. 先关注执行覆盖率
  16. 覆盖边界值
  17. 提供一个随机值生成器
  18. 每个特性只测一次
  19. 使用显式断言
  20. 提供反向测试
  21. 代码设计时谨记测试
  22. 不要访问预定的外部资源
  23. 权衡测试成本
  24. 合理安排测试优先次序
  25. 为测试失败做好准备
  26. 写测试用例重现 bug
  27. 了解局限

如何提高单元测试的覆盖率

提升代码质量,高度的单元测试覆盖率是最有效的手段之一
使用优秀的开源单元测试框架,其覆盖率往往很高
高覆盖体现在测试用例覆盖public方法、函数中的if-else等逻辑、参数检查、内部定义等。

React及Nextjs相关知识点小结的更多相关文章

  1. CSharp 相关知识点小结

    1.JS获取iframe下面的内容document.getElementById('IFRAME1').contentDocument; 2.dialog 弹出层,定位:postion:'bottom ...

  2. [RK3288][Android6.0] 关于uboot中logo相关知识点小结【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/76256224 Platform: Rockchip OS: Android 6.0 Kern ...

  3. React其它相关知识点

    React其它相关知识点 一,解释一下React Fiber? 简单来说,核心就是在虚拟dom和浏览器的调用栈之间多了一个虚拟调用栈,和虚拟dom一样,这个虚拟调用栈也是在内存中的,这个虚拟调用栈就类 ...

  4. C++重要知识点小结---3

    C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:http://www.cnblogs.co ...

  5. 【SpringBoot MQ 系列】RabbitMq 核心知识点小结

    [MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...

  6. SpringBoot 系列教程之事务隔离级别知识点小结

    SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上 ...

  7. UITableView相关知识点

    //*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...

  8. Android开发涉及有点概念&相关知识点(待写)

    前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...

  9. IOS开发涉及有点概念&相关知识点

    前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...

随机推荐

  1. 【maven】【idea】使用idea的maven进行deploy操作失败,报错:Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project proengine-db-sdk: Failed to deploy artifacts 错误码401

    使用idea的maven进行deploy操作失败,报错: Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:- f ...

  2. C#函数的参数传递2(ref\out)

    using System; namespace class1 { class program { static void Main(string[] args) { Console.Write(&qu ...

  3. asp.net 使用NPOI读取excel文件

    asp.net 使用NPOI读取excel文件内容 NPOI下载地址:NPOI public class ExcelHelper { /// <summary> /// 读取Excel文件 ...

  4. 织梦DEDECMS本地后台操作卡顿的解决方法

    打开/data/common.inc.php,把默认的$cfg_dbhost = ‘localhost‘修改为$cfg_dbhost = ‘127.0.0.1’;保存.然后你会发现后台操作起来流畅多了 ...

  5. 骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 小詹&有乔木 PS:如有需要Python学习资料的小伙伴可 ...

  6. Python【day 15-3】函数部分

    '''''' ''' 一.函数 1.函数定义 对功能或者动作的封装 在类中定义,就是方法 在类之外定义,就是函数 2.函数写法 1.定义或者申明函数 def 函数名(形参列表): 函数体(return ...

  7. ABP进阶教程2 - 组合查询

    点这里进入ABP进阶教程目录 更新数据传输对象 打开应用层(即JD.CRS.Application)的Course\Dto\GetAllCoursesInput.cs //Course数据传输对象(查 ...

  8. 10.JavaCC官方入门指南-例5

    例5:计算器--添加乘除法运算 1.calculator2.jj 根据上一个例子,可知要添加乘法和除法运算是很简单的,我们只需在词法描述部分添加如下两个token: TOKEN : { < TI ...

  9. 基于Spark.NET和ML.NET Automated ML (自动学习)进行餐厅等级的检查预测

    简介 Apache Spark是一个开源.分布式.通用的分析引擎.多年来,它一直是大数据生态系统中对大型数据集进行批量和实时处理的主要工具.尽管对该平台的本地支持仅限于JVM语言集,但其他通常用于数据 ...

  10. nginx配置中root和alias的区别

    例:访问http://127.0.0.1/download/*这个目录时候让他去/opt/app/code这个目录找. 方法一(使用root关键字): location / { root /usr/s ...