开始vue的学习
本人是跟着b站张天禹老师学习的vue2基础,因为自己比较容易遗忘知识点,所以vue的学习做了笔记,方便自己查看。如果对学习vue的同学有一丢丢的帮助,那再好不过了。
vue
概念:一套用于构建用户界面的渐进式js框架。
特点:
- 采用组件化模式(html,css,js封装到组件),提高代码复用率、且让代码更好维护
- 声明式编码(心有灵犀),无需直接操作dom,避免命令式编码(一步一步的操作),提高开发效率
- 虚拟dom+优秀diff算法
vue官方文档的使用(绝对不是把它给背下来,要学会使用,不会的时候要会查阅,用的多的当然记下来是最好的)
初试Vue:
- 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象,
el:就是指定当前Vue实例为哪个容器服务,值通常为css选择器字符串
data:存储数据,数据供el指定的容器去使用。
- 容器中会混入一些Vue语法
vue实例:
{{××}}花括号里面要写js表达式,且××可以自动读取到data中的所有属性
模板(root容器内的html)语法:
- 插值语法
- 指令语法:
data里面多级嵌套的话,就需要用到(.)
插值语法其实就是只要vue实例中有的就都可以写入{{}},data的作用就是把data中的东西弄到vue实例上
数据绑定:
单向数据绑定:就是v-bind: ,,,属性前加冒号引号中的都当作js表达式去解析
双向数据绑定:就是v-model:(就是输入类的,input和textarea,select,,可以直接简写为v-model,因为其默认绑定value)
$开头的一些方法是vue提供的,可以直接拿来用.
重要原则:
由vue管理的函数,一定不要写箭头函数,一旦写了,this就不再是vue实例了 。比如data函数
比如methods里面配置的函数.比如set,get()
,简写的监视属性
不被vue管理的函数,最好写成箭头函数,目标只有一个,this指向vue实例,,,定时器回调函数,ajax回调函数,promise回调函数
前端主流的框架设计思想:
就是数据放在对应的地方,模板结构写出来,那怎么把数据整到模板中,就需要学习这个框架中的语法了
数据代理
(通过一个对象代理对另一个对象中属性的操作(读/写)):
Object.defineproperty(对象名,'属性名',{配置项})方法
配置项:value,enumerable,writable,configurable,
get(),set()
就是给对象添加属性的,
可以实现当值改变了,就可以对应的实现属性值的变化,也就是相当于data的数据绑定
事件处理
-
有的时候需要传参,但是又不想吧event搞丢u了,就需要 @click="tip(22,$event)"
-
事件修饰符(.prevent)例如a标签的@click.prevent="tip",就是阻止a标签跳转
还可以@click.prevent.stop(修饰符连写)
键盘事件(keyup\keydown)
比如:@keyup.enter="tip"
计算属性(有缓存的优点)
涉及到比较复杂的表达式 ,就不要直接写到模板中插值语法中了.
计算属性会被缓存在第一次读取后.
但是在其所依赖的数据发生变化时,计算属性中的getter会重新调用去计算得到一个新的返回值给计算属性
可简写(在只有get时)
侦听(监视)属性
用于监视属性,当属性值发生改变的 时候,可以拿到旧值和新值,做出其他的逻辑.
handler函数配置项(只有这个的话可以使用简写)
深度监视配置项deep:true
绑定class样式(:class)(从data中取样式名)
字符串写法
数组写法(要绑定的样式个数不确定,名字也不确定)
对象写法(要绑定的样式个数确定,名字也确定,但要动态决定用不用)
条件渲染
列表渲染
列表渲染要动态绑定一个:key=(只要是唯一的就可以,数字,字符串均可)
可以默认写index,就不用声明在数组中id,但是这样在打乱数组顺序的时候(比如在数组最前面插入一个对象)通过虚拟DOM对比算法可能会复用错乱的问题.所以这样不行,还是得找唯一标识.
从服务器请求过来的数据都是有惟一标识的,比如我上次做的项目的 id.
对于一个由其他的数据2算出来的数据1,你要修改其数据1,就需要直接修改数据2
come on!
列表过滤
v-for渲染数组得到一个列表,从输入框里面拿到一个数据进行模糊搜索然后再次渲染。
其实也不麻烦,拿到输入的数据,用filter针对数组中的每一个对象中某一字符串进行indexof筛选然后再渲染。
列表排序
就还是利用数组的一些方法,这也说明,这些数组字符串的方法,能记还是要记住的,这都算是很基础的东西。
vue监测数据变化的原理
通过setter实现监视,且要在vue实例化时或vuecomponent实例化时就传入要检测的数据
Vue.set(target,'propertyName/Index',value)
vm.$set(target,'propertyName/Index',value)不能给vm或vm的根数据添加属性
问题:单纯的对数组中的对象赋值是不奏效的,不是响应式的.也就是说,赋是可以赋值的,但是vue不能检测到数组中的数据发生了改变.要使其感受到到就要用到,push,pop.shift,unshift,reverse,splice,sort
当然也可以用set接口,只不过原来写属性的地方写索引值
用了一个包装(先调用原始数组的push方法实现对应的功能,再重新解析模板构建虚拟dom,更新页面),也就是push这个方法已经被vue包装过了,所以这些方法可以被检测得到
reactive:响应式
想要在已经创建好vue实例后再添加其他属性,并且是响应式的(有对应的get,set方法的)就可以用vue.set()或者vm.$set(),,,注意:第一参数肯定是对象中的对象
数据劫持:就是在你数据发生改变的时候,vue对你的数据进行了一些操作,渲染响应等等.
继续今日份vue学习
收集表单数据(都是需要写v-model)
radio,需要给标签配置value
checkbox,需要配置value,并且用数组接收
输入框,下拉框,
v-model的三个修饰符:
lazy:失去焦点再收集数据
number:输入字符串转为有效的数字
trim:输入首尾空格过滤
过滤器(本质依旧是函数)
定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)
将时间戳格式化为日期时间,但是并没有改变原本的数据,是产生新的对应的数据
可以用 day.js
模板中的格式{{time |函数名字}}
图片中细节
过滤器之间依次传参,首先拿到的是从前面传过来的参数
es6默认传参语法
日期格式可以自己设置
内置指令
- v-text
向其所在的标签完全替换文字(用处不多了解,用插值语法比较好)
- v-html
会产生安全性问题,在网站上动态渲染任意HTML是非常危险的,容易导致xss攻击,永远不要在用户登录体检内容上使用
- v-cloak
用处不大,就是vue实例创建好后,会删除标签上有这个属性的,配合css可以实现解决网速慢页面展示{{××}}的问题
- v-once
所在节点在初次动态渲染后,就视为静态内容,以后不变了。
- v-pre
就是让vue知道这里面没有指令,不用再编译什么的,提高效率。
自定义指令
就是自己去手动去实现dom操作,完成这个指令实现的功能
写在directives
函数式写法:(其实是包含了bind和update)
被调用:指令与元素成功绑定时。和指令所在的模板被重新解析时
对象式写法:(其中包括三个回调函数)
{
指令与元素成功绑定时调用
bind(){ },
指令所在元素被插入页面时
inserted(){ },
指令所在模板被重新解析时
update(){ },
}
指令名字如果多个单词,用横线连接kebab-case命名,不要用camelCase,在脚本中,就要加上引号了.
可以定义全局自定义指令(先了解有需求再查)
周期函数
mouted(){}
vue完成模板解析并把初始的真实的dom元素放入页面后(挂载完毕)调用mounted
挂载流程:
beforeCreate(){}
在此之前,初始化生命周期、事件,数据代理没开始,所以在函数里无法通过vm访问到data中的数据,methods中 方法。
created(){}
- 已经初始化数据监测(vue监测对象数组变化,给对象里的属性匹配getter,setter,以及数组方法的二次包装是在这里实现的),数据代理
- 可以通过vm访问到data中的数据,methods中的方法。并且如果在渲染数据的时候用到v-for渲染请求过来的数据,那请求基本是在这里进行的。
- 这个函数之后,vue开始解析模板,生成虚拟DOM(内存中),页面还不能显示解析好的内容
beforeMount(){}
- 这个阶段,页面呈现的是未经vue编译的DOM结构,所有对DOM的操作,最终都不奏效。
mounted(){}
- 之前将内存中的虚拟DOM转为真实DOM插入页面
- 页面呈现的是经过vue编译的DOM,一般在次进行开启定时器,发送网络请求,订阅消息,绑定自定义事件等初始化操作
更新流程:
beforeUpdate(){}
数据已经更新,但页面是旧的。也就是页面尚未和数据保持同步。
updated(){}
数据和页面保持同步
销毁流程:
beforeDestroy(){}
一般在此阶段:关闭定时器,取消订阅消息,解绑自定义事件
destroyed(){}
生命周期钩子总结
ES6对象简写方法:就是名字和值一样,就可以把值和冒号省略.
有时候局部变量需要被外部使用,可以用this.去把这个局部变量给挂载到vue实例上
cookie:(其实本质就是类似json的字符串),存的东西就是你的身份标识,根据这个东西服务器可以返回你想要请求的
vue学习4
组件是什么:实现应用中局部功能代码资源的集合
组件
非单文件组件
单文件组件(主要使用这种,条理清晰好维护)
全局注册:
Vue.component('hello',hello)
局部引用:就那呗
组件使用步骤:
- 定义组件
- 注册组件
- 使用组件
为什么组件里面的data要使用函数:避免组件被复用时,数据存在引用关系
组件名称是多个单词时,可以用段横杠-连接,并且在注册组件时,要加引号包裹名称
组件嵌套
vm管理app组件
app负责管理下一级组件
下一级组件中又可以嵌套要用的 组件
注意:组件定义要放到前面,不能还没有遇到定义组件的代码,你就写注册或使用组件的代码(非单文件组件的,不用太在意)
理解VueComponent
-
用简写或Vue.extend()来定义的一个组件本质是一个vuecomponent的构造函数,是由Vue.extend()生成的
有个问题就是extendOptions和options是什么,并且是什么时候开始传入的。这个我不是很清楚,我现在的理解就是这俩就是在使用extend这个方法时传入的page
- 在组件使用的步骤时,vue帮我们执行new vuecomponent(options)
- 每次调用vue.extend时,返回的都是一个全新的 vuecomponent构造函数
- 组件page中的this指向vuecomponent实例对象就是和vm结构类似的vc(vm中管理着vc)
一个内置关系:
vue调整了这个线路,让vue的原型对象作为vuecomponent原型对象的兜底的
为什么要有这个关系?就是为了让组件实例对象vc可以访问到vue原型上的属性,方法。