-
{{ index + 1 }}.
- 所属专栏:【Vue2】
- 作 者:长安不及十里
- 工作:目前从事电力行业开发
- 目标:全栈开发
- 个人简介:一个正在努力学技术的Java工程师,专注基础和实战分享 ,欢迎咨询!
- 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信
- 格言:把戏把戏要过手
前端技术开发在过去的十年里经历了从HTML、CSS到JavaScript的演变。在这个历程中,前端工程师的角色也发生了变化,他们不再只是单纯的代码开发者,还需要与设计师、产品经理、运营人员等其他团队成员协作,共同完成网站的开发。
Vue是什么?
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
Vue的作者?
尤雨溪
Vue的特点?
Vue vs Anguar?
我们第一个项目由于是Angualr编写的项目,再次我想比较一下他的区别
Vue.js 是轻量级的开发框架,很适合开发小规模灵活的 Web 应用程序;而 Angular 尽管学习曲线较为陡峭,但却是构建完整复杂应用的好选择。
For
{{msg}}
每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的:
var vm = new Vue({
// 选项
})
虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例。
当创建一个 Vue 实例时,你可以传入一个选项对象。这篇教程主要描述的就是如何使用这些选项来创建你想要的行为。作为参考,你也可以在 API 文档中浏览完整的选项列表。
MVVM模型:
Vue 实例:https://v2.cn.vuejs.org/v2/api/#%E9%80%89%E9%A1%B9-%E6%95%B0%E6%8D%AE
我们打开开发者工具F12,打印app Vue实例
目前我们就介绍这两个,后面遇到了自己查文档,打开调试工具观察Vue实例
For
{{msg}}
{{1==0}}
{{1>0}}
{{1<0}}
指令 (Directives) 是带有 v- 前缀的特殊 attribute。
指令 attribute 的值预期是单个 JavaScript 表达式 (v-for 是例外情况,稍后我们再讨论)。
指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。
这里我也不介绍完了,自己可以去查看官网,介绍我认为难理解的
For
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fortitle>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
head>
<body>
<div id="app">
<h1 style="color: #f70303;">{{ message }}h1>
<button v-on:click="reverseMessage">逆转消息button>
<button @click="reverseMessage">简写逆转消息button>
<button @click="reverseMessage('hello v-on')">传参逆转消息button>
div>
<script>
// 创建Vue实例
var app = new Vue({
// 挂载点: 通过id选择器找到挂载点
el: '#app',
// 数据
data: {
// 是否展示
message: 'Hello Vue!'
},
// 方法
methods: {
// 逆转消息
reverseMessage: function () {
this.message = this.message.split('').reverse().join('')
},
// 传参逆转消息
reverseMessage: function (message) {
this.message = message.split('').reverse().join('')
}
},
})
script>
本文又介绍了Vue的一个实例 ,方法区:
methods
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fortitle>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
head>
<body>
<div id="app">
<h1 style="color: #f70303;">{{ message }}h1>
<button v-bind:style="{color:color}">v-bindbutton>
<div :class="class1">classdiv>
<button :style="{color:color}">简写v-bindbutton>
<button @click="changeColor">改变颜色button>
div>
<script>
// 创建Vue实例
var app = new Vue({
// 挂载点: 通过id选择器找到挂载点
el: '#app',
// 数据
data: {
// 是否展示
color: '#f70303',
message: 'Hello Vue!',
tiele: 'Hello Vue!',
class1: 'box',
},
// 方法
methods: {
// 改变颜色
changeColor: function () {
this.color = '#03f7f7',
this.class1 = 'box1'
},
},
})
script>
<style>
.box {
width: 100px;
height: 100px;
background-color: #f70303;
}
.box1 {
width: 100px;
height: 100px;
background-color: #03f7f7;
}
style>
<img v-bind:src="imageSrc">
<button v-bind:[key]="value">button>
<img :src="imageSrc">
<button :[key]="value">button>
<img :src="'/path/to/images/' + fileName">
<div :class="{ red: isRed }">div>
<div :class="[classA, classB]">div>
<div :class="[classA, { classB: isB, classC: isC }]">div>
<div :style="{ fontSize: size + 'px' }">div>
<div :style="[styleObjectA, styleObjectB]">div>
<div v-bind="{ id: someProp, 'other-attr': otherProp }">div>
<div v-bind:text-content.prop="text">div>
<my-component :prop="someThing">my-component>
<child-component v-bind="$props">child-component>
<svg><a :xlink:special="foo">a>svg>
For
- {{index}}--{{ item.name }}
这个key属性有什么作用呢?
For
姓名:{{name}}
密码:{{password}}
性别:{{sex}}
**lazy **
在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符,从而转为在 change 事件_之后_进行同步:
| ```vue
**number **
如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符:
| ```vue
|
| --- |
这通常很有用,因为即使在 type="number" 时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat() 解析,则会返回原始的值。
**trim **
如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符:
| ```vue
|
| — |
其他的请参考官方文档,或者自己使用时查询文档
2.6 案例
记事本
小黑记事本
-
{{ index + 1 }}.
2.7 扩展
2.7.1 数据代理
Vue的数据代理是一种让Vue实例直接访问data选项中定义的属性的机制,在Vue实例创建时,Vue会使用Object.defineProperty方法重新定义data选项中的属性,并将它们代理到Vue实例本身上,这样,我们就可以通过Vue实例直接访问data选项中定义的属性,而不需要使用this.$data。
侦听属性
- 在这个示例中,我们首先定义了一个名为obj的空对象,然后使用Object.defineProperty方法将一个名为message的属性添加到该对象中。
- 我们定义了message属性的getter和setter方法,这些方法会在属性被访问或修改时被调用。在getter方法中,我们输出当前属性的值,然后返回该值。
- 在setter方法中,我们输出新的属性值,然后将其赋给value变量。
- 当我们使用obj.message访问message属性时,getter方法会被调用,并输出属性的当前值,当我们使用obj.message = ‘Hello, Vue!’ 修改message属性的值时,setter方法会被调用,并输出新的属性值。
- 在Vue中,Object.defineProperty方法被使用来将data选项中的属性转换为具有响应式更新能力的属性。当我们修改Vue实例上的某个属性的值时,实际上会调用该属性的setter方法,从而触发响应式更新。
- 这样,我们就可以实现数据的自动更新,而不需要手动调用更新方法。
2.7.2 列表渲染的Key的唯一性
为啥需要保证key唯一?
⏺️在Vue的列表渲染中,为什么要求每个子组件或元素都必须有一个唯一的key属性呢?这是因为Vue在进行列表渲染时,会基于key属性来判断两个元素是否相同,以便进行优化操作。
⏺️具体来说,当Vue进行列表渲染时,它会为每个子组件或元素创建一个虚拟节点(Virtual Node),这些虚拟节点会被缓存在内存中,以便在列表数据发生变化时进行比较和更新。在创建虚拟节点时,Vue会根据每个子组件或元素的key属性来判断它们是否相同。
⏺️如果两个子组件或元素的key属性相同,则它们被认为是同一个元素,并且不需要重新渲染;如果两个子组件或元素的key属性不同,则它们被认为是不同的元素,并且需要重新渲染。
For
- {{index}}--{{ item.name }}
我们来总结下:
- Vue会监测数据源数组(如items)的变化,当数组发生变化时,Vue会重新计算虚拟DOM树并比较新旧DOM树之间的差异。
- 对于新旧DOM树之间的每个元素,Vue会根据其key属性来判断它们是否是同一个元素。如果两个元素的key相同,则Vue认为它们是同一个元素,会对其进行更新操作;否则Vue会将其视为不同的元素,会对其进行添加或删除操作。
- 当Vue判断出需要对一个元素进行更新操作时,Vue会根据元素对应的虚拟DOM节点(如VNode)的属性来更新DOM节点的状态,例如更新文本内容、样式、属性等。在更新DOM节点的过程中,Vue也会更新对应的数据源数组中的元素。
- 当Vue判断出需要对一个元素进行添加或删除操作时,Vue会在DOM树中插入或删除对应的DOM节点,并更新数据源数组的长度和索引。
- 当列表中的元素数量非常大时,Vue可能会采用一些优化策略来提高渲染性能,例如使用对象池来复用已有的DOM节点,使用异步更新队列来合并多个更新操作等。