空
P2 Vue技术虚拟dom通过diff算法比较差异实现渲染复用
P3 官网指南学习-Cookbook
提供编程技巧(让代码更优雅)
资源列表-Awesome Vue
官方推荐认可的Vue第三方库(如能用来制作一个报表)
P4 开发环境引入Vue.js后,可以在浏览器-console中输入Vue.config查看Vue API(全局配置 )
2. 简单例子 P5 Hello 案例{{}}:Vue设计的插值语法(获取Vue实例-data里的值)
root容器里的代码被称为【Vue模板】
模板解析流程:
先有容器,然后有实例实例拿到对应id容器实例解析(看有没有设计的特殊语法)把解析完后的Dom树导出替换容器 P6 分析Hello容器和实例是一一对应的
<div id='root'></div>
new Vue({
el:'#root',
……
})
},
‘{{}}’里必须写js表达式
3. 数据绑定 P7 模板语法插值语法:解析标签体内容
<div>{{xxx}}</div>
指令语法:解析标签属性(属性、内容、事件)V-XXX
<a v-bind :herf='xxx'>点击</a>
P8 数据绑定
v-modal只能应用在表单类元素(输入类元素)上
P9 el和data两写法 elel:‘#root’ 和v.KaTeX parse error: Expected 'EOF', got '#' at position 8: mount('#̲root')效果相同(mount是vue实例原型构造器的方法)
data 对象式data:{
name:'xxx'
}
函数式(以后用组件时必须用这种,对象式会报错)
data:function(){
return{
name:'xxx'
}
}
//简写成(不能写箭头函数,不然this指向windows)
data(){
return{
name:'xxx'
}
}
4. 数据代理(JS知识补充)
P10 MVVM
如图所示:
代码:Vue实例把Data和View进行连接
data里的数据最终出现在vm上,而模板{{}}或v-xxx可以从vm中获取属性值
<h1>{{$emit}}</h1>
//$emit是vm原型链上所有的属性
P11 defineProperty
为什么console.log()里面的属性不直接显示,原因:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWiJHTsz-1652602773252)(Images/image-20210816165528539.png)]
给对象添加属性,具体语法如图:
第一个参数是对象名,第二个参数是属性名,然后是在defineProperty对属性的内置 *** 作方法中写表达式
第三个参数中get():有人读取属性时,放回属性值;set():有人修改属性时,用改方法设置修改值
P12 数据代理 P13 Vue中的数据代理vm._data === data
data(){
return {
data:'xxx'
}
}
但为什么vm._data===data呢?这个就不细讲了,只要知道是数据劫持即可
5. 事件绑定 P14 事件处理''里的模板只能用vm
注:所有vm里的方法有不要写成箭头函数,不然this指向windos
如何保持事件原有参数(用关键词传参)
注:写在methods里的方法不会做数据代理,如果写在data中会多做一次数据代理
P15 修饰符<a href='xxx' @click.prevent='showinfo'/>
prevent会组织默认事件,如阻止a的跳转
不常用,具体细节看视频吧
P16 键盘事件触发分为两种:@keyup和@keydown
有几个按键比较特殊,具体看视频
P17 事件总结修饰符可以连写,先后同时生效
<a href='xxx'@click.prevent.stop='xxx'/>
@click='xxx'
=== @click='xxx($event)'
每次data改变,都会引起vue的重新渲染
所以如果使用方法替代计算属性的话,每次渲染都会return最新值
P19 计算属性computed有缓存机制,相对于methods来说更高效,这也是为什么要用计算属性的原因
get()只有当初始化和依赖数据发生改变时执行
computed不会像data和methods一样,直接绑定到vm上,所以{{fullName.get()}}会报错,Vue做了内部处理,{{fullName}}能默认调用get()
vm.fullname=xxx 则会调用fullname{}里的set()
P20 简写只需要读取时可以使用简写
7. 监视属性 P21 天气案例注:如果页面内容没变,vm数据变了,开发者工具不一定更新(实际上是变了)
P22 监视属性watch语法如下:
key为被监控dataName,计算属性也能被监视,并提供一系列方法
也可以直接调用vm.$watch(),效果相同
P23 深度监视 监视多级结构的某个属性(完整写法.)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtE6RBzD-1652602773254)(Images/image-20210817141421438.png)]
监视多级结构的所有属性(设置deep值)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rS5fImuP-1652602773254)(Images/image-20210817141514247.png)]
P24 简写和methods相同,只有"单纯" *** 作时,才能简写(不可添加deep等配置)
两种写法如下(和methods相似)
构造 实例 P25 对比(watch和computed)一般来说能用computed的就用计算,不能的再用watch(因为官方也推荐计算,代码量少呀)
然后计算属性因为只依靠return返回值,所以不能进行一些异步 *** 作(setTimeout),加了异步就return不到计算属性函数上
详细区别如下:
8. 样式渲染 P26 Class绑定code
{{name}}
{{name}}
{{name}}
{{name}}
{{name}}
{{name}}
p:实际上这两节的内容并不实用,因为很多情况下的业务是条件渲染样式,这里实际上是各种动态指定样式变量
old
三种写法(字符串\数组\对象)
https://www.cnblogs.com/guangzhou11/p/11116378.html
实例博客
P27 Style绑定code
{{name}}
{{name}}
……
p:个人感觉这样写不优雅
实战
//指定对象变量
//指定对象的属性变量
computed: {
//根据当前菜单状态动态设置菜单高度
meunHeight() {
let meunHeight;
switch (this.$store.state.nowMeun) {
case "PathSelect":
meunHeight = "340rpx";
break;
case "StartNav":
meunHeight = "126rpx";
break;
}
return meunHeight;
},
//根据当前菜单高度
styleObject() {
let obj;
obj = { //这里和上面的data-styleObj差不多,只不过用computed来动态设置对象的属性
height: `calc(100vh - ${this.meunHeight} - var(--window-bottom))`,
fontSize: "13px",
};
return obj;
},
},
old
有两种(对象和数组)
注:{}要写样式对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Stmd0S01-1652602773255)(Images/image-20210817153938296.png)]
ps:class和style总结
P28 条件渲染如图所示(v-show\v-if\v-else-if\template)
v-show控制的是dispaly,所以是高频率合适,这里写反了
9. 列表渲染 P29 基本列表数组\对象
其他:字符串\指定次数(用的少)
P30 Key作用与原理具体分析见视频
文字总结:
ps:如果没写key,Vue会自动帮我们使用:key=‘index’(所以只要不会破坏结构,就不用写key,减少代码量hh)
P31 过滤Key: watch:{}中可以添加immediate:true属性使组件初始化时就调用一次监听
watch:{
keyWorud:{
immediate:true, //初始化调用
handler(val){
return xxx
}
}
}
这里时列表过滤的最优解-computed(通过输入框搜索展示列表内容)
具体还是看视频吧
P32 列表顺序如图,强大的计算属性功能哈
10. 监视原理(JS补充) P33 更新原理下图的修改会失效,原因是内存变量确实改了,但是vue没监听到吼
P34 Vue监听对象这节是对对象的监视的分析,而不是基本类型
错误写法自己尝试写一个监视,但是会报错,说栈溢出(陷入死循环了)
原因:上图如果有人读取name,则调用get(),但是get()中return 的是data.name,读取data.name有需要get(),所以会陷入嵌套死循环
模拟Vue底层写法 现在简单重现下vue底层方法实现(使用了一个构造函数)构造函数就是通过defineproperty属性传入参数data,’拷贝‘data中所有属性,而且修改和读取时不会发生循环
所以上面的构造函数实例obs,console.log出来就是一个带有data所有属性的方法实例 准备一个vm对象 ,复制obs 但是data还没变,然后来个连等(这样_data、data和obs就一样了)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2egK0uLA-1652602773256)(Images/image-20210818151646108.png)]
然后再defineproperty.set(){xxx}中添加 *** 作就可以实现监听渲染了(不会像“错误写法”那样出现死循环)
PS:肯定又疑惑了,为什么构造的就不会像错误的那样出现死循环呢?
⭐️个人感觉是构造的get()读取和set()的内容不是同一个东西(地址)
这里的this指的是构造函数Obeserver(obj)地址;
而obj是指传入的对象地址
如上图是错误的,因为return 后面的内容会再次触发读取(主要就是看绿色是否是同一个对象属性)
Vue真实底层我们没有做到的内容:修改更便捷(数据代理)、多层设置
1.2.
P35 Vue.set()方法常见错误
直接赋值student.sex不可行,原因如图-没有相关方法
正文
<h2 v-if="student.sex">性别:{{student.sex}}</h2>
<h2 >姓名:{{student.name}}</h2>
data:{
student:{
name:'tom', //没有sex属性
}
},
methods: {
addSex(){
// Vue.set(this.student,'sex','男') //Vue.set和this.$set都可以
this.$set(this.student,'sex','男')
}
}
官方文档
注意:对象不能是 Vue 实例,或者 Vue 实例的根数据对象-data。
补充
关于属性不存在报错问题
<h2 >性别:{{student.sex}}</h2>
//这里不报错,因为如果属性为空的话是返回undefined,undefined在页面不显示
student:{
name:'tom',
//sex:'男'
}
P36 Vue监测数据改变的原理_数组
直接修改数组不可行
如图数组里是没有set()和get()
直接改不可行
vue对常见的数组方法封装,实现数组监听
如下图,两个方法不相同
使用set()也可以-但是一般都直接用方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aXxFNrTX-1652602773257)(Images/image-20220113181824064.png)]
简写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hm2mspAM-1652602773258)(Images/image-20220113163442213.png)]
相关官方文档
P37 总结Vue监视数据Vue监视数据的原理:
1. vue会监视data中所有层次的数据。
2. 如何监测对象中的数据?
通过setter实现监视,且要在new Vue时就传入要监测的数据。
(1).对象中后追加的属性,Vue默认不做响应式处理
(2).如需给后添加的属性做响应式,请使用如下API:
Vue.set(target,propertyName/index,value) 或
vm.$set(target,propertyName/index,value)
3. 如何监测数组中的数据?
通过包裹数组更新元素的方法实现,本质就是做了两件事
(1).调用原生对应的方法对数组进行更新
(2).重新解析模板,进而更新页面
4.在Vue修改数组中的某个元素一定要用如下方法:
1.使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()
2.Vue.set() 或 vm.$set()
特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!
//dom
学生信息
姓名:{{student.name}}
年龄:{{student.age}}
性别:{{student.sex}}
爱好:
//data
student:{
name:'tom',
age:18,
hobby:['抽烟','喝酒','烫头'],
friends:[
{name:'jerry',age:35},
{name:'tony',age:36}
]
}
//以下就是对于监视原理这章的总结
addSex(){
// Vue.set(this.student,'sex','男')
this.$set(this.student,'sex','男')
},
addFriend(){
this.student.friends.unshift({name:'jack',age:70})
},
updateFirstFriendName(){
this.student.friends[0].name = '张三'
},
addHobby(){
this.student.hobby.push('学习')
},
updateHobby(){
// this.student.hobby.splice(0,1,'开车')
// Vue.set(this.student.hobby,0,'开车')
this.$set(this.student.hobby,0,'开车')
},
removeSmoke(){
this.student.hobby = this.student.hobby.filter((h)=>{
return h !== '抽烟'
})
}
10a.表单例子
P38 收集表单数据
收集表单数据:
若:,则v-model收集的是value值,用户输入的就是value值。
若:,则v-model收集的是value值,且要给标签配置value值
若:
1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
2.配置input的value属性
(1)v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
(2)v-model的初始值是数组,那么收集的的就是value组成的数
备注:v-model的三个修饰符:
lazy:失去焦点再收集数据
number:输入字符串转为有效的数字
trim:输入首尾空格过滤
data:{
userInfo:{
account:'',
password:'',
age:18,
sex:'female',
hobby:[],
city:'beijing',
other:'',
agree:''
}
},
methods: {
demo(){
console.log(JSON.stringify(this.userInfo)) //转换成json,发送请求
}
}
11. 过滤器
P39 过滤器用法
如图
全局(组件公用)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5C6pRPQn-1652602773258)(Images/image-20210818163835397.png)]
userInfo.other">
阅读并接受《用户协议》
提交
data:{
userInfo:{
account:‘’,
password:‘’,
age:18,
sex:‘female’,
hobby:[],
city:‘beijing’,
other:‘’,
agree:‘’
}
},
methods: {
demo(){
console.log(JSON.stringify(this.userInfo)) //转换成json,发送请求
}
}
## 11. 过滤器
### P39 过滤器用法
如图
全局(组件公用)
[外链图片转存中...(img-5C6pRPQn-1652602773258)]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)