React 16.3新特性分析

context api总是很让人迷惑。这个api是官方的,但是官方又不希望开发者们使用这个api,说是这个api会在以后发生改变。现在就是那个改变的时刻。新的api已经被merge了。而且它看起来更加的“用户友好”了。尤其是你不得不使用redux、mobx的时候,可以选择新的context api实现更加简单的状态管理。

新的API用起来非常的简单:React.createContext(),这样就创建了两个组件:

import {createContext} from 'react';const ThemeContext = createContext({  background: 'yellow',  color: 'white'});

登录后复制

调用createContext方法会返回两个对象,一个是Provider,一个是Consumer。

那个Provider是一个特殊的组件。它可以用来给子树里的组件提供数据。一个例子:

class Application extends React.Component {  render() {          
}}

登录后复制

上例展示了如何传递“theme” context的。当然这些值可以是动态的(比如,基于this.state)。

下一步就是使用Consumer。

const Header = () => {      {(context) => {      return (        

Welcome!

); }} }

登录后复制

如果在render Consumer的时候没有嵌套在一个Provider里面。那么就会使用createContext方法调用的时候设置的默认值。

注意:

Consumer必须可以访问到同一个Context组件。如果你要创建一个新的context,用的是同样的入参,那么这个新建的context的数据是不可访问的。因此,可以把Context当做一个组件,它可以创建一次,然后可以export,可以import。

这个新的语法用了function as child模式(有时也叫做render prop模式)。如果不是很熟悉这个模式,那么推荐你看一下这些文章。

新的API不再要求你声明contextProps了。

Context传递的数据和Context.Provider组件的value属性是一样的。对Provider数据的修改会引起所有的消费者(consumer)重绘。

新的声明周期方法

参考这个RFC。新的声明周期方法会被引入,而旧的会被废弃。

这一改变主要是为了强制推行最佳实践。你可以看看这篇文章来了解一下为什么这些生命周期方法会变得很诡异。这些最佳模式在React 16的异步绘制模式(Async Mode)下显得非常重要。

要被废弃的方法:

componentWillMount–使用componentDidMount代替

componentWillUpdate–使用componentDidUpdate代替

componentWillReceiveProps–使用一个新的方法:static getDerivedStateFromProps来代替。

不过这些并不会立刻发生,他们可以用到React 16.4。在React 17里将被彻底移除。如果你开启了StrictMode或者AsyncMode,可以通过这样的方式来使用,但是会收到警告:

UNSAFE_componentWillMount

UNSAFE_componentWillReceiveProps

UNSAFE_componentWillUpdate

static getDerivedStateFromProps

当componentWillReceiveProps我们需要其他的方式根据props的变动更新state。社区决定引入一个新的static方法来处理这个问题。

什么是静态方法?一个静态方法就是存在于类内,而不是类的实例内的方法。静态方法访问不到this,并且在声明的时候有static关键字在前面修饰。

但是,问题来了。既然这个方法没有办法访问this,那么如何调用this.setState呢?答案就是,不调用。这个方法直接返回需要更新的state的数据,或者返回null,如果没有什么需要更新的话。

static getDerivedStateFromProps(nextProps, prevState) {  if(nextProps.currentRow === prevState.lastRow) {    return null;  }  return {    lastRow: nextProps.currentRow,    isCrollingDown: nextProps.curentRow > prevState.lastRow  }}

登录后复制

调用这个方法和之前调用this.setState的效果是一样的。只会修改这些返回的值,如果是null的话则不修改state。state的其他值都会保留。

值得注意的事

你需要定义初始state的值。无论是在constructor里,或者是类属性。否则会报警告。

这个方法getDerivedStateFromProps()会在第一次挂载和重绘的时候都会调用到,因此你基本不用在constructor里根据传入的props来setState。

如果定义了getDerivedStateFromProps后,又定义了componentWillReceiveProps。那么,只有前者会被调用,并且你会收到一个警告。

一般你会使用一个回调来保证某些代码实在state更新之后才被调用的。那么,请把这些代码都移到componentDidUpdate里。

如果你不喜欢使用static关键字,那么你可以这样:

ComponentName.getDerivedStateFromProps = (nextProps, prevState) => {  // Your code here}

登录后复制

Static Mode

严格模式是一个新的方式来确保你的代码是按照最佳实践开发的。它实际是一个在React.StrictMode下的组件。它可以用在你的组件树的任何一部分上。

import {StrictMode} from 'react'class Application extends React.Component {  render() {    return (                        
); }}

登录后复制

如果一个在StricMode子树里的组件使用了componentWillMount方法,那么你会看到一个报错消息。

AsyncMode

异步模式在React.unsafe_AsyncMode下。使用AsncMode也会打开StrictMode模式下的警告。

相关推荐:

React 16.3之Context API详解

以上就是React 16.3新特性分析的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2786626.html

(0)
上一篇 2025年3月8日 17:47:42
下一篇 2025年3月6日 13:16:27

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 分解React组件的几种进阶方法

    react 组件魔力无穷,同时灵活性超强。我们可以在组件的设计上,玩转出很多花样。但是保证组件的single responsibility principle: 单一原则非常重要,它可以使得我们的组件更简单、更方便维护,更重要的是使得组件更…

    编程技术 2025年3月8日
    200
  • react项目案例总结

    刚刚开始写组件的时候,感觉难度不大(跟vue差不多)。最有意思的应该是jsx语法,个人感觉,jsx的功能性确实比vue的template更强,而且可读性更高. // vue 登录后复制 // jsxhello !{msg} 登录后复制 在j…

    编程技术 2025年3月8日
    200
  • 在项目中使用jest测试react native组件的方法

    目前javascript的测试工具很多,但是针对react的测试策略,facebook推出的reactjs标配测试工具是jest.jest的官网地址:https://facebook.github.io/jest/。我们可以看到jest官网…

    2025年3月8日
    200
  • 用react写一个分页组件的示例

    本文主要和大家介绍用react来写一个分页组件(小结),希望能帮助大家学会用react来写一个分页组件,下面我们一起来学习一下吧。 效果截图(样式可自行修改): 构建项目 create-react-app react-paging-comp…

    2025年3月8日
    200
  • 简单搭建一个react项目

    本文主要和大家介绍了从零开始搭建一个react项目开发,小编觉得挺不错的,希望能帮助大家学习如何搭建一个react项目。 1、npm init 生成 package.json 文件. 2、安装各种需要的依赖: npm install &#8…

    编程技术 2025年3月8日
    200
  • react受控组件与非受控组件详解

    我们都知道,有许多的web组件可以被用户的交互发生改变,比如:,,或者是我现在正在使用的富文本编辑器。这些组件在日常的开发中很不显眼,我们可以很轻易的通过输入一些内容或者设置元素的value属性来改变组件的值。但是,因为react是单向数据…

    编程技术 2025年3月8日
    200
  • React Native自定义控件实现底部抽屉菜单

    原生开发中,自定义view可谓是屡见不鲜的事情,往往系统的控件总不能满足现实的需求。五花八门的产品设计需要我们做出不同的view。关于自定义view的内容网上已经有很多的博文,本篇博客要和大家分享如何在react native中自定义组件实…

    2025年3月8日
    200
  • react前后端同构渲染示例代码

    前后端同构渲染:当客户端请求一个包含react组件页面的时候,服务端首先响应输出这个页面,客户端和服务端有了第一次交互。然后,如果加载组件的过程需要向服务端发出ajax请求等,客户端和服务端又进行了一次交互,这样,耗时相对较长。前后端同构渲…

    2025年3月8日
    200
  • JavaScript数组进化与性能分析实例

    在使用 javascript 前,我对 c、c++、c# 这些已经颇为熟悉。与许多 c/c++ 开发者一样,javascript 给我的第一印象并不好。本文主要和大家介绍了javascript 数组的进化与性能分析,本文讲得更多的是内存、优…

    2025年3月8日
    200
  • React中的refs的使用教程分享

    ref是react中的一种属性,当render函数返回某个组件的实例时,可以给render中的某个虚拟dom节点添加一个ref属性,如下面的代码所示:     var App = React.createClass({ render: fu…

    2025年3月8日
    200

发表回复

登录后才能评论