返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue与react详细
  • 487
分享到

vue与react详细

2024-04-02 19:04:59 487人浏览 安东尼
摘要

目录一、全景图二、背景1、React:专业2、Vue:传奇三、技术思想1、key的异同为例1.1 react1.2 vue2、diff的宏观比较2.1 react2.2 vue3、生

一、全景图

二、背景

1、react:专业

  • react 诞生于2011年( Faxjs),
  • 2013 年 7 月 3 日 v0.3.0
  • 2016 年 3 月 30 日 v0.14.8
  • 2016 年 4 月 9 日 v15.0.0
  • 2017 年 9 月 27 日 v16.0.0,fiber正式诞生
  • 2019 年 react 16.8发布 正式支持 hooks语法。
  • 2020 年 10 月 22 日 v17

解决问题:

React用来解决什么问题,官方网站上这样说道: We build React to solve one problem:building large applications with data that changes over time.

2、vue:传奇

发端于2013年的个人项目,但如今已然成为世界三大前端框架之一,在中国大陆更是前端首选。(面试官问:为什么你学习用vue?答:因为爱国!)

  • 2013年,在Google工作的尤雨溪,受到angular的启发,从中提取自己所喜欢的部分,开发出了一款轻量框架,最初命名为Seed
  • 同年12月,这粒种子发芽了,更名为Vue(因为是个视图层库,而 vue 是 view 的法语),版本号是0.6.0。
  • 2014.01.24,Vue正式对外发布,版本号是0.8.0。
  • 发布于2014.02.25的0.9.0,有了自己的代号:Animatrix,这个名字来自动画版的《骇客帝国》,此后,重要的版本都会有自己的代号。
  • 0.12.0发布于2015.06.13,代号Dragon Ball(龙珠),这一年,Vue迎来了大爆发,Laravel 社区(一款流行的 PHP 框架的社区)首次使用 Vue,Vue在JS社区也打响了知名度。
  • 1.0.0 Evangelion(新世纪福音战士)是Vue历史上的第一个里程碑。同年,vue-router(2015-08-18)、vuex(2015-11-28)、vue-cli(2015-12-27)相继发布,标志着 Vue从一个视图层库发展为一个渐进式框架。很多前端同学也是从这个版本开始成为Vue的用户(vue1纯纯的响应式)。
  • 2016年10月1日 2.0.0 Ghost in the shell(攻壳机动队)是第二个重要的里程碑,它吸收了ReactVirtual Dom方案,还支持服务端渲染。
  • 2019年2月4日 在2.6发布之前的很长一段时间,Vue核心团队都在忙着vue-cli3.0的开发,积攒了不少需求,发布了vue2倒数第二个的版本(2020年发布)
  • 2020年09月18日 带着成为任何人都可以快速学习、易于接近的框架的使命vue3它来了,同年还推出了新时代打包工具vite(未来可能会取代webpack

vue群众基础图 如下图:

三、技术思想

react整体上是函数式的思想,组件使用jsx语法,all in js,将htmlCSS全都融入javascript,jsx语法相对来说更加灵活。

vue的整体思想仍然是拥抱经典的html(结构)+css(表现)+js(行为)的形式,vue鼓励开发者使用template模板,并提供指令供开发者使用如v-ifv-show、v-for等指令,因此在开发vue应用的时候会有一种在写经典WEB应用(结构、表现、行为分离)的感觉。

一些老生常谈的 数据管理(propsdata vs state)、组件写法、生命周期异同这里就不比较了。

1、key的异同为例

1、react与vue在列表加key的问题上最终目的是一致的:更准确、更快地拿到oldVnode中对应的vnode节点,提高性能。但是它们实现的算法却有一定的差异。

1.1 react

React在渲染数组时如果子组件没有提供key,会默认将循环的index作为key来用作第一次渲染。 源码本质上就是暴力比较法:由于单链表fiber无法使用双指针算法,所以无法对算法使用双指针优化。总体上经历两轮遍历,第一轮遍历:处理更新的节点。第二轮遍历:处理剩下的不属于更新的节点。

为了降低算法复杂度,React的diff会预设限制:

只对同级元素进行Diff。如果一个DOM节点在前后两次更新中跨越了层级,那么React不会尝试复用他。
两个不同类型的元素会产生出不同的树。如果元素由div变为p,React会销毁div及其子孙节点,并新建p及其子孙节点。
先判断key再判断type,两者相同则为同一节点。更新>新增/删除

1.2 vue

vue在diff性能方面要强于react,当我认真阅读了源码与书籍后,佩服至极, 力扣算法题--最长递增子序列 举个例子吧:以数组[2, 11, 6, 8, 1]为例:最终输出的结果为[0, 2, 3],表示最强增长序列的索引分别是0,2,3;对应的值是2,6,8。换句话说,在这个数组中最长连续增长的值就是数组中的2,6,8三个元素。

那么vue3费了这么大的力气,使用这个方法的目的是什么呢? Vue2在DOM-Diff过程中,优先处理特殊场景的情况,即头头比对,头尾比对,尾头比对等。

而Vue3在DOM-Diff过程中,根据 newIndexToOldIndexMap 新老节点索引列表找到最长稳定序列,通过最长增长子序列的算法比对,找出新旧节点中不需要移动的节点,原地复用,仅对需要移动或已经patch(新增删除节点等操作)节点进行操作,最大限度地提升替换效率,相比于Vue2版本是质的提升!

2、diff的宏观比较

2.1 react

在react中如果某个组件的状态发生改变,react会把此组件以及此组件的所有后代组件重新渲染,不过重新渲染并不代表会全部丢弃上一次的渲染结果,react还是会通过diff去比较两次的虚拟dom最后patch到真实的dom上。虽然如此,如果组件树过大,diff其实还是会有一部分的开销。react内部通过 fiber优化 diff算法,外部建议开发者使用 shouldComponentUpdate pureComponent 来规避问题。

2.2 vue

vue2的响应式是Object.defineProperty实现的,并且重写getter``setter等一系列操作实现观察者模式,一旦数据发生变化,不会像react一样去比较整颗组件树,而是去更新数据状态变化了的组件实例。

3、生命周期

3.1 react 生命周期

old 15.x-16


new 16+


其他:componentDidCatch

React生命周期的命名一直都是非常语义化(小声bb:真是又臭又长又难记)

3.2 vue生命周期

4、函数式编程

双方都做出了大规模的改动,虽然源码不同,但设计思想以及代码简易程度来看,确实都在进步。

4.1 react hooks

原先繁琐的 compomentDidUpdate生命周期 =》 useEffect,虽然不完全相同,但在大多数场景中,从开发者层面看待,我们更多是关心props或者state中的数据变化之后,会产生了什么后果(副作用),省去了开发者自己比较前后值的过程。(这应该是react借鉴vue watch

4.2 vue3 组合式api

vue3组合式api借鉴了react hooks中的部分思想,不得不说,青出于蓝而胜于蓝,再加上框架自己也做出了很多优化工作,在性能上是react比不上的。



function() {
    useEffect(()=>{
        // 当demo发生变化时触发
        console.log(demo)
    },[demo])
    
    return (
        <div>react</div>
    )
}


import {reactive, watchEffect} from 'vue'
export default {
    setup() { 
          const state = reactive({ count: 0, name: 'zs' })
          watchEffect(() => {
            console.log(state.count)
            console.log(state.name)
          })
          return {
            state
          }
    }
}

由于初始化时源码内部的响应式机制的缘故,新APIwatchEffect甚至都不需要监听是谁发生了变化就可以触发副作用,因为监听的这个过程,全程都是vue3源码中的 Proxy完成的。

不仅如此 vue3更是推出了更贴近原生js的语法,点赞!!!!!!


<script setup>
import { reactive, ref} from "vue";

// 渐进式更新:ref api
let val = ref("");
let todos = reactive([
  {
    id: 0,
    title: "吃饭",
    done: false,
  },
  {
    id: 1,
    title: "睡觉",
    done: false,
  },
]);

function addTodo() {
  todos.push({
    id: todos.length,
    title: val.value,
    done: false,
  });
  val.value = "";
}
</script>

其实到这里,vue技术栈的同学一定暗自得意,蹦出一句vue yes! 可惜这么好的库也有存在的问题,vue2响应式Object.defineProperty无法监听数组下标和对象后新增的属性值变化已是老生常谈,vue3采用了 Proxy Api解决这些问题的同时,也带来了新的问题,如reactive只能传对象(react useState简单复杂值都可以),而官方推荐的ref却需要通过 .value才能获取值,这着实让社区炸锅,为此vue团队迫于压力不得不推出 toRefs(感兴趣的同学可以了解一下,之前线下我和艺宝探讨过)。

5、事件处理(@Click vs onClick)

5.1 vue

vue中使用 v-on(简写为:) 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。通常使用v-on接收一个需要调用的方法名称。


<div  @click="helloShanghai">welcome</div>
<div  @click="helloShanghai('hello')">welcome</div>

访问原生DOM事件,可以将$event显式传入method


<div  @click="helloShanghai('hello', $event)">welcome</div>

普通元素 addEventListener,组件$on

5.2 react

React 元素的事件处理和 DOM 元素的很相似,但是有一点语法上的不同:

  • React 事件的命名采用小驼峰式,而不是纯小写。
  • 使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串

<div onClick={this.handleClick}>Click me</div>
<div onClick={this.handleClick.bind(this)}>Click me</div>
<div onClick={()=>{this.handleClick()})}>Click me</div>
<div onClick={this.handleClick()}>Click me</div><!-- 错误写法>

react16将合成事件挂载到 document上,17版本后为root根元素。

6、组件化

Vue鼓励写近似常规HTML的模板。写起来很接近标准 HTML元素,只是多了一些属性。 React推荐你所有的模板通用JavaScript的语法扩展——JSX书写。

7、构建工具


React ==> Create React APP Vue ==> vue-cli

8、其他

当然还有其他的一些比较,诸如vue的插槽(slot)与react的props.children。 生命周期:getDerivedStateFORMPropsgetSnapshotBeforeUpdate

我的看法:

1、react在中后台项目中由于在处理复杂的业务逻辑或组件的复用问题比vue优雅而被人认可,但也更需要团队技术整体比较给力,领头大佬的设计与把关能力要更优秀,因此开发成本更大。 2、vue更友好更易上手的写法著称,更友好的api更亲民的设计让开发成本与效率大大提升。 3、另一方面,vue因为规定了很多api,规范了开发者,同时也一定程度上限制了开发者的发散思维;而react因为更少的a pi提高了开发者的创造力,同时也因为每个react开发者对react有不同的理解而产生不同的代码风格。 4、vue与react在发展长河中越发成熟,深思熟虑后觉得两者不管在移动端或大型中后台都是非常可行的,关于框架好坏的问题,其实更应该思考的是公司团队想要用什么技术栈、自己喜欢与擅长什么技术栈等。

五、全家桶


到此这篇关于vuereact详细的文章就介绍到这了,更多相关vue与react内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue与react详细

本文链接: https://lsjlt.com/news/137299.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue与react详细
    目录一、全景图二、背景1、react:专业2、vue:传奇三、技术思想1、key的异同为例1.1 react1.2 vue2、diff的宏观比较2.1 react2.2 vue3、生...
    99+
    2024-04-02
  • React超详细分析useState与useReducer源码
    目录热身准备为什么会有hookshooks执行时机两套hookshooks存储初始化 mountuseStatemountWorkInProgressHook更新updateupda...
    99+
    2022-11-13
    React useState与useReducer React useState React useReducer
  • vue与react的区别
    vue与react的区别是:1.监听数据变化的实现原理不同;2.数据流的不同;3.组合不同功能的方式不同;4.框架本质不同;5.模板渲染方式的不同;6.渲染过程不同等。具体如下:监听数据变化的实现原理不同,vue是通过getter/sett...
    99+
    2024-04-02
  • react hooks入门详细教程
    State Hooks 案例: import { useState } from 'react'; function Example() { const [count, se...
    99+
    2024-04-02
  • react入门级详细笔记
    目录一、React的基本认识 1、介绍2、React的特点3、React高效的原因二、React的基本使用1、相关js库2、在页面中导入js库3、编码三、ReactJSX1...
    99+
    2024-04-02
  • React props全面详细解析
    目录一、Props 是什么二、props children模式1. props 插槽组件2. render props模式3. render props模式三、进阶实践一、Props...
    99+
    2022-11-13
    React props React props的使用
  • React受控组件与非受控组件详细介绍
    目录1. 受控组件1.1 介绍1.2 受控组件简写1.3 在表单中使用受控组件1.4 综合案例2. 非受控组件介绍非受控组件的应用1. 受控组件 1.1 介绍 概述: 将 state...
    99+
    2024-04-02
  • Vue子组件与父组件详细解析
    目录一、父组件和子组件二、模板分离写法1、template标签2、text/x-template三、父子组件通信-父传子1、Prop 类型四、父子组件通信子传父1、vm.$emit(...
    99+
    2024-04-02
  • Vue组件与生命周期详细讲解
    目录写在前面生命周期图解总结写在前面 Vue.js的核心就是以简洁的模板语法将数据渲染进Dom系统。vue实例在渲染成html的时候往往要经过以下的步骤: 读取数据和方法,设置数据绑...
    99+
    2022-11-13
    Vue组件 Vue生命周期
  • vue与react是什么框架
    本篇内容介绍了“vue与react是什么框架”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • React diff算法超详细讲解
    目录diff 算法介绍diff 策略tree diffcomponent diffelement diff结合源码看 diff整体流程新内容为 REACT_ELEMENT_TYPE新...
    99+
    2022-11-13
    React diff算法原理 React diff算法源码
  • React使用Context与router实现权限路由详细介绍
    目录前言思路实现向根组件注入权限列表抽离ContextHOC实现权限路由组件实现实现使用方法实现类似react-router-config的集中式权限路由配置实现使用方法前言 之前使...
    99+
    2023-01-28
    React权限路由 React Context权限路由 React router权限路由
  • 超级详细的Vue安装与配置教程
    目录一、下载和安装Vue二、创建全局安装目录和缓存日志目录三、配置环境变量 1. 环境变量---用户变量---选中Path---点编辑2. 环境变量---系统变量---新建...
    99+
    2024-04-02
  • Vue 2.0 基础详细
    目录1、特点2、实例3、选项 Options4、基本语法5、生命周期6、路由管理Vue-Router6.1 路由配置6.2 路由跳转6.3 路由守卫7、状态管理器Vuex7.1 配置...
    99+
    2024-04-02
  • vue与react的区别有哪些
    vue与react的区别:1、vue与react两者监听数据变化的实现原理不同;2、vue能够支持双向绑定,而react不能支持;3、vue组合不同功能的方式是通过mixin,而react则是HoC高阶组件实现;4、在组件通信中子组件向父组...
    99+
    2024-04-02
  • React Native 启动流程详细解析
    导读:本文以 react-native-cli 创建的示例工程(安卓部分)为例,分析 React Native 的启动流程。 工程创建步骤可以参考官网。本文所分析 React Nat...
    99+
    2024-04-02
  • React超详细讲述Fiber的使用
    目录Fiber概念结构Fiber树的遍历是这样发生的深度遍历window.requestIdleCallback()requestAnimationFrameFiber是如何工作的结...
    99+
    2023-02-08
    React Fiber原理 React Fiber优点 React Fiber
  • react-router-dom v6 使用详细示例
    目录一、基本使用二、路由跳转2.1 Link 组件2.2 NavLink 组件2.3 编程式跳转三、动态路由参数3.1 路径参数路径匹配规则兼容类组件3.2 search 参数四、嵌...
    99+
    2024-04-02
  • React Immutable使用方法详细介绍
    目录1. 介绍2. 优缺点3. 对象处理4. 数组处理5. 优化组件渲染6. immutable和redux集合使用1. 介绍 假设当前 redux 的大小为 1G,现在要修改 re...
    99+
    2024-04-02
  • React事件处理超详细介绍
    目录1. 事件绑定1.1 函数组件1.2 类组件2. 合成事件3. 事件传参的3种不同写法4. this 指向问题1. 事件绑定 React 元素的事件处理和 DOM 元素的很相似,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作