Vue2 学习
Vue 简介
Vue 是一套用于构建用户界面的 渐进式框架 。
与其它大型框架不同的是,Vue 采用自底向上增量开发的设计。
Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用。
Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
最初它不过是个人项目,时至今日,已成为全世界三大前端框架之一,github 上拥有 19.8万 Star。 领先于 React 和 Angular,在国内更是首选。
Vue是什么?
-
定义:以数据驱动视图的MVVM渐进式框架
- 数据:对象
- 视图:dom标签 –> 虚拟dom
- MVVM:M model模型,V view视图。就是一种框架架构,model-view view-model, 这样的结构,主要优势在于监控者数据双向绑定的特性,vue和model之间是双向数据传递的。视图改变数据就可以改变,数据改变视图就可以改变。
- 渐进式:轻量级框架,可以选择性的,只使用vue中很少的一部分,而不是必须使用全部
BTW——MVC和MVVM
-
MVVM有两个方向:
- 将model(模型)转化成 view(视图),即后端传递的数据转化成所看到的页面。实现方式为数据绑定
- 将view(视图)转化成 model(模型),即将所看的页面转化成后端的数据。实现方式为dom监听事件
-
什么是mvc?
- MVC是model-view-controller的缩写,即模型——视图——控制器。M和V指的意思和MVVM中的M和V意思一样。C即Controller指的是页面业务逻辑。使用MVC的目的就是将M和V的代码分离。MVC是单向通信。也就是View跟Model,必须通过Controller来承上启下。
-
区别:
- MVC和MVVM的区别并不是VM完全取代了C,只是在MVC的基础上增加了一层VM,只不过是弱化了C的概念,ViewModel存在目的在于抽离Controller中展示的业务逻辑,而不是替代Controller,其它视图操作业务等还是应该放在Controller中实现。
- View更新的时候,必须要通过Controller去更新一遍Model;同样的Model更新的时候,也要去更新一遍视图。
[!MVVM优点]:
实现的是业务逻辑组件的重用,使开发更高效,结构更清晰,增加代码的复用性。
vue.js核心?
- 官方定义:通过尽可能简单的API实现响应的数据绑定和组合的视图组件
数据驱动
- 传统js手动改变DOM来改变视图,vue.js只需要改变数据就会自动改变视图,就是MVVM思想的实现
视图组件化
- 定义:把网页拆分一个个区块,每个区块我们可以看成一个组件。网页由多个组件拼接或嵌套组成
vue的特点
- 响应式编程:编写代码基于对变化的反应
- 组件化
组件和模块
-
组件:把重复代码提取出来合并成为一个组件,组件最重要的是复用,位于框架最底层,其他功能依赖于组件,可供不同功能使用,独立性强
-
模块:分属同一功能/业务的代码进行隔离(分装)成独立的模块,可以独立运行,以页面、功能或其他不同粒度划分程度不同的模块。位于业务框架层,模块间通过接口调用,目的是降低模块间的耦合,由之前的主应用与模块耦合,变为主应用与接口耦合,接口与模块耦合
[比喻]模块就像有多个USB插口的充电宝,可以和多部手机充电,接口可以随意插拔。复用性很强,可以独立管理。 -
组件化模块化区别?
- 组件相当于库,把一些能在项目里或者不同类型项目中可复用的代码进行封装
- 而模块相当于业务逻辑模块,把同一类型项目里的功能逻辑进行需求性的封装
-
为什么要用组件和模块
- 开发和调式效率高
- 可维护性强
- 避免阻断
- 版本管理更容易
vue的优缺点?
- 优点:轻量级框架,数据双向绑定,组件化,虚拟dom,运行速度快
- 缺点:
- 不支持ie678
- 生态环境差不如angular和react
- 社区不大
- 无高阶书籍
- 首屏加载速度满,加载时,将所有的css,js文件进行加载
BTW——首屏加载慢解决方式
- 减少入口文件体积
- UI框架按需引入
- 静态资源本地缓存
- 图片资源压缩
- 组件重复打包
- 使用SSR(通过对文件、目录、进程、注册表和服务的强制访问控制,有效的制约和分散了原有系统管理员的权限)
BTW——粒度和耦合
- 粒度:计算机中常指系统内存扩展增量的最小值。粒度问题是设计数据仓库的一个最重要方面。粒度是指数据仓库的数据单位中保存数据的细化或综合程度的级别。细化程度越高,粒度级就越小;相反,细化程度越低,粒度级就越大。数据的粒度一直是一个设计问题。
- 耦合:两个东西通过某种作用连接在了一起
vue核心的底层原理
-
Object.defineProperty数据劫持的API
-
Object.defineProperty定义新属性或修改原有的属性,vue的数据双向绑定原理就是Object.defineProperty,里面定义了setter和getter方法,通过观察者模式(发布订阅模式)来监听数据变化,从而做相应的逻辑处理
-
监听对象属性变化,只关心数据不关心视图
-
三个参数- 三个参数Object.defineProperty(object,propName,descriptor)
- object 对象=>给谁加
- propName 属性名=>需要加的属性的名字[类型:String]
- descriptor 属性描述=>加的这个属性有什么特性[类型:Object]
- 方法就是直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
-
属性描述符
-
configurable: true 配置可删除,默认false
-
两个作用:
- 目标属性是否可以使用delete删除
- 目标属性是否可以再次设置特性
-
-
writable:true 配置可修改,默认false
-
enumerable:true 可枚举,使用(for…in或Object,keys())默认false
-
value属性对应的值,可以是任意类型的值,默认undefined
-
缺点:数组的长度
-
语法
1 |
|
- 存取描述符
get
一个给属性提供 getter 的方法,如果没有getter则为undefined。该方法返回值被用作属性值。默认为undefined。getter就是获取属性值
set
一个给属性提供 setter 的方法,如果没有setter则为undefined。该方法将接收唯一参数,并将该参数的新值分配给属性。默认为undefined。setter就是设置属性值
[!注意]:1. 当使用getter或setter方法,不允许使用writable和value这两个属性
- get或set不是必须成对出现,任写其一就行。如果不设置方法,get和set默认undefined
语法
1 |
|
- 兼容性:IE8以下不行
- 使用Object.defineProperty的优点
- 减少代码(少了dom,不需要写很多dom)
- 开发速度快
BTW——数据劫持
- 定义:修改或访问对象的属性时,通过一段代码拦截这个行为,进行额外的操作或者修改返回结果
vue环境搭建
- 环境需要:nodejs 检测cmd:node-v
- 安装全局脚手架:npm i -g @vue/cli 检测:vue-Vyarn global add @vue/cli
- 脚手架网站:cli.vuejs.org
- vue官网: vuejs.org
创建vue项目
【注意】:项目名称不能是中文,不能是大写字母,不能用vue做名字
命令运行方式
vue create name |
gui图形化方式
vue ui |
vue脚手架
- 定义:vue的cli脚手架底层是webpack,也就是基于webpack封装的
[官网] (https://cli.vuejs.org/zh/guide/)
BTW——是脚手架?
- 什么是脚手架?
- 构建基于数据库的应用,进行增、删、改、查数据库的操作
- Vue-CLi是什么?
- 是vuejs脚手架工具,就是自动帮你生成好项目目录,配置好webpack,以及各种依赖包工具
- 为什么要用?可以帮助你快速开启一个vue项目,给你一套文件结构,包含基础的依赖库,只需要npm install 一下就可以安装,不需要为编译或其他琐碎事而浪费时间,而且不会限制到你发挥
脚手架配置
- vue.config.js文件是脚手架配置文件,该文件必须放在项目的根目录里
请求代理【跨域方案】
脚手架->webpack->nodejs【后端】
使用后端转发请求
【注意】只能在开发环境中使用
【使用场景】在公司里和后端的测试接口进行接口调式使用
语法
1 |
|
关闭源码映射【性能优化】
- productionSourceMap:false
打包的时候,每一个js文件对应生成一个map源码映射文件,它在生产环境中时没有用的。它会增加打包时间,浪费磁盘空间,以及容易造成代码泄漏等问题,因此需要在生产环境中关闭,只允许开发环境中开启
关闭eslint代码校验
- lintOnSave:false
AIA:脚手架配置有哪些?
- 代码校验
- 代码映射的开启与关闭
- 请求代理vue.config.js
vue项目结构
运行命令
- 项目根目录里有一个package.json文件,该文件有一个script对象,里面就是自定义运行命令。(是这三个里唯一一个可以删的)
- serve开发环境,写代码时的环境
- build生产环境,打包发布时的环境
结构
- node_modules它是项目运行时必须依赖
- public公共目录,存放着唯一的html模板
- src【核心-源码】项目所有代码
- .gitignore过滤掉git仓库里不需要的文件清单
- babel.config.js把es6转成es5
- package.lock.json(可以删但一般留着),锁定依赖版本号
- package.json【核心】依赖包管理文件
- README.md说明书
src源码结构
- assets存放静态资源:图片,css,js脚本
- component放组件
- App.vue根组件,第一个被加载的组件
- main.js入口文件,第一个被执行的文件
模块化开发【vue核心亮点】
把一切重复使用的资源,无论是图片,样式还是js代码抽离出来,作为单独的’模块’进行复用
- 模块包含:vue 组件,图片,js 脚本,css 样式,字体等都可以是模块。
vue里的模块化组件开发
- 组件必须使用import引入到当前组件
- 当前组件的components必须挂载引入的组件
- 在当前组件的template里用标签的形式使用挂载的组件
插值
- 渲染文本
- 写在两个大括号中间
插值语法可以写哪些值
- 对象、字符串、数字、数组、布尔值、三元表达式、自执行函数等,凡是具有返回值的都可以,全部变成文本渲染出来
BTW——自执行函数和快速删除文件
自执行函数后面+()
1 |
|
为什么用自执行函数而不是函数
用函数也可以,只不过返回时function(){return 1000},而不是1000
插值语法的作用
- 四则运算 100+(200*300)/2
- 插值里存放变量 (详情请找baseVue.html)
npkill和rimraf快速删除node_modules包
- 全局安装npm i -g npkill
- 进入想清理的文件夹
- cd文件路径
- 输入npkill
- 会自动查找文件中node_modules
- 光标上下移动来选择要清理的目录,释放宝贵的空间
- 按空格删除
内置方法
$set添加或修改对象和数组
- 添加/修改对象的属性 $set(obj,‘name’,1)
- 添加或修改数组成员$set(arr,index,val)
$delete删除对象和数组
- 删除对象属性$delete(obj,name)
- 删除数组成员$delete(arr,index)