vue学习笔记(一)-vue基础语法
创始人
2024-04-19 13:52:21
0

视频教程:尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通_哔哩哔哩_bilibili

相关文档:Vue核心 Vue简介 初识 (yuque.com)

兼容性

Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器。

浏览器工具

插件安装:Installation | Vue Devtools (vuejs.org)

在使用 Vue 时,我们推荐在你的浏览器上安装 Vue Devtools。它允许你在一个更友好的界面中审查和调试 Vue 应用。

引入vue.js

vue.js提供开发版本和生产版本,在开发环境下不要使用压缩版本,不然你就失去了所有常见错误相关的警告!

直接引入最新版本方式:

//开发版本
//生产版本

插值语法

先定义id或class绑定容器,然后用{{xxx}}代替变量值,一般用于标签值。注意:一个容器只能绑定一个Vue实例,是一对一的关系。xxx可以直接读取到 data 中的所有属性,也可以直接执行js语句。data的变量值改变,xxx的值会自动更新。

指令语法

v-bind:标签属性绑定,一般用于标签内属性值,也可以用简写形式,之间用:号代替v-bind:,但不是所有v-标签都可以用简写形式。

v-bind:标签属性绑定定属性值是 js 表达式,可以直接读取到 data 中的所有属性,也可以直接执行js语句。

插值语法和指令语法示例:


模板语法

插值语法

你好,{{ name }}


指令语法

点我去看{{ tencent.name }}1点我去看{{ tencent.name }}2

数据绑定

Vue中有2种数据绑定的方式

1.单向绑定v-bind数据只能从 data 流向页面

2.双向绑定v-model数据不仅能从 data 流向页面,还可以从页面流向 data

注意

1.双向绑定只能应用在有value属性的表单类元素上,如 、、等
2.v-model:value可以简写为v-model,因为v-model默认收集的就是value值

示例


数据绑定
单向数据绑定:
双向数据绑定:

el与data的两种写法

el有2种写法:
1.创建Vue实例对象的时候配置el属性
2.先创建Vue实例,随后再通过vm.$mount(‘#root’)指定el的值

data有2种写法:
1.对象式:data: { }
2.函数式:data() { return { } }

如何选择

目前哪种写法都可以,以后到组件时,data必须使用函数,否则会报错
一个重要的原则

注意

由Vue管理的函数,一定不要写箭头函数,否则 this 就不再是Vue实例了

示例


el与data的两种写法

你好,{{name}}

MVVM

MVVM模型

  • M:模型 Model,data中的数据
  • V:视图 View,模板代码
  • VM:视图模型 ViewModel,Vue实例(包含数据绑定,侦听事件等)

Vue中的MVVM结构:

数据代理

Object.defineproperty方法,数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)


let number = 18
let person = {name: '张三',sex: '男',
}Object.defineProperty(person, 'age', {// value:18,// enumerable:true,		// 控制属性是否可以枚举,默认值是false// writable:true,			// 控制属性是否可以被修改,默认值是false// configurable:true	// 控制属性是否可以被删除,默认值是false// 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值get() {console.log('有人读取age属性了')return number},// 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值set(value) {console.log('有人修改了age属性,且值是', value)number = value}})
// console.log(Object.keys(person))
console.log(person)

Vue将data中的数据拷贝了一份到_data属性中,又将_data里面的属性提到Vue实例中(如name),通过defineProperty实现数据代理,这样通过geter/setter操作 name,进而操作_data中的 name。而_data又对data进行数据劫持,实现响应式

事件处理

基本用法

  • 使用v-on:xxx或@xxx绑定事件,其中 xxx 是事件名
  • 事件的回调需要配置在methods对象中,最终会在vm上
  • methods中配置的函数,不要用箭头函数,否则 this 就不是vm了
  • methods中配置的函数,都是被 Vue所管理的函数,this 的指向是vm或组件实例对象
  • @click="demo"和@click="demo($event)"效果一致,但后者可以传参

事件的基本使用

欢迎来看{{name}}的笔记

事件修饰符

Vue中的事件修饰符

  • prevent 阻止默认事件(常用)

  • stop 阻止事件冒泡(常用)

  • once 事件只触发一次(常用)

  • capture 使用事件的捕获模式

  • self 只有event.target是当前操作的元素时才触发事件

  • passive 事件的默认行为立即执行,无需等待事件回调执行完毕

修饰符可以连续写,比如可以这么用:@click.prevent.stop=“showInfo”


事件修饰符

欢迎来到{{ name }}学习

点我提示信息
div1
div2
  • 1
  • 2
  • 3
  • 4

键盘事件

  • Vue中常用的按键别名
回车:enter删除:delete 捕获“删除”和“退格”键退出:esc空格:space换行:tab,特殊,必须配合keydown去使用上:up下:down左:left右:right
  • Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(多单词小写短横线写法)

  • 系统修饰键(用法特殊)ctrlaltshiftmeta(meta就是win键)

a.配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发指定 ctr+y 使用 @keyup.ctr.yb.配合keydown使用:正常触发事件
  • 也可以使用keyCode去指定具体的按键(不推荐)

  • Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名


键盘事件

欢迎打开{{name}}笔记




计算属性

  • 1.定义:要用的属性不存在,需要通过已有属性计算得来
  • 2.原理:底层借助了Objcet.defineproperty()方法提供的getter和setter
  • 3.get函数什么时候执行?
    a.初次读取时会执行一次
    b.当依赖的数据发生改变时会被再次调用
  • 4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便
  • 5.备注
    a.计算属性最终会出现在vm上,直接读取使用即可
    b.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变
    c.如果计算属性确定不考虑修改,可以使用计算属性的简写形式
姓名案例_计算属性实现
姓:
名:
测试:
// 这里修改 不会调 fullName的get方法全名:{{fullName}}
{fullName}}
-->{fullName}}
-->

侦听属性

基本用法
watch侦听属性

  • 1.当被侦听的属性变化时,回调函数自动调用,进行相关操作
  • 2.侦听的属性必须存在,才能进行侦听,既可以侦听data,也可以侦听计算属性
  • 3.配置项属性immediate:false,改为 true,则初始化时调用一次 handler(newValue,oldValue)
  • 4.侦听有两种写法
    a创建Vue时传入watch: {}配置
    b通过vm.$watch()侦听
天气案例_侦听属性

今天天气很{{info}}

深度侦听

1.Vue中的watch默认不监测对象内部值的改变(一层)
2.在watch中配置deep:true可以监测对象内部值的改变(多层)

注意
1.Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以
2.使用watch时根据侦听数据的具体结构,决定是否采用深度侦听

天气案例_深度侦听

a的值是:{{ numbers.a }}

b的值是:{{ numbers.b }}

{{numbers.c.d.e}}

侦听简写

天气案例_侦听属性_简写

今天天气很{{ info }}

计算VS侦听属性

computed和watch之间的区别

  • computed能完成的功能,watch都可以完成
  • watch能完成的功能,computed不一定能完成,例如watch可以进行异步操作
    两个重要的小原则
  • 所有被Vue管理的函数,最好写成普通函数,这样 this 的指向才是vm或组件实例对象
  • 所有不被Vue所管理的函数(定时器的回调函数、ajax 的回调函数等、Promise 的回调函数),最好写成箭头函数,这样 this 的指向才是vm或组件实例对象

绑定样式

class样式

  • 写法::class=“xxx”,xxx 可以是字符串、数组、对象
  • :style="[a,b]"其中a、b是样式对象
  • :style="{fontSize: xxx}"其中 xxx 是动态值
  • 字符串写法适用于:类名不确定,要动态获取
  • 数组写法适用于:要绑定多个样式,个数不确定,名字也不确定
  • 对象写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用
{{name}}


{{name}}


{{name}}


{{name}}


{{name}}

条件渲染

v-if

  • 写法 跟 if else 语法类似
    v-if=“表达式”
    v-else-if=“表达式”
    v-else
  • 适用于:切换频率较低的场景,因为不展示的DOM元素直接被移除
  • 注意:v-if可以和v-else-ifv-else一起使用,但要求结构不能被打断

v-show

  • 写法:v-show=“表达式”
  • 适用于:切换频率较高的场景
  • 特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉display: none
  • 备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到
  • template标签不影响结构,页面html中不会有此标签,但只能配合v-if,不能配合v-show
条件渲染

当前的n值是:{{ n }}

{name}} -->{name}} -->{name}} -->{name}} -->

列表渲染

v-for指令

  • 用于展示列表数据
  • 语法:
  • ,这里key可以是index,更好的是遍历对象的唯一标识
  • 可遍历:数组、对象、字符串(用的少)、指定次数(用的少)
基本列表

人员列表(遍历数组)

  • {{ p.name }}-{{ p.age }}

汽车信息(遍历对象)

  • {{ k }}-{{ value }}

测试遍历字符串(用得少)

  • {{ char }}-{{ index }}

测试遍历指定次数(用得少)

  • {{ index }}-{{ number }}

vue中的key有什么作用?(key的内部原理)

  • 1.虚拟DOM中key的作用:key是虚拟DOM中对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,随后Vue进行新虚拟DOM与旧虚拟DOM的差异比较,比较规则如下

  • 2.对比规则

    • a.旧虚拟DOM中找到了与新虚拟DOM相同的key

      • ⅰ若虚拟DOM中内容没变, 直接使用之前的真实DOM

      • ⅱ若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM

    • b 旧虚拟DOM中未找到与新虚拟DOM相同的key
      创建新的真实DOM,随后渲染到到页面

  • 3用index作为key可能会引发的问题

    • a.若对数据进行逆序添加、逆序删除等破坏顺序操作,会产生没有必要的真实DOM更新 ==> 界面效果没问题,但效率低

    • b.若结构中还包含输入类的DOM:会产生错误DOM更新 ==> 界面有问题

  • 4开发中如何选择key?
    - a.最好使用每条数据的唯一标识作为key,比如 id、手机号、身份证号、学号等唯一值
    - b.如果不存在对数据的逆序添加、逆序删除等破坏顺序的操作,仅用于渲染列表,使用index作为key是没有问题的

key的原理

人员列表(遍历数组)

  • {{p.name}}-{{p.age}}

列表过滤

列表过滤

人员列表

  • {{ p.name }}-{{ p.age }}-{{ p.sex }}

列表排序

列表排序

人员列表

  • {{p.name}}-{{p.age}}-{{p.sex}}

数据侦听原理

模拟一个数据监测

let data = {name: '尚硅谷',address: '北京',
}function Observer(obj) {// 汇总对象中所有的属性形成一个数组const keys = Object.keys(obj)// 遍历keys.forEach((k) => {Object.defineProperty(this, k, {get() {return obj[k]},set(val) {console.log(`${k}被改了,我要去解析模板,生成虚拟DOM.....我要开始忙了`)obj[k] = val}})})
}// 创建一个监视的实例对象,用于监视data中属性的变化
const obs = new Observer(data)
console.log(obs)// 准备一个vm实例对象
let vm = {}
vm._data = data = obs

原理

  • 1.vue会监视data中所有层次的数据
  • 2.如何监测对象中的数据? 通过setter实现监视,且要在new Vue()时就传入要监测的数据
    • 对象创建后追加的属性,Vue默认不做响应式处理
    • 如需给后添加的属性做响应式,请使用如下API
      Vue.set(target,propertyName/index,value)
      vm.$set(target,propertyName/index,value)
  • 3.如何监测数组中的数据? 通过包裹数组更新元素的方法实现,本质就是做了两件事
    a.调用原生对应的方法对数组进行更新
    b.重新解析模板,进而更新页面
  • 4.在Vue修改数组中的某个元素一定要用如下方法
    push()pop()unshift()shift()splice()sort()reverse()这几个方法被Vue重写了
    Vue.set()或vm.set()特别注意:Vue.set()和vm.set() 特别注意:Vue.set() 和 vm.set()特别注意:Vue.set()和vm.set() 不能给vm或vm的根数据对象(data等)添加属性
总结数据监视

学生信息









姓名:{{ student.name }}

年龄:{{ student.age }}

性别:{{student.sex}}

爱好:

  • {{ h }}

朋友们:

  • {{ f.name }}--{{ f.age }}
账号:

密码:

年龄:

性别:男

爱好:学习打游戏吃饭

所属校区

其他信息:

阅读并接受《用户协议》

过滤器

Vue3 已经移除,这里只做简单说明

  • 注册过滤器:
    Vue.filter(name, callback)全局过滤器
    new Vue {filters: {}} 局部过滤器
  • 使用过滤器:{{ xxx | 过滤器名}} 或 v-bind:属性 = “xxx | 过滤器名”
    备注:
    a.过滤器可以接收额外参数,多个过滤器也可以串联
    b.并没有改变原本的数据,而是产生新的对应的数据

其他内置指令

v-text

作用:向其所在的节点中渲染文本内容
与插值语法的区别:v-text会替换掉节点中的内容,{{xxx}}则不会,更灵活
注意:v-text不能解析html标签

v-text指令
你好,{{name}}

v-html

作用:向指定节点中渲染包含html结构的内容
与插值语法的区别:
ⅰ.v-html会替换掉节点中所有的内容,{{xxx}}则不会
ⅱ.v-html可以识别html结构

严重注意v-html有安全性问题!!!
ⅰ.在网站上动态渲染任意html是非常危险的,容易导致 XSS 攻击
ⅱ.一定要在可信的内容上使用v-html,永远不要用在用户提交的内容上!!!

v-html指令
你好,{{ name }}

v-cloak

a.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性
b.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题

v-cloak指令

{{ name }}

// 够延迟5秒收到vue.js

v-once

  • v-once所在节点在初次动态渲染后,就视为静态内容了
  • 以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能
v-once指令

初始化的n值是: {{n}}

当前的n值是: {{n}}

v-pre

  • 1.跳过v-pre所在节点的编译过程
  • 2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译

v-pre指令

Vue其实很简单

当前的n值是:{{n}}

自定义指令

局部指令

new Vue({															directives:{ 指令名:配置对象 }   
})new Vue({															directives:{ 指令名:回调函数 }   
})

全局指令

Vue.directive(指令名, 配置对象)
或
Vue.directive(指令名, 回调函数)Vue.directive('fbind', {// 指令与元素成功绑定时(一上来)bind(element, binding) {	// element就是DOM元素,binding就是要绑定的element.value = binding.value},// 指令所在元素被插入页面时inserted(element, binding) {element.focus()},// 指令所在的模板被重新解析时update(element, binding) {element.value = binding.value}
})

配置对象中常用的3个回调函数

  • bind(element, binding) 指令与元素成功绑定时调用
  • inserted(element, binding)指令所在元素被插入页面时调用
  • update(element, binding) 指令所在模板结构被重新解析时调用

element就是DOM元素,binding就是要绑定的对象,它包含以下属性:namevalueoldValueexpressionargmodifiers

备注
a.指令定义时不加v-,但使用时要加v-
b.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名

自定义指令

{{ name }}

当前的n值是:

放大10倍后的n值是:


相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...