【前端知识体系-JS相关】组件化和React
1. 说一下使用jQuery和使用框架的区别?
- 数据和视图的分离,(jQuery数据和视图混在一起,代码耦合)-------开放封闭原则
- 以数据驱动视图(只关注数据变化,DOM操作被封装)
2.说一下对MVVM的理解?
- 先说MVC:Model, View, Controller(主要用于后端)
- MVVM: Model, View, ViewModel[中间连接者,连接view和和model]
- 关于ViewModel
2.2.1 MVVM在React中对应关系
- 1) M(odel):对应组件的方法或生命周期函数中实现的业务逻辑和this.state中保存的本地数据,如果React集成了redux +react-redux,那么组件中的业务逻辑和本地数据可以完全被解耦出来单独存放当做M层,如业务逻辑放在Reducer和Action中。
- 2) V(iew)-M(odel):对应组件中的JSX,它实质上是Virtual DOM的语法糖。React负责维护 Virtual DOM以及对其进行diff运算,而React-dom 会把Virtual DOM渲染成浏览器中的真实DOM
- 3) View:对应框架在浏览器中基于虚拟DOM生成的真实DOM(并不需要我们自己书写)以及我们书写的CSS
- 4)绑定器:对应JSX中的命令以及绑定的数据,如className={ this.props.xxx }、{this.props.xxx}等等
2.2.2 MVVM的双绑和单绑区别
- 1) 一般,只有UI表单控件才存在双向数据绑定,非UI表单控件只有单向数据绑定。
- 2) 单向数据绑定是指:M的变化可以自动更新到ViewModel,但ViewModel的变化需要手动更新到M(通过给表单控件设置事件监听)
- 3) 双向数据绑定是指念:M的变化可以自动更新到ViewModel,ViewModel的变化也可以自动更新到M
- 4) 双向绑定 = 单向绑定 + UI事件监听。双向和单向只不过是框架封装程度上的差异,本质上两者是可以相互转换的。
- 5) 优缺点:在表单交互较多的情况下,单向数据绑定的优点是数据更易于跟踪管理和维护,缺点是代码量较多比较啰嗦,双向数据绑定的优缺点和单向绑定正好相反。
3.说一下对组件化的理解?
- 组件的封装
- a. 视图的封装
- b. 数据的封装
- c. 变化逻辑(数据驱动视图变化,setState)
- 组件的复用
- a. 使用props来传递数据(同一个组件传递不同飞数据)
- b. 组件的复用(同一个组件使用不同的数据)
4.JSX的本质是什么?
[!NOTE]
- JSX语法(标签、JS表达式,判断,循环,事件绑定)
- JSX是语法糖, 需要被解析成JS才能运行(h函数的使用)
- JSX是独立的标准,可以被其他项目使用
// 下面的代码实际执行流程:
// JSX 代码
const user = {
firstName : 'xiugang',
lastName : 'zhang'
}
var profile = <div>
<img src="a.jpg" className='profile'/>
<h3>{[user.firstName, user.lastName].join(' ')}</h3>
</div>
// 解析结果(重点掌握),关键点:是使用了一个React.createElement来创建节点的
var profile = React.createElement('div', null, [
React.createElement('img', {src : 'a.jpg', className : 'profile'}),
React.createElement('h3', null, [[user.firstName, user.lastName].join(' ')])
])
/* @jsx h*/
// 1. 使用插件:cnpm install babel-plugin-transform-react-jsx
// 2. 开始编译JSX: babel --plugins transform-react-jsx demo.js
// 3. 可以自定义React.createElement变为一个h函数: /* @jsx h*/
5.JSX和VDOM的关系?
5.1 分析为何需要VDOM
- VDOM是React初次推广开来的,结合JSX
- JSX就是模板渲染成HTML
- 初次渲染 + 修改state之后的re-render
- 正好符合VDOM的应用场景
5.2 React.createElement和h函数
5.3 何时patch?
- 初次渲染----
ReactDOM.render(<App/>, container)
- 会触发patch(container, vnode)函数
- re-render-- setState
- 会触发patch(vNode, newVNode)
5.4 自定义组件的解析?
5.4.1 自定义组件的解析(TODOInput和TODOList组件的解析)
- ‘div’可以直接渲染
即可,vdom可以实现
- TodoInput和TodoList是自定义组件(class),vdom不认识
- 因此Input和List定义的时候必须声明render函数
- 根据props属性初始化实例,然后执行实例的render函数
- render函数返回的还是vnode的对象
React.createElement(TodoInput, { addTitle: this.addTitle.bind(this) }),
React.createElement(TodoList, { data: this.state.list }) // 上面的代码相当于是先去创建一个TodoList实例对象
var list = new TodoList({ data: this.state.list });
// 然后再去调用这个函数的render方法(返回的是一个JSX,然后对当前的这个JSX渲染为VDOM)
var vnode = list.render();
6.说一下setState的过程?
// 1. 每个组件实例,都有renderComponent方法
class Component {
constructor(){ } // 每个组件都有这个函数
renderComponent(){
// 获取上一次的vNode
const prevVnode = this._vnode; // render函数只需之后,得到的还是一个新的node
const newVnode = this.render(); // 开始对比,找出差异
patch(prevVnode, newVnode); // 更新node为最新的node
this._vnode = newVnode;
}
} // 2. 执行renderComponent会重新执行实例的render方法
// 3. render函数返回newVnode,然后拿到prevNode(也就是上次的vnode)----多次执行setState视图最终也只会渲染一次
// 4. 执行patch(preVnode, newVNode)
[!NOTE]
- setState通过一个队列机制实现state更新,当执行setState时,会将需要更新的state很后放入状态队列,而不会立即更新this.state,队列机制可以高效地批量更新state。如果不通过setState而直接修改this.state的值
- 那么该state将不会被放入状态队列中。当下次调用setState并对状态队列进行合并时,就会忽略之前修改的state,造成不可预知的错误
- 同时,也利用了队列机制实现了setState的异步更新,避免了频繁的重复更新state
7.7. 阐述自己对React和Vue的认识?
7.7.1. 两者的本质区别
- vue本质是MVVM框架,由MVC发展而来
- React本质是前端组件化框架,由后端组件化发展而来
- 并不妨碍两者都能实现相同的功能
7.7.2. 模板的区别
- vue-使用模板(最初由angular提出)
- React-使用JSX
- 模板语法上,我更倾向于JSX
- 模板分离上,我更倾向于Vue
- 模板应该和JS逻辑分离
- “开放封闭原则”
7.7.3. 组件化的区别
- React本身就是组件化,没有组件哈就不是React
- vue也支持组件化,不过是在MVVM上的扩展
- 查阅vue组件化的文档
- 组件化更适合选择React
7.7.4. 两者的共同点
- 都支持组件化
- 都是数据驱动视图
7.7.5. 如何选择
- 国内使用,首推vue。文档更易读,易学,社区够大
- 如果团队水平较高,推荐使用React,组件化和JSX
【前端知识体系-JS相关】组件化和React的更多相关文章
- 【前端知识体系-JS相关】深入理解MVVM和VUE
1. v-bind和v-model的区别? v-bind用来绑定数据和属性以及表达式,缩写为':' v-model使用在表单中,实现双向数据绑定的,在表单元素外使用不起作用 2. Vue 中三要素的是 ...
- 【前端知识体系-JS相关】JS基础知识总结
1 变量类型和计算 1.1 值类型和引用类型的区别? 值类型:每个变量都会存储各自的值.不会相互影响 引用类型:不同变量的指针执行了同一个对象(数组,对象,函数) 1.2 typeof可以及检测的数据 ...
- 【前端知识体系-JS相关】对移动端和Hybrid开发的理解?
1.hybrid是什么,为何使用hybrid呢? 概念: hybrid就是前端和客户端的混合开发 需要前端开发人员和客户端开发人员配合完成 某些环节也可能会涉及到server端 大前端:网页.APP. ...
- 【前端知识体系-JS相关】ES6专题系列总结
1.如何搭建ES6的webpack开发环境? 安装Node环境 node -v // 10.14.1 安装NPM环境 npm -v // 6.4.1 安装babel npm install @babe ...
- 【前端知识体系-JS相关】JS-Web-API总结
2.1 DOM操作 2.1.1 DOM的本质是什么? <!-- DOM树:二叉树 --> /* <?xml version="1.0" encoding=&quo ...
- 【前端知识体系-JS相关】10分钟搞定JavaScript正则表达式高频考点
1.正则表达式基础 1.1 创建正则表达式 1.1.1 使用一个正则表达式字面量 const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi; 1.1.2 调用RegExp对象的构 ...
- 【前端知识体系-JS相关】你真的了解JavaScript编译解析的流程吗?
1. JS编译解析的流程 1.1 JS运行分三步 语法分析(通篇扫描是否有语法错误),预编译(发生在函数执行的前一刻),解释执行(一行行执行). 1.2 预编译执行分五步 创建AO对象(Activat ...
- 【前端知识体系-JS相关】深入理解JavaScript异步和单线程
1. 为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Jav ...
- 【前端知识体系-JS相关】深入理解JavaScript原型(继承)和原型链
1. Javascript继承 1.1 原型链继承 function Parent() { this.name = 'zhangsan'; this.children = ['A', 'B', 'C' ...
随机推荐
- 持续集成(CI):WEB自动化+Allure+Jenkins定时构建
一.allure插件安装 pytest可以通过allure集成展示优美的测试报告,同样allure也可以与Jenkins集成,并且Jenkins有构建记录,所以可以看到历史构建曲线图,通过曲线图可以清 ...
- ubuntu 16.04上源码编译和安装cgal并编写CMakeLists.txt | compile and install cgal on ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/39ab7ed9/,欢迎阅读最新内容! compile and install cgal on ubuntu 16.04 Guide ...
- 一些常见的http状态码
HTTP状态码是服务器和客户端之间交流信息的语言,下面列出一些常见的HTTP状态码. 1XX系列 指定客户端应相应的某些动作,代表请求已被接受,需要继续处理.由于在HTTP/1.0协议中没有定义任何1 ...
- Windows Store无法联网时安装WSL
Windows Store无法联网时安装WSL 1 打开powershell 输入命令: Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1604 - ...
- C# 通过反射调用 Func 委托
C# 通过反射调用 Func 委托 Intro 最近我的 NPOI 扩展库增加了,自定义输出的功能,可以自定义一个 Func 委托来设置要导出的内容,详细介绍请查看 https://www.cnblo ...
- 在IDEA中用Maven打包大项目时失败问题
今天在完成公司里某项功能开发时,准备用Maven打包,后来在打包的过程中报错:OutOfMemoryError.如下图: 后来经过查找资料,发现可以配置一下Maven的参数即可解决此问题. 配置参数为 ...
- wpf 单例模式和异常处理 (原发布 csdn 2017-04-12 20:34:12)
第一次写博客,如有错误,请大家及时告知,本人立即改之. 如果您有好的想法或者建议,我随时与我联系. 如果发现代码有误导时,请与我联系,我立即改之. 好了不多说,直接贴代码. 一般的错误,使用下面三个就 ...
- java基础(29):JDBC、DBUtils
1. JDBC 1.1 JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问 ...
- opencv::DNN介绍
DNN模块介绍: Tiny-dnn模块 支持深度学习框架 - Caffe - TensorFlow - Torch/PyTorch DNN运用 图像分类 对象检测 实时对象检测 图像分割 预测 视频对 ...
- Android 布局渲染流程与卡顿优化
文章内容概要 一.手机界面UI渲染显示流程 二.16ms原则 三.造成卡顿的原因 四.过度绘制介绍.检测工具.如何避免造成过度绘制造成的卡顿 一.手机界面UI渲染显示流程 大家都知道CPU(中央处理器 ...