视频教程:尚硅谷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提供开发版本和生产版本,在开发环境下不要使用压缩版本,不然你就失去了所有常见错误相关的警告!
直接引入最新版本方式:
//开发版本
//生产版本
先定义id或class绑定容器,然后用{{xxx}}
代替变量值,一般用于标签值。注意:一个容器只能绑定一个Vue实例,是一对一的关系。xxx
可以直接读取到 data 中的所有属性,也可以直接执行js语句。data的变量值改变,xxx的值会自动更新。
用v-bind:标签属性
绑定,一般用于标签内属性值,也可以用简写形式,之间用:
号代替v-bind:
,但不是所有v-
标签都可以用简写形式。
用v-bind:标签属性
绑定定属性值是 js 表达式,可以直接读取到 data 中的所有属性,也可以直接执行js语句。
插值语法和指令语法示例:
模板语法
Vue中有2种数据绑定的方式:
1.单向绑定v-bind
数据只能从 data
流向页面
2.双向绑定v-model
数据不仅能从 data
流向页面,还可以从页面流向 data
注意:
1.双向绑定只能应用在有value属性的表单类元素上,如 、、等
2.v-model:value可以简写为v-model,因为v-model默认收集的就是value值
示例:
数据绑定 单向数据绑定:
双向数据绑定:
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模型
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进行数据劫持,实现响应式
基本用法
事件的基本使用 欢迎来看{{name}}的笔记
Vue中的事件修饰符
prevent 阻止默认事件(常用)
stop 阻止事件冒泡(常用)
once 事件只触发一次(常用)
capture 使用事件的捕获模式
self 只有event.target是当前操作的元素时才触发事件
passive 事件的默认行为立即执行,无需等待事件回调执行完毕
修饰符可以连续写,比如可以这么用:@click.prevent.stop=“showInfo”
事件修饰符
回车: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}}笔记
姓名案例_计算属性实现
姓:
名:
测试:
// 这里修改 不会调 fullName的get方法全名:{{fullName}}
{fullName}}
-->{fullName}}
-->
基本用法
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 }}
computed和watch之间的区别
class样式
{{name}}
{{name}}
{{name}}
{{name}}
{{name}}
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
原理
总结数据监视
学生信息
姓名:{{ student.name }}
年龄:{{ student.age }}
性别:{{student.sex}}
爱好:
- {{ h }}
朋友们:
- {{ f.name }}--{{ f.age }}
Vue3 已经移除,这里只做简单说明
作用:向其所在的节点中渲染文本内容
与插值语法的区别:v-text会替换掉节点中的内容,{{xxx}}则不会,更灵活
注意:v-text不能解析html标签
v-text指令
你好,{{name}}
作用:向指定节点中渲染包含html结构的内容
与插值语法的区别:
ⅰ.v-html会替换掉节点中所有的内容,{{xxx}}则不会
ⅱ.v-html可以识别html结构
严重注意v-html有安全性问题!!!
ⅰ.在网站上动态渲染任意html是非常危险的,容易导致 XSS 攻击
ⅱ.一定要在可信的内容上使用v-html,永远不要用在用户提交的内容上!!!
v-html指令
你好,{{ name }}
a.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性
b.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题
v-cloak指令 {{ name }}
// 够延迟5秒收到vue.js
v-once指令
初始化的n值是: {{n}}
当前的n值是: {{n}}
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个回调函数
element就是DOM元素,binding就是要绑定的对象,它包含以下属性:namevalueoldValueexpressionargmodifiers
备注
a.指令定义时不加v-,但使用时要加v-
b.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名
自定义指令
{{ name }}
当前的n值是:
放大10倍后的n值是: