react的mvc和vue的mvvm

vue的mvvm属于双向绑定,view层,model数据层,vm实现双向绑定的控制层

此种模式,再某一类项目种很有优势:管理系统 ( OA, ERP , CRM , CMS.....) ,因为其中存在着大量表单操作

react的mvc属性单向数据绑定,view层,model层(数据),controller(控制层)

1.两种都是操作数据来影响视图的,告别了传统操作DOM的时代

model层控制view层

  • Vue基于数据劫持,拦截到最新的数据,从而重新渲染视图
  • React是提供对应的API,通过我们操作API,让最新数据渲染视图

2.都一定存在DOM的差异化渲染 (DOM DIFF)

每一次数据更改,只把需要改变的视图部分进行渲染

3.react默认只实现了单向控制(只有数据影响视图),而vue基于v-model实现了双向控制 (其实,在视图影响数据方式上,我们自己也能实现,即react也能实现双向绑定)

题外话:在前后端整个项目的结构上,vue和react也算是只有v层,即视图层,mvc也是整个项目架构的名词(model层 :创建数据模型,controller:业务层,实现各种业务逻辑,view层,即前端层),这里的react和vue都只能说是前端 *局部 * 的mvc和mvvm

脚手架

官方脚手架:create-react-app

$npm i -g create-react-app
$create-react-app xxx 基于脚手架创建项目
$npm start / build 生成项目
$npm eject 暴露webpack配置项

还有其他热门脚手架DvaJs , UmiJs(阿里)

脚手架默认安装

-react

-react-dom 开发HTML页面程序 (react-native 开发原生App的)

-react-scripts

和Vue一样,React脚手架也默认把配置好的webpack那些东西隐藏到node_modules中了

=> vue是提供了vue.config.js让用户自己去修改配置项 (详情查看vue cli官方文档)

=>想要修改React中的webpack配置项

1.先把配置项暴露出来 yarn eject / npm run eject

2.细节点: 不可逆转(暴露了不能再隐藏回去)+ 如果有git 先要保存修改项

config webpack配置项

​ |-webpack.config.js

​ |-webpackDevServer.config.js

​ |-path.js 存放各配置的地址文件信息(入口文件等)

​ |.....

scripts

​ |-start.js 开发环境下 npm run start 先执行这个文件

​ |-build.js 生产环境下 npm build 先执行这个文件

​ |......


1.默认情况下,我们会把所有需要开发引入的资源(样式|图片。。。)和编写的模块等都放到SRC目录中(webpack本身就是打包src目录,更具入口的index.js)

2.但是有些东西我们还是需要写在public下的 index.html中

=>页面导入最后打包的css/js ,由于打包后的文件比较大,第一次请求页面需要一点时间,这个时间段内,我们看到的就是白屏效果

1)为了解决白屏效果,我们会在index.html中设置loading效果(这些内容是一加载页面就展示出来)=>这个有对应插件

2)给资源做304缓存

..........

=>有一些模块不支持CommonJs /ES6Module这种导入导出规范,此时需要我们把这些模块在index.html中单独script导入进来

=>还可以把一些公共资源直接在这里导入 (这样webpack打包的时候就不会把内容打包在一起了)

配置向后兼容

  • browserList
  • Polyfill

JSX基础语法与JSX语法的优点

jsx :javascript and xml

其实也可以将xml理解为html ,但是这里的html代码并不是直接运行,更像是xml里我们为标签定义意义

jsx的基本使用:

1.最外层只能有一个根节点(一般用空标记,因为如果用div,会真实渲染一个没有真正意义只用来包裹的div)

2.动态数据绑定用 : {}  ,{}中存放js表达式(js执行代码得有返回的结果)

	=>{}中可以放数组:把数组中的每一项都呈现,不含逗号

	=>{}中一般情况不能放对象,

	=> 但是如果是jsx的虚拟DOM对象,是直接可以渲染的   

3.设置行内样式,必须是style = {{ color:'red'}}  ,设置样式类名需要使用的是className而不是class

4.jsx中进行的判断一般都要基于三元运算符来完成

5.jsx中遍历数组中的每一项,动态绑定多个jsx元素,一般都是基于数组中的map来实现(map迭代数组的同时,支持返回值)(和vue一样,循环的对象也要加key值)
=>我们要在ul li中渲染 let arr= [{name:'张三',age:25},{name:'李四',age:26}]
=>就需要这样:<ul>
{arr.map((item,index)=>{
return <li>
姓名:{item.name}
年龄:{item.age}
})}
<ul>
JSX的优点:
1.JSX语法具备很强的编程性,这是vue中模板语法不具备的,所以vue从新版本(v2.xx)开始,支持了jsx语法
=>举例:我们传回一个数据,根据这个数据的不同的,渲染不同的组件,在vue的template语法中,我们要写一堆html代码,每个不同的组件都需要写出来,然后根据if-else来控制display的隐藏于显示来控制具体需要展示哪一个,而在jsx语法中,我们可以使用代码将html结构动态的组建起来,比如'h'+this.i ,这个i就可以控制要使用第几档的标题标签
=>这就是jsx的强编程性和template的弱编程性
2.JSX语法具备过滤效果(过滤非法内容),有效防止XSS攻击
=>自行了解XSS安全优化

把JSX语法=>虚拟DOM对象=>真实DOM

1.基于babel-preset-react-app把JSX语法变为React.createElement的模式
=>如div标签都会转换成React.createElement("div",null,React.createElement(..))
=>React.createElement的第一个属性为div的标签名,第二个为标签的属性(对象),第三个为子元素
=>每遇到元素标签(或者组件)都要createElement React.createElement = function (type,props,...children){
let jsxOBJ ={
type:type
props:{}
};
//=>传递了属性,把传递的属性都放置到jsx-OBJ的props中
if(props !==null){
//基于es6实现浅克隆
jsxOBJ.props= {...props}
}
//=>如果传递了子元素,还需要给jsxOBJ的props中设置children属性
if(children.length > 0){
jsxOBJ.props.children = children;
//如果只有一项,则把第一项赋值给jsxOBJ.props.children即可
if(children.length ===1){
jsxOBJ.props.children = children[0]
}
} return jsxOBJ;
}; 2.基于React.createElement方法的执行,创建出虚拟DOM对象(jsx对象)
=>首先是一个对象
=>type属性存储的是标签名(或者组件)
=>props属性:没有传递任何属性,也没有任何的子元素,则为空对象,把传递给createElement的属性,都赋值给props;如果有子元素,则默认新增一个children的属性,可能是一个值,也可能是一个数组 3.基于ReactDOM.render把创建的虚拟DOM对象渲染到页面指定的容器中
=>ReactDOM.render([JSX-OBJ],[container],[callback])
=>参数意义:1.虚拟dom 2.容器 3.回调函数(在这个回调函数中,可以获取到真实的dom,只不过项目中一般不用这个参数) ReactDOM.render = function render (jsxobj ,container,callback){
let {type ,props}= jsxOBJ;
//=>创建dom元素
if(typeof type === "string"){
//创建dom对象(真实dom)
let element = document.createElement(type);
//给dom设置传入的属性
for(let key in props){
if( !props.hasOwnProperty(key)) break;
if(key === 'className'){
element.setAttribute('class',props[key]);
continue;
}
if(key === 'style'){
let styOBJ = props['style']
for(let attr in styOBJ){
if(!styOBJ.hasOwnProperty(attr)) break;
element.style[attr] = styOBJ;
}
}
//关于子元素的处理
if(key === 'children'){
//统一为数组
let children = props['children'];
!Array.isArray(children) ? children = [children] : null ;
//循环子元素
children.forEach(item=>{
//如果是文本,直接创建文本节点赋值给element即可,如果是新的虚拟dom对象则需要重复调用render方法,把新建的dom对象增加给element(递归)
if(typeof item ==== "string"){
element.appendChild(document.createTextNode(item))
return;
}
render(item,element);
});
continue;
}
element.setAttribute(key,props[key]);
}
//增加到指定容器当中
container.appendChild(element);
//触发回调函数
callback && callback()
}; }

react脚手架和深入理解jsx语法的更多相关文章

  1. React中最基础的jsx语法

    import React, { Component } from 'react'; class App extends Component { render() { return ( <div ...

  2. React.js学习之理解JSX和组件

    在开启JSX的学习旅程前,我们先了解一下React的基本原理.React本质上是一个"状态机",它只关心两件事:更新DOM和响应事件,React不处理Ajax.路由和数据存储,也不 ...

  3. react系列(一)JSX语法、组件概念、生命周期介绍

    JSX React中,推出了一种新的语法取名为JSX,它给了JS中写HTML标签的能力,不需要加引号.JSX的语法看起来是一种模板,然而它在编译以后,会转成JS语法,只是书写过程中的语法糖. JSX的 ...

  4. 【原创】React实例入门教程(1)基础API,JSX语法--hello world

    前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发效率 ...

  5. React高级教程(es6)——(1)JSX语法深入理解

    从根本上来说,JSX语法提供了一种创建React元素的语法糖,JSX语句可以编译成: React.createElement(component, props, …children)的形式,比如: & ...

  6. react实战项目开发(2) react几个重要概念以及JSX语法

    前言 前面我们已经学习了利用官方脚手架搭建一套可以应用在生产环境下的React开发环境.那么今天这篇文章主要先了解几个react重要的概念,以及讲解本文的重要知识JSX语法 React重要概念 [思想 ...

  7. 小白学习React官方文档看不懂怎么办?2.JSX语法

      接下来我们就要讲到JSX语法了,在我们讲它之前,我们先引入一个概念叫语法糖.     听到这个名字首先我们可能会想到一个词叫”糖衣炮弹“,那么什么叫糖衣炮弹呢,就是给你说各种好听的话,来迷惑你,但 ...

  8. React JSX语法说明

    原文:http://my.oschina.net/leogao0816/blog/379487 什么是JSX? 在用React写组件的时候,通常会用到JSX语法,粗看上去,像是在Javascript代 ...

  9. Webstorm 不识别es6 import React from ‘react’——webstorm不支持jsx语法怎么办

    2016-10-31更新 webstorm不支持es6语法怎么办? webstorm不支持jsx语法怎么办? 参考:webstorm不支持jsx语法怎么办 I spent ages trying to ...

随机推荐

  1. Docker最全教程——从理论到实战(十)

    终于按时完成第二篇.本来准备着手讲一些实践,但是数据库部分没有讲到,部分实践会存在一些问题,于是就有了此篇以及后续——数据库容器化.本篇将从SQL Server容器化实践开始,并逐步讲解其他数据库的容 ...

  2. shell问题汇总

    1. sudo执行脚本找不到变量 当普通用户下,设置并export一个变量,然后利用sudo执行echo命令,能得到变量的值,但是如果把echo命令写入脚本,然后再sudo执行脚本,就找不到变量,未能 ...

  3. 题解 【Codeforces988E】Divisibility by 25

    本题是数论好题! 首先我们需要了解一个关于数论的性质: 一个数只要后两位能被25(或4)整除,这个数就能被25(或4)整除. 同理,后三位:(或8).后四位:(或16)亦是如此. 所以,我们只需要判断 ...

  4. Echart 地图实例

    1.地图实例 function func_InEchart() { require.config({ paths: { echarts: '../Scripts/echart2/echarts' }, ...

  5. css样式读取

    在做页面改写时,发现外部引入的样式表中一部分的样式起作用,另一部分的样式没有用.无论怎么修改都没有用.最后搜索了下答案,发现是css样式文件与需引入的文件编码不一致.导致样式读取不到或者读取到一半.

  6. 总结下抽象类Abstract和虚方法Virtual(易混点)

    1.普通类中可以有普通方法和虚方法,在被继承时,虚方法可以选择重写(override)或者不重写 2.抽象类中可以有普通方法和虚方法和抽象方法,当被继承时 如下 1.普通方法不能被子类重写 2.虚方法 ...

  7. moment of 2019.08.15

    一件事,足以影响一个人的一生,准确的说,是两个人的人生轨迹. 人生中的遇见,有的是幸运,有的是不幸.2018.4的遇见,是我人生中的不幸,至少到目前为止,确实是不幸,从各个方面让我的生活不如以前. 如 ...

  8. 【C语言】多维数组

    C 语言支持多维数组.多维数组声明的一般形式如下: type name[size1][size2]...[sizeN]; 二维数组 多维数组最简单的形式是二维数组.一个二维数组,在本质上,是一个一维数 ...

  9. 每天进步一点点------Allegro 铺铜详解

    铺铜在设计PCB板时很重要,为了加深理解,笔者写下这篇学习的过程. 首先要理解什么是正片和负片,结合网上的资料来理解一下: 正片实际就是能在底片上能看到的就是存在的 负片实际上就是在底片看到的就是不存 ...

  10. (转)java内存分配分析/栈内存、堆内存

    转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...