Vue

183 阅读4分钟

SPA的理解

在页面初始化时,加载所有的资源。加载完成之后,页面的所有操作对于后端服务器来说是没有感知的。

优点

  1. 用户体验比较好,页面的跳转不需要重新加载整个页面资源
  2. 前后端解耦,前端负责交互逻辑,后端负责数据处理
  3. 对于服务端压力比较小

缺点

  1. 初次加载时,比较耗费时间。【所以要通过缩短首屏时间来优化】
  2. 需要前端自己管理路由,不能使用浏览器的前进和后退功能
  3. 不利于浏览器的SEO

MVC

  1. M —— model : 数据
  2. V —— view : 视图
  3. C —— controller:控制器

方式一

方式二

MVVM

理解

  1. M —— model : 对应vue实例中的data
  2. V —— view: 对应vue组件中的template模板
  3. VM —— v-model:对应vue实例中的操作,view通过事件监听影响model,model通过数据绑定影响view

优点

  1. 数据和视图分离,降低代码的耦合性,提高视图和逻辑的重用性。
  2. 以数据驱动视图:只关心数据的变化,DOM操作被封装
  3. 有利于自动化测试

jquery和使用框架的区别

  1. react的组件化、vue中数据和视图分离:方便维护、组合、扩展。
  2. 以数据驱动视图:只关心数据的变化,DOM操作被封装。
  3. 生态: 现代前端框架都有自己的生态。
  4. 开发效率:数据驱动视图,不需要手动的操作DOM。

创建项目

  1. 安装vue-cli工具
npm install -g @vue/cli

yarn global add @vue/cli
  1. 创建vue项目
vue create myproject
  1. autoprefixer是一款自动管理浏览器前缀的插件,它可以解析CSS文件并且添加浏览器前缀到CSS内容里。

cube-ui 的使用

vue add cube-ui

创建后的项目中的.babelsrc文件

vue三要素

响应式 :即修改data属性之后,vue立刻监听到变化

vue首先将data上的属性代理到vm(vue实例)上

var vm = {}
var data = {
    price : 100,
    name : ’zhagnshan
}

vue如何监听data的每个属性的变化

  1. Object.defineProperty
  2. 模拟

data属性如何被带了到vm上

var vm = {}
var data = {
	price:100,
	name:'zhangsan'
}
var key, value
for(key in data){
	(function(key){
		Object.defineProperty(vm,key,{
			get:function(){
				console.log('get')
				return data[key]
			},
			set:function(newVal){
				console.log('set')
				data[key] = newVal
			}
		})
	})(key)
}

模板引擎: vue的模板如何被解析,指令如何处理

模板是什么?

  1. 模板的本质是带有逻辑的字符串
  2. 模板最终会通过JS代码(render函数)转换成html代码渲染到页面中

render函数

  • render函数的实现使用了with语法,with(this)中this指向vue实例
  • render函数执行返回的是_c()的返回值,即vnode

渲染:vue的模板如何被渲染成html?以及数据变化后的渲染过程

通过vm.update()函数将render函数返回的结果渲染到页面上

vm._update(vnode){
    const preVnode = vm._vnode
    vm._vnode = vnode
    if(!prevVnode){
        vm.$el = vm.__patch__(vm.$el,vnode)
    }else{
        vm.$el = vm.__patch__(prevVnode,vnode)
    }
}
function updateComponent(){
    vm._update(vm.render()) //vm.render()返回vnode
}

vue的整个实现流程

  1. 将模板解析成render函数: code.render可以打印render函数
  • render函数中使用了with,render函数返回vnode
  • 模板中的信息都被render函数包含
  • 模板中用到的data属性,都会变成js变量
  • 模板中的v-model v-for v-on都变成了js逻辑
  1. 响应式监听
  • Object.defineProperty实现get set
  • data上的属性代理到vm上(使用了with语法)
  1. 首次渲染,显示页面,绑定依赖【待补充】
  • 初次渲染,执行updateComponent,执行vm._render(),执行vm._update(),会走到vm.__patch__方法
  • 会访问到vm.list和vm.title,会被响应式的get方法监听到

注意: 为何要监听get,不只是监听set?

  • data中有很多属性,有些会被用到,有些可能不被用到,被用到的才会走get,没被用到的不会走get
  • 未走到get中的属性,set的时候我们也无需关心
  • 避免不必要的重复渲染
  1. data属性变化,触发rerender
  • 修改属性,被响应式的set监听到
  • set中执行updateComponent,重新执行vm._render(),生成的vnode和preVnode,被patch进行对比,渲染成HTML到页面中

v-if和v-show的区别

  1. v-if:页面压根就不会渲染DOM,适合在运行时很少改变条件,不会频繁切换的情况下使用。
  2. v-show:将元素的display属性设置为none,v-show适合在运行时频繁切换。

vue常用的修饰符?

vue-cli 工程常用的 npm 命令有哪些?

vue中 keep-alive 组件的作用?