前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版

Vue学习总结(一)

首页2017-03-19 12:24:08Front-End
Vue

# 一、介绍

  • Vue是一套构建用户界面的 渐进式框架。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。

# 二、Vue实例

构造器

  • 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的
var vm = new Vue({
// 选项
})
@前端进阶之旅: 代码已经复制到剪贴板
  • 在实例化 Vue 时,需要传入一个选项对象,它可以包含数据、模板、挂载元素、方法、生命周期钩子等选项。全部的选项可以在 API 文档中查看

属性与方法

  • 每个 Vue 实例都会代理其 data 对象里所有的属性
var data = { a: 1 }
var vm = new Vue({
data: data
})
vm.a === data.a
// -> true
// 设置属性也会影响到原始数据
vm.a = 2
data.a // -> 2
// ... 反之亦然
data.a = 3
vm.a // -> 3
@前端进阶之旅: 代码已经复制到剪贴板
  • 除了 data 属性, Vue 实例暴露了一些有用的实例属性与方法。这些属性与方法都有前缀 $ ,以便与代理的data 属性区分。例如:
var data = { a: 1 }
var vm = new Vue({
el: '#example',
data: data
})
vm.$data === data
// -> true
vm.$el === document.getElementById('example')
// -> true
// $watch 是一个实例方法
vm.$watch('a', function (newVal, oldVal) {
// 这个回调将在 `vm.a` 改变后调用
})
@前端进阶之旅: 代码已经复制到剪贴板

实例生命周期

var vm = new Vue({
data: { a: 1 },
created: function () {
// `this` 指向 vm 实例
console.log('a is: ' + this.a)
}
})
// -> "a is: 1"
@前端进阶之旅: 代码已经复制到剪贴板
  • 也有一些其它的钩子,在实例生命周期的不同阶段调用,如 mounted 、 updated 、 destroyed 。钩子的 this 指向调用它的 Vue 实例。一些用户可能会问 Vue.js 是否有“控制器”的概念?答案是,没有。组件的自定义逻辑可以分布在这些钩子中

生命周期图示

生命周期图示

# 三、模板语法

  • Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析。

  • 在底层的实现上, Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。

# 插值

文本

  • 数据绑定最常见的形式就是使用 “Mustache” 语法(双大括号)的文本插值
<span>Message: {{ msg }}</span>
@前端进阶之旅: 代码已经复制到剪贴板
  • Mustache 标签将会被替代为对应数据对象上 msg 属性的值。无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新
  • 通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上所有的数据绑定
<span v-once>This will never change: {{ msg }}</span>
@前端进阶之旅: 代码已经复制到剪贴板

纯 HTML

  • 双大括号会将数据解释为纯文本,而非 HTML 。为了输出真正的 HTML ,你需要使用v-html指令:
<div v-html="rawHtml"></div>
@前端进阶之旅: 代码已经复制到剪贴板
  • 被插入的内容都会被当做 HTML —— 数据绑定会被忽略
  • 你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用HTML 插值,绝不要对用户提供的内容插值

属性

  • Mustache 不能在 HTML 属性中使用,应使用 v-bind 指令:
<div v-bind:id="dynamicId"></div>
@前端进阶之旅: 代码已经复制到剪贴板

使用 JavaScript 表达式

  • 对于所有的数据绑定, Vue.js都提供了完全的 JavaScript 表达式支持。
{{ number + 1 }}{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id"></div>
@前端进阶之旅: 代码已经复制到剪贴板
  • 这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析

过滤器

  • Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。过滤器应该被添加在 mustache 插值的尾部,由“管道符”指示:
{{ message | capitalize }}
@前端进阶之旅: 代码已经复制到剪贴板

指令

  • 指令(Directives)是带有v-前缀的特殊属性。指令属性的值预期是单一 JavaScript 表达式(除了v-for ,之后再讨论)
  • 指令的职责就是当其表达式的值改变时相应地将某些行为应用到 DOM 上
<p v-if="seen">Now you see me</p>
@前端进阶之旅: 代码已经复制到剪贴板
  • 这里, v-if 指令将根据表达式 seen 的值的真假来移除/插入<p>元素

参数

  • 一些指令能接受一个“参数”,在指令后以冒号指明。例如,v-bind指令被用来响应地更新 HTML 属性
<a v-bind:href="url"></a>
@前端进阶之旅: 代码已经复制到剪贴板
  • 在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定

  • 另一个例子是 v-on 指令,它用于监听 DOM 事件:

<a v-on:click="doSomething">
@前端进阶之旅: 代码已经复制到剪贴板

修饰符

  • 修饰符(Modifiers)是以半角句号.指明的特殊后缀,用于指出一个指令应该以特殊方式绑定
  • 例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()
<form v-on:submit.prevent="onSubmit"></form>
@前端进阶之旅: 代码已经复制到剪贴板

缩写

  • v- 前缀在模板中是作为一个标示 Vue 特殊属性的明显标识

  • Vue.js 为两个最为常用的指令提供了特别的缩写

  • v-bind 缩写

<!-- 完整语法 --><a v-bind:href="url"></a>
<!-- 缩写 --><a :href="url"></a>
@前端进阶之旅: 代码已经复制到剪贴板
  • v-on 缩写
<!-- 完整语法 -->
<a v-on:click="doSomething"></a>

<!-- 缩写 -->
<a @click="doSomething"></a>
@前端进阶之旅: 代码已经复制到剪贴板

# 四、计算属性

  • 在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作。在模板中放入太多的逻辑会让模板过重且难以维护。例如:
<div id="example"> {{ message.split('').reverse().join('') }}</div>
@前端进阶之旅: 代码已经复制到剪贴板
  • 在这种情况下,模板不再简单和清晰。在实现反向显示 message 之前,你应该确认它。这个问题在你不止一次反向显示 message 的时候变得更加糟糕。
  • 这就是为什么任何复杂逻辑,你都应当使用计算属性

基础例子

<div id="example"> 
   <p>Original message: "{{ message }}"</p> 
   <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
@前端进阶之旅: 代码已经复制到剪贴板
var vm = new Vue({ 
	el: '#example', data: { message: 'Hello' }, 
	computed: {
	  //a computed getter 
	reversedMessage: function () { 
	  // `this` points to the vm instance 
	return this.message.split('').reverse().join('')
} }})
@前端进阶之旅: 代码已经复制到剪贴板
  • 结果:

    • Original message: “Hello”
    • Computed reversed message: “olleH”
  • 这里我们声明了一个计算属性 reversedMessage 。我们提供的函数将用作属性

计算缓存 vs Methods

  • 你可能已经注意到我们可以通过调用表达式中的method来达到同样的效果:
<p>Reversed message: "{{ reverseMessage() }}"</p>
@前端进阶之旅: 代码已经复制到剪贴板
// in component
methods: {
reverseMessage: function () {
	return this.message.split('
	').reverse().join('') 
}}
@前端进阶之旅: 代码已经复制到剪贴板
  • 不经过计算属性,我们可以在 method 中定义一个相同的函数来替代它。对于最终的结果,两种方式确实是相同的。然而,不同的是计算属性是基于它的依赖缓存。计算属性只有在它的相关依赖发生改变时才会重新 取值。这就意味着只要 message 没有发生改变,多次访问reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。

  • 这也同样意味着如下计算属性将不会更新,因为 Date.now() 不是响应式依赖:

computed: { now: function () { return Date.now() }}
@前端进阶之旅: 代码已经复制到剪贴板
  • 相比而言,每当重新渲染的时候,method 调用总会执行函数

  • 我们为什么需要缓存?假设我们有一个重要的计算属性 A ,这个计算属性需要一个巨大的数组遍历和做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用 method 替代

计算属性 vs Watched Property

  • Vue.js 提供了一个方法 $watch ,它用于观察 Vue 实例上的数据变动

计算 setter

  • 计算属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
// ...
computed: {
fullName: { 
   // getter 
	get: function () { 
		return this.firstName + ' ' + this.lastName 
	}, 
	// setter 
	set: function (newValue) {
		var names = newValue.split(' ') 
		this.firstName = names[0] 
		this.lastName = names[names.length - 1] 

	}
}}
@前端进阶之旅: 代码已经复制到剪贴板
  • 现在在运行 vm.fullName = 'John Doe' 时, setter 会被调用, vm.firstName 和vm.lastName 也会被对应更新

观察 Watchers

fe
  • 一、介绍
  • 二、Vue实例
  • 三、模板语法
    • 插值
  • 四、计算属性
  • 五、Class与Style绑定
    • Class 与 Style 绑定
    • 绑定 HTML Class
    • 绑定内联样式
  • 六、条件渲染
  • 七、列表渲染
  • 八、事件处理器
  • 九、表单控制绑定
  • 十、组件
    • 什么是组件?
    • 使用组件
    • Props
  • 十一、附录
    • 附录一 MVC、MVP、MVVM模式对比
      • MVC
        • 什么是MVC
        • 模型(数据保存)
        • 视图(用户界面)
        • 控制器(业务逻辑)
        • 总结一下:
      • 互动模式
      • MVP
      • MVVM
    • 附录二 vue与其他框架的对比
      • React
      • angular1

← 浅谈闭包前端面试题整理 →