【前端知识体系-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' ...
随机推荐
- C++入门到理解阶段二基础篇(4)——C++运算符
目录 算术运算符(进行四则运算) 赋值运算符(表达式的值赋给变量) 比较运算符(表达是比较,返回一个真值或假值) 逻辑运算符(返回表格式的结果真或假) 位运算符 杂项运算符 C++ 中的运算符优先级 ...
- Linux常用命令之重启关机命令
shutdown命令 shutdown命令用来系统关机命令.shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作. 实例 指定现在立即关机: shutdown -h now ...
- 黄聪:wordpress登录后台后load-scripts.php载入缓慢
今天一个微信群里一个好友问大鸟,他的wordpess后台载入非常缓慢,缓慢到什么程度,我们看图: 这个真的是超级慢了,这类问题怎么解决呢,我们登录后台后,按下F12打开控制台,接着点击network, ...
- JVM GC系列 — GC算法
一.前言 从本篇文章开始,将开始一个新的系列JVM.JVM是一个非常庞大且复制的技术体系,但是对于程序猿的升级,走向更高阶所必要经历的,曾经也下决心要好好学习一番,然而毅力不足都中途放弃. GC的作用 ...
- IDEA maven设置配置
IDEA Maven配置 1. 下载maven 下载地址 从官网上,下载一个压缩包,然后解压到任意的文件夹 Maven的安装必须需要jdk1.7+ 2. 环境变量设置 M2_HOME改为具体的路径,其 ...
- Docker是什么、为什么是一种趋势
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来.并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响.那么我就不需要专门运送水果的船和专门运 ...
- JS中for,for...in,for...of以及foreach循环的用法
1.for()循环 // for循环的表达式之间用的是;号分隔的,千万不要写成, for (初始化表达式1; 判断表达式2; 自增表达式3) { // 循环体4 } 2.for...in索引遍历 va ...
- JAVA的基本语法1
1.关键字 关键字的定义和特点 定义:被JAVA语言赋予了特殊含义,用作专门用途的字符串(单词). 就是在java语言编程的时候,在关键的地方使用的单词,体现关键的地方的含义.这些单词都是特有的,并且 ...
- JS基础语法---do-while循环 + 总结while循环和do-while循环
1. 总结:while循环和do-while循环 while循环特点:先判断,后循环,有可能一次循环体都不执行 do-while循环特点:先循环,后判断,至少执行一次循环体 对比体会: 1. ...
- webpack打包配置禁止html标签全部转为小写
用webpack打包页面,发现html中特别写的用来给后端识别的大写标签全部被转为了小写标签,这时候需要将加一个配置 ,caseSensitive:true ,禁止大小写转换. webpack配置: ...