浅谈react 16.8版本新特性以及对react开发的影响

目录
  • react16.8版本更新
  • useEffect
  • react16.8版本更新解决了什么问题
    • 组件复用更便捷
  • hooks和reactdiff算法
  • 总结

Facebook团队对社区上的MVC框架都不太满意的情况下,开发了一套开源的前端框架react,于2013年发布第一个版本。

react最开始倡导函数式编程,使用function以及内部方法React.creactClass创建组件,之后在ES6推出之后,使用类组件Class构建包含生命周期的组件。

react 16.8版本更新

react16.8版本更新标志性的信息,是引入了hooks以及相关的一些api。

useState:

// 函数式组件初始化state和更改state:

const Counter = () =>{
const [num,setNum] = userState(0);
return(
  <div>
      <div>{count}</div>
       <button onClick={()=>setCount(num+ 1)}>+</button>
  </div>
  );
};

useEffect

userEffect副作用函数的组件,不仅取代了组件初始化,组件挂载成功,组件状态更新这三个阶段的生命周期函数

同时还能在这个阶段处理一些内存队列:包括定时器等,解决了在16.8版本之前,在组件移除之后,异步队列没有被移除,占据内存导致页面卡顿等问题

useEffect(() => {
  compoment.subscribe(id);
  return () => {
      compoment.unsubscribe(theId)    //取消订阅
  }
});

react16.8版本更新解决了什么问题

组件复用更便捷

在更新的版本之前,复用组件,更多的是使用高阶组件,以及封装的组件,通过传参和父子组件通信的形式去复用,

更新之后,可以通过函数式组件返回状态的形式,去接受组件向外暴露的组件内容。

实例

//旧版本
function children() {
  return function (WrappedComponent) {
    return class HighComponent extends React.Component {
      state = {
        childProps: xxx
      };
      render() {
        const { childProps } = this.state;
        return <WrappedComponent childProps={childProps} />;
      }
    };
  };
}
class App extends Component{
  render(){
/**
 * 调用高阶组件
 */
    const { childProps} = this.props;
    return (
      <children
        columns={[...]}
      // tableProps包含pagination, onChange, dataSource等属性。
        {...childProps}
      />
    )
  }
}
// 新版本
function children() {
  const [childProps, setChildProps] = useState(xxx);
  return childProps;
}

function App {
    const { childProps} = useTable();
    return (
      <Table
        columns={[...]}
      // tableProps包含pagination, onChange, dataSource等属性
        {...childProps}
      />
    )
}
  • 在我们上面提到的,清除定时器,以及解决在生命周期变化过程中,消除占用内存的队列等
  • 函数式组件出现了状态管理,在以往的react函数式编程过程中,react只能被动去接收一个从父组件传递下来的一个props状态,在hooks更新之后,可以使用hooks更新的方法,提高组件的功能性以及扩展性,在函数式组件当中拥有了像class组件一样可控生命周期
  • useEffect取代了一部分生命周期函数,从代码量的角度来说,简化了代码,解决了在class组件在编写过程中,需要不断使用bind或者箭头函数去绑定当前的this,更专注于当前状态的管理

hooks和react diff算法

  • react diff这里不做深入讲解,简单来说diff算法是react以及vue2.0版本当中:

内部有一套虚拟dom的算法,在组件渲染过程中,对每个dom渲染一个key值,

在state状态更新过程时,对应渲染的虚拟dom会去对比真实渲染在页面上的dom元素,如果某个节点对比时发现有更改,对应更改当前虚拟dom节点的数据状态,再渲染真实的dom到页面当中。

两者的联系:

  • hooks在更新之后,减少了对生命周期函数的执行,同时更新状态更为迅速,这样在虚拟dom执行过程中,提高diff执行速度
  • hooks使得函数式组件有了自己内部的状态,在函数式组件执行过程中,不需要等待装载到父组件当中,自己可以更新状态,所以减少了部分dom的深度,在页面渲染过程中,也算是变相提高了页面渲染速度。

总结

hooks在出现之后,对react前端开发来说,标志性的特点应该是解决了类似定时器队列占据内存的问题,简化了react生命周期和组件代码,追溯数据流向和状态修改更为清晰。

在16.8版本之后的小版本更是出现了自定义hooks,还有usememo等api,

包含vue3.0新的api,这些版本的更新都在帮助前端开发者不用再花更多的时间去研究生命周期执行和运行的过程,去专注页面上状态的改变,快速和稳健开发前端业务。

到此这篇关于浅谈react 16.8版本新特性以及对react开发的影响的文章就介绍到这了,更多相关react 16.8新特性内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 30分钟精通React今年最劲爆的新特性——React Hooks

    你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? --拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function. 你还在为搞不清使用哪个生命周期钩子函数而日夜难眠吗? --拥有了Hooks,生命周期钩子函数可以先丢一边了. 你在还在为组件中的this指向而晕头转向吗? --既然Class都丢掉了,哪里还有this?你的人生第一次不再需要面对this. 这样看来,说React Hooks是今年最劲爆的新特性真的毫不夸张.如果你也对react

  • 十分钟带你快速了解React16新特性

    前段时间React的16版本发布了,采用了MIT开源许可证,新增了一些新的特性. Error Boundary render方法新增返回类型 Portals 支持自定义DOM属性 setState传入null时不会再触发更新 更好的服务器端渲染 新的打包策略 ... 1. 使用Error Boundary处理错误组件 之前,一旦某个组件发生错误,整个组件树将会从根节点被unmount下来.React 16修复了这一点,引入了Error Boundary的概念,中文译为"错误边界",当某

  • 浅谈react 16.8版本新特性以及对react开发的影响

    目录 react16.8版本更新 useEffect react16.8版本更新解决了什么问题 组件复用更便捷 hooks和reactdiff算法 总结 Facebook团队对社区上的MVC框架都不太满意的情况下,开发了一套开源的前端框架react,于2013年发布第一个版本. react最开始倡导函数式编程,使用function以及内部方法React.creactClass创建组件,之后在ES6推出之后,使用类组件Class构建包含生命周期的组件. react 16.8版本更新 react16

  • 浅谈java8中map的新方法--replace

    Map在Java8中新增了两个replace的方法 1.replace(k,v) 在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到指定的值(新值) 在指定的键不存在时,方法会return回来一个null javadoc的注释解释了该默认值方法的实现的等价Java代码: if (map.containsKey(key)) { return map.put(key, value); } else { return null; } 下面展示的是新方法和JDK8之前的方法比较: /* *

  • Spring各版本新特性的介绍

    Spring各个版本新特性 Spring3.1新特性 1.添加了引入环境profile功能 2.添加了@enable注解,使用特定功能 3.添加了对声明式缓存的支持,能够使用简单的注解声明缓存边界和规则 4.添加的用于构造器注入的c命名空间,类似与Spring2的p命名空间,用于对应属性注入 5.开始支持Servlet3.0,包括基于java配置中生命Servlet和Filter,不再只仅仅借助web.xml 6.改善对于JPA的支持,让JPA能在Spring中完整配置JPA,不必再使用pers

  • 浅谈node node-sass sass-loader版本对应问题

    目录 node版本不对应,升级node或者降级 使用nvm对node版本进行管理和切换 node-sass版本不匹配 查看node-sass和sass-loader版本是否对应 查看node-sass和node版本是否对应 node -v 具体对应版本如下图: 图片来自https://github.com/sass/node-sass node版本不对应,升级node或者降级 使用nvm对node版本进行管理和切换 安装 nvm-window https://github.com/coreybu

  • webpack 4.0.0-beta.0版本新特性介绍

    近年来前端技术如雨后春笋般蓬勃发展,我们也在这个潮流下不断地学习.成长.前端技术的不断发展,给我们提供了许多的便利.例如:JSX的出现为我们提供了一个清晰.直观的方式来描述组件树,LESS/SASS的出现提高了我们书写css的能力,AMD/CommonJS/ES6 的出现为我们模块化开发提供了便利.然而,我们需要使用其它工具将这些工具转化成原生语言以运行在浏览器上.为了能够更好的将这些不同的资源整合到一起,我们就需要一个打包工具,webpack就是这个需求下的产物. webpack 可以看做是模

  • Java9版本新特性同一个Jar支持多JDK版本运行

    目录 一.基本使用方法 二.真实的例子 java8代码 Java9代码 编译 运行Mainclass 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右. java9第一篇-可以在interface中定义私有方法了java9第二篇-Java9改进try-with-resources语法 本文内容:在Java 9增强了J

  • ThinkPHP3.1.3版本新特性概述

    ThinkPHP3.1.3版本有一些特性,还是值得关注的,下面来简单说下. 1.异常方面的改进 新版的ThinkPHP3.1.3重写了异常类ThinkException(其实是完全简化成了直接继承系统Exception类),并且把异常逻辑改进封装到Think类中.主要涉及到Think类的appException方法和halt函数. 并且改进后的异常处理支持系统致命错误的捕获,Think类增加了fatalError方法,原理是使用了 register_shutdown_function(array

  • 浅谈Xcode9 和iOS11适配和特性

    今天升级了Xcode9 刚才写了一篇 爱劈叉的齐刘海 现在说说新的东西把,有些简直不能再恶心了但有些简直不能再贴心 首先是跳转, 之前按住Command + 左键 就可以跳转了;然而今天我发现 除了这个: Jump to Definition(^⌘):跳转类头文件或定义 Show Quick Help(⌥):显示帮助文档 Edit All in Scope:编辑文档内所有匹配内容 在这里我要说,对于懒得不行的我,简直要吐,多了一步操作 效率降低很多的好吗? 那么好,你试试 Command + 右

  • 浅谈07网站收益的新出路

    在网络上也算混了2年多了,虽然没有怎么赚到大钱,但是自己的生活还是有点滋味的,在这里就写一下自己的最近做站盈利思路吧. 我也忘记在落伍上谁说过了,做站之前没有定位好盈利点的站都是垃圾站,其实也不是拉,不过他说的还是有道理的,你做站之前必须先想清楚你的站的盈利点,说实在的,现在做站的没有几个不是想赚钱的.我文采不好,大家不要见怪.至于网站的定位,大家可以看看王通的相关资料,我觉得他说的还可以,点石上的兄弟不要骂我. 现在我就举一个例吧,比如我前段时间做了一个健康两性的站,我做这个站的目的就是为了做

随机推荐