前端react常见面试题虚拟dom和vue和react区别
虚拟DOM(Virtual DOM)是一个轻量级的javascript对象,它最初只是 真实DOM(real DOM)的一个副本,并不是完全拥有真实DOM的所有属性以及方法,它是一个节点树,它将元素、属性和内容作为对象以及属性,vue/react的渲染函数从组件里创建一个节点树,然后响应数据的变化来更新这个节点树,这个变化是用户或者系统完成的动作引起的。虚拟DOM工作三个重要步骤1、底层数据发生变化时,整个ui都将在虚拟DOM中重新渲染。2、计算之前DOM和更改数据的虚拟DOM之间不一样。3、计算出不同时,真实DOM只渲染更改的差异,数据相同时不会进行重新渲染,节约渲染时间
1数据流:vue是双向数据绑定 而React只能单向传递,React一直提倡的是单向数据流,数据主要从父组件传递到子组件(通过props,或者redux)。如果顶层(父级)的某个props改变了,React会重渲染所有的子节点(如果你不想子组件进行渲染,那你需要PureComponent/shouldComponentUpdate进行处理)。
2模板渲染方式不同:Vue和React的模板有所区别,React是通过JSX来渲染模板,而Vue是通过扩展的HTML来进行模板的渲染。
3虚拟dom:Vue.js(2.0版本)与React的其中最大一个相似之处,就是他们都使用了一种叫'Virtual DOM'的东西。
4补充:Vue组件分为全局注册和局部注册,在react中都是通过import相应组件,然后模版中引用;props是可以动态变化的,子组件也实时更新,在react中官方建议props要像纯函数那样,输入输出一致对应,而且不太建议通过props来更改视图;子组件一般要显示地调用props选项来声明它期待获得的数据。而在react中不必需,另两者都有props校验机制;每个Vue实例都实现了事件接口,方便父子组件通信,小型项目中不需要引入状态管理机制,而react必需自己实现;使用插槽分发内容,使得可以混合父组件的内容与子组件自己的模板;多了指令系统,让模版可以实现更丰富的功能,而React只能使用JSX语法;Vue增加的语法糖computed和watch,而在React中需要自己写一套逻辑来实现;react的思路是all in js,通过js来生成html,所以设计了jsx,还有通过js来操作css,社区的styled-component、jss等;而 vue是把html,css,js组合到一起,用各自的处理方式,vue有单文件组件,可以把html、css、js写到一个文件中,html提供了模板引擎来处理。react做的事情很少,很多都交给社区去做,vue很多东西都是内置的,写起来确实方便一些, 比如 redux的combineReducer就对应vuex的modules, 比如reselect就对应vuex的getter和vue组件的computed, vuex的mutation是直接改变的原始数据,而redux的reducer是返回一个全新的state,所以redux结合immutable来优化性能,vue不需要。react是整体的思路的就是函数式,所以推崇纯组件,数据不可变,单向数据流,当然需要双向的地方也可以做到,比如结合redux-form,组件的横向拆分一般是通过高阶组件。而vue是数据可变的,双向绑定,声明式的写法,vue组件的横向拆分很多情况下用mixin。