vue知识点总结
双向数据绑定的原理
vue使用双向绑定实现view和model层的同步更新,双向绑定的实现方式主要有数据劫持和发布订阅者模式。
使用Object.defineProperty实现双向数据绑定,对model中的数据的属性添加访问器,当数据被访问或者修改时,通过设置的setter和getter来实现对view层的更新
数据在html模板中有两种绑定方式:v-model来对value值进行绑定,和文本绑定。
v-model对value值进行绑定,当元素节点的属性值中包含V-model时,会将model中的对应的属性的值赋值给元素节点的value。然后对元素添加一个监听事件,当value发生变化时触发事件,通知model更新对应的属性的值。
当时文本节点绑定时,使用model中对应的属性的值来替换文本。对于文本的更新使用发布订阅者模式,将属性作为一个主题,文本节点设置一个订阅者对象,将订阅者都加入到属性主题的订阅者列表中。当Model层数据发送变化时,Model作为发布者向主题发出通知,主题再向订阅者推送,订阅者收到后更新自己的数据。
Object.defineProperty
Object.defineProperty的三个参数:(需要定义属性的对象,需要定义的属性,属性描述符)
属性描述符有:value属性的值、writable是否可写、enumerable是否可枚举、configurable是否可修改配置、get当访问属性时调用,set当修改属性时调用。
缺点:有一些属性的操作无法拦截,比如说通过下标修改数组数据,或者给对象新增属性,vue内部通过重写函数解决这个问题
3.0中使用proxy对对象进行代理,可以完美监听数据变化,但缺点时兼容性,是es6的语法。
vue中$router和$route的区别
this.$route:当前激活的路由的信息对象。每个对象都是局部的,可以获取当前路由的 path, name, params, query 等属性。
this.$router:全局的 router 实例。通过 vue 根实例中注入 router 实例,然后再注入到每个子组件,从而让整个应用都有路由功能。其中包含了很多属性和对象(比如 history 对象),任何页面也都可以调用其 push(), replace(), go() 等方法。
Vue 和 React 数据驱动的区别
在数据绑定上来说,vue的特色是双向数据绑定,而在react中是单向数据绑定。
vue中实现数据绑定靠的是数据劫持(Object.defineProperty())+发布-订阅模式
vue中实现双向绑定
1 |
|
react中实现单向绑定
1 |
|
Vue的路由模式
hash模式 与 history模式
- hash(即地址栏 URL 中的 # 符号)。
1 |
|
- history(利用了浏览器的历史记录栈)
1 |
|
keep-alive
keep-alive是缓存页面,避免重复渲染,props有:include、exclude、max,include和exclude表示是否走缓存的页面,max表示最大缓存页面值
需要注意的是函数式组件是不会被keep-alive缓存的,因为它没有实例。以及使用时include的数组和页面名称要一致。
函数式组件
函数式组件只是一个接受props的函数,没有生命周期、实例和状态,所以也没有响应式数据和this上下文。
写法如下:
1 |
|
函数式组件接受render的第二个参数作为上下文。函数式组件只是函数,所以渲染开销也低很多。
slot插槽
slot插槽,相当于在组件中的占位符。有默认插槽、具名插槽、作用域插槽,默认插槽的