繁星永存 记忆亘古不变

vue 简介

官方给出的概念:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的前端框架

官网链接

vue 的特性

vue 框架的特性,主要体现在如下两方面:

  1. 数据驱动视图

    在使用了 vue 的页面中,vue 会监听数据的变化,从而自动重新渲染页面的结构当页面数据发生变化时,页面会自动重新渲染

  2. 双向数据绑定

    在填写表单时,双向数 据绑定可以辅助开发者在不操作 DOM 的前提下,自动把用户填写的内容同步到数据源中

    开发者不再需要手动操作 DOM 元素,来获取表单元素最新的值

    image-20220815224514594

MVVM 的工作原理

ViewModel 作为 MVVM 的核心,是它把当前页面的数据源(Model)和页面的结构(View)连接在了一起。

  • 当数据源发生变化时,会被 ViewModel 监听到,VM 会根据最新的数据源自动更新页面的结构
  • 当表单元素的值发生变化时,也会被 VM 监听到,VM 会把变化过后最新的值自动同步到Model 数据源中

vue 的使用

基本使用步骤

 <!-- 2. 声明一个被 vue dom 的容器 -->
<div id="app">{{name}}</div>
<!-- 1. 导入 vue -->
<script src="./lib/vue-2.6.12.js"></script>
<script>
// 3.创建 vue 实列对象
const vm = new Vue({
// 3.1指定 vm 要控制的容器区域
el: '#app',
// 3.2指定 Model 数据源
data: {
name: '张山
}
})
</script>

vue 指令

指令是 vue 开发中最基础、最常用、最简单的知识点。

内容渲染指令

指令是 vue 开发中最基础、最常用、最简单的知识点。

v-textv-text指令会覆盖元素内默认的值。

{{ }}:vue 提供的 {{ }} 语法,专门用来解决v-text 会覆盖默认文本内容的问题。这种 {{ }} 语法的专业名称是插值表达式(英文名为:Mustache)

v-htmlv-text指令和{{}}插值表达式只能渲染纯文本内容。v-html可以渲染包含 HTML 标签的字符串渲染到页面上

<div id="app">
// 页面显示 张三 v-text 会覆盖原有的值
<p v-text="name">名字</p>
// 显示 年龄:18
<p>年龄:{{age}}</p>
// h4标题红色字体的 hello world
// t-html会渲染标签
<p v-html="info"></p>
</div>
<script src="./lib/vue-2.6.12.js"></script>
<script>
const vm = new Vue({
el: '#app',
data: {
age: 18,
name: '张三',
info: '<h4 style="color:red;">hello world</h4>'
}
})
</script>

在 vue 提供的模板渲染语法{{}}中,除了支持绑定简单的数据值之外,还支持Javascript 表达式的运算

// 简单运算
{{num + 1}}
// 三元判断
{{ok ? 'yes' : 'no'}}
// 字符串的方法
{{str.splist('').reversr().join('')}}
// 字符串的拼接
<div v-bind:id="'list' + id"></div>

属性绑定指令

v-bind:为元素的属性动态绑定属性值,简写形式(简写为英文的 : )

<!--  为图片动态绑定图片路径-->
<div id="app">
<img v-bing:src="imgUrl" />
<!-- 简写 -->
<img :src="imgUrl" />
</div>
<script src="./lib/vue-2.6.12.js"></script>
<script>
const vm = new Vue({
el: '#app',
data: {
imgUrl:'./img/1.png'
}
})
</script>

事件绑定指令

v-on 事件绑定指令,用来辅助程序员为 DOM 元素绑定事件监听,简写形式(简写为英文的 @ )。通过 v-on 绑定的事件处理函数,需要在 methods 节点中进行声明:

<div id="app">
<button v-on:click="add">按钮1</button>
<!-- 简写 -->
<button @click="add">按钮2</button>
</div>
<script src="./lib/vue-2.6.12.js"></script>
<script>
const vm = new Vue({
el: '#app',
methods:{
add(){
// 函数处理
}
}
})
</script>

原生 DOM 对象有 onclick、oninput、onkeyup 等原生事件,替换为 vue 的事件绑定形式后,
分别为:v-on:click、v-on:input、v-on:keyup

$ event 是 vue 提供的特殊变量,用来表示原生的事件参数对象 event。$event 可以解决事件参数对象event被覆盖的问题

事件修饰符

事件修饰符说明
.prevent阻止默认行为,如 a 链接跳转、表单提交
.stop阻止事件冒泡
.once绑定的事件只触发 1 次
.capture以捕获模式触发事件处理函数
.self只有在 event.target 是当前元素自身时触发事件处理函数
.passive事件的默认行为立即执行,无需等待事件回调执行完毕
<a href="www.baidu.com" @click.prevent="fn">阻止链接跳转</a>

按键修饰符

在监听键盘事件时,我们经常需要判断详细的按键。此时,可以为键盘相关的事件添加按键修饰符

<!-- 按下回车 触发 submit() 函数 -->
<input type="text" @keyup.enter="submit" />
<!-- 按下esc 触发 back() 函数 -->
<input type="text" @keyup.esc="back" />

双向绑定指令

v-model 双向数据绑定指令,用来辅助开发者在不操作 DOM 的前提下,快速获取表单的数据。

经常用于表单元素如 inputtextareaselect

<p>{{ username }}</p>
<input type="text" v-model:value="username" />
<input type="text" v-model="username" />

<p>{{ province }}</p>
<select v-model="province">
<option value="">请选择</option>
<option value="1">北京</option>
<option value="2">上海</option>
<option value="3">广州</option>
</select>

v-model 指令修饰符

修饰符作用示例
.number将用户输入转为数值类型<input v-model.number="age" />
.trim删除输入的首尾空白字符<input v-model.trim="msg">
.lazy当失去焦点时,才更新数据,类似防抖<input v-model.lazy="msg">

条件渲染指令

v-ifv-show:条件渲染指令用来辅助开发者按需控制 DOM 的显示与隐藏

  1. v-show 的原理是:动态为元素添加或移除 display: none 样式,来实现元素的显示和隐藏
    • 如果要频繁的切换元素的显示状态,用 v-show 性能会更好
  2. v-if 的原理是:每次动态创建或移除元素,实现元素的显示和隐藏
    • 如果刚进入页面的时候,某些元素默认不需要被展示,而且后期这个元素很可能也不需要被展示出来,此时 v-if 性能更好

在实际开发中,绝大多数情况,不用考虑性能问题,直接使用 v-if 就好了!!!

v-if 指令在使用的时候,有两种方式:

  1. 直接给定一个布尔值 true 或 false

    <p v-if="true">被 v-if 控制的元素</p>
  2. 给 v-if 提供一个判断条件,根据判断的结果是 true 或 false,来控制元素的显示和隐藏

    <p v-if="type === 'A'">良好</p>

列表渲染指令

v-for: 列表渲染指令,用来辅助开发者基于一个数组来循环渲染一个列表结构。v-for 指令需要使用 item in datas 形式的特殊语法,其中:

  • datas是待循环的数组
  • item是被循环的每一项

v-for 指令还支持一个可选的第二个参数,即当前项的索引。语法格式为 (item, index) in items

使用 key 维护列表的状态

  • 当列表的数据变化时,默认情况下,vue 会尽可能的复用已存在的DOM 元素,从而提升渲染的性能。但这种默认的性能优化策略,会导致有状态的列表无法被正确更新。

  • 为了给 vue 一个提示,以便它能跟踪每个节点的身份,从而在保证有状态的列表被正确更新的前提下,提升渲染的性能。此时,需要为每项提供一个唯一的 key 属性

  • key 是虚拟 DOM 对象的标识,可提高页面更新渲染的效率。当数据变化时,Vue 会根据新数据生成新的虚拟 DOM,随后进行新旧虚拟 DOM 的差异比较

key 的注意事项:

  • key 的值只能是字符串数字类型
  • key 的值必须具有唯一性(即:key 的值不能重复)
  • 建议把数据项 id 属性的值作为 key 的值(因为 id 属性的值具有唯一性)
  • 使用 index 的值当作 key 的值没有意义(因为 index 的值不具有唯一性)
  • 建议使用 v-for 指令时一定要指定 key 的值(既提升性能、又防止列表状态紊乱

过滤器

过滤器(Filters)是 vue 为开发者提供的功能,常用于文本的格式化。过滤器可以用在两个地方:插值表达式和 v-bind 属性绑定。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道符”进行调用

注:vue3 剔除了过滤器相关的功能

<!-- 在插值表达式通过管道符 | 调用 capitalize 过滤器 对 message 格式化 -->
<p>{{message | capitalize }}</p>

<!-- 在 v-bind 通过管道符 | 调用 formatId 过滤器 对 rawId 格式化 -->
<div :id="rawId | formatId"></div>
// 定义私有过滤器
// new vue() 实例所控制的 el 区域内使用
filters: {
capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1)
}
}

// 定义全局过滤器
Vue.filter("capitalize",(str)=>{
return str.charAt(0).toUpperCase() + str.slice(1)
})

如果私有过滤器和全局过滤器冲突,按照就近原则调用私有过滤器。

连续调用多个过滤器

过滤器从左往右调用,将前一个的结果交给下一个过滤器继续处理

<p>{{ message | capitalize | capitalize }}</p>

传递参数

<p>{{ message | capitalize(arg1,arg2) }}</p>
<script>
// 第一个参数永远都是管道符的值
Vue.filter('capitalize',(val,arg1,arg2)=>{
...
})
</script>

watch 侦听器

watch 侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作。

const vm = new Vue({
el: '#app',
data: {
name: '张三',
},
watch:{
// 监听 name 的表化
// newVal 的变化后的值,
// oldVal 的变化之前的值
name(newVal,oldVal){
...
}
}
})

默认情况下,组件在初次加载完毕后不会调用 watch 侦听器。如果想让 watch 侦听器立即被调用,则需要使用 immediate 选项

watch:{
// 监听 name 的表化
// newVal 的变化后的值,
// oldVal 的变化之前的值
name(newVal,oldVal){
...
},
immediate:true
}

如果 watch 侦听的是一个对象,如果对象中的属性值发生了变化,则无法被监听到。此时需要使用 deep 选项

const vm = new Vue({
el: '#app',
data: {
info:{ name: '张三' }
},
watch:{
info:{
handler(newVal,oldVal){
...
}
},
deep:true
}
}
})

计算属性

计算属性指的是通过一系列计算之后,最终得到一个属性值,可以被模板结构和 methods 方法使用

<div id="app">
<div class="box" :style="{ backgroundColor: rgb }">
{{ rgb }}
</div>
</div>
const vm = new Vue({
el: '#app',
data: {
r: 0, g: 0, b: 0
},
computed:{
rgb(){return `rgb( ${this.r}, ${this.g}, ${this.b} )` }
}
})

特点:

  1. 定义的时候,要被定义为“方法”
  2. 在使用计算属性的时候,当普通的属性使用即可

好处:

  1. 实现了代码的复用
  2. 只要计算属性中依赖的数据源变化了,则计算属性会自动重新求值!

评论



本站使用 Volantis 主题设计

:doodle { @grid: 1x5 / 100vmin; } @place-cell: center; width: @rand(45vmin, 75vmin); height: @rand(45vmin, 75vmin); transform: translate(@rand(-120%, 120%), @rand(-80%, 80%)) scale(@rand(.8, 2.8)) skew(@rand(45deg)); clip-path: polygon( @r(0, 30%) @r(0, 50%), @r(30%, 60%) @r(0%, 30%), @r(60%, 100%) @r(0%, 50%), @r(60%, 100%) @r(50%, 100%), @r(30%, 60%) @r(60%, 100%), @r(0, 30%) @r(60%, 100%) ); background: @pick(#f44336, #9c27b0, #673ab7, #3f51b5, #60569e, #e6437d, #ebbf4d, #00bcd4, #03a9f4, #2196f3, #009688, #5ee463, #f8e645, #ffc107, #ff5722, #43f8bf, #e136eb, #32ed39); opacity: @rand(.5, .9); position: relative; top: @rand(-80%, 80%); left: @rand(0%, 80%); animation: colorChange @rand(6.1s, 26.1s) infinite @rand(-.5s, -2.5s) linear alternate; @keyframes colorChange { 100% { left: 0; top: 0; filter: hue-rotate(360deg); } }