Vue.js指令

一. v-if和v-show

v-if 如果条件不成立不会渲染当前指令所在节点的 dom 元素

v-show 只是切换当前 dom 的显示或者隐藏

v-show 只是在display: none和 display: block 之间切换。⽆论初始条件是什么 都会被渲染出来,后⾯只需要切换CSS,DOM还是⼀直保留着的。所以总的来说 v- show 在初始渲染时有更⾼的开销,但是切换开销很⼩,更适合于频繁切换的场景。

v-if 的话就得说到 Vue 底层的编译了。当属性初始为 false 时,组件就不会被渲染,直到条件为true ,并且切换条件时会触发销毁/挂载组件,所以总的来说在切换时开 销更⾼,更适合不经常切换的场景。并且基于 v-if 的这种惰性渲染机制,可以在必要的时候才去渲染组件,减少整个 ⾯的 初始渲染开销。

总结: v-if 按照条件是否渲染, v-show 是 display 的 block 或 none

二. v-if和v-for

v-for 会比 v-if 的优先级高一些,如果连用的话会把 v-if 给每个元素都添加一下,会造成性能问题

对 应 源 码

const VueTemplateCompiler = require('vue-template-compiler');

let r1 = VueTemplateCompiler.compile(`<div v-if="false" v-for="i in 3">hello</div>`);.

/**

with(this) {

return _l((3), function (i) {

return (false) ? _c('div', [_v("hello")]) : _e()

})

}

*/

console.log(r1.render);


三. v-html存在的问题

可能会导致 xss 攻击

v-html 会替换掉标签内部的子元素

对 应 源 码

let template = require('vue-template-compiler');

let r = template.compile(`<div v-html="'<span>hello</span>'"></div>`)

// with(this){return _c('div',{domProps:{"innerHTML":_s('<span>hello</span>')}})}

console.log(r.render);

if (key === 'textContent' || key === 'innerHTML') {

if (vnode.children) vnode.children.length = 0

if (cur === oldProps[key]) continue

// #6601 work around Chrome version <= 55 bug where single textNode

// replaced by innerHTML/textContent retains its parentNode property

if (elm.childNodes.length === 1) {

elm.removeChild(elm.childNodes[0])

}


四. Keep-alive


keep-alive 可以实现组件的缓存,当组件切换时不会对当前组件进行卸载,常用的 2 个属性include/exclude,2 个生命周期 activated,deactivated


五. action和mutation区别


mutation 是同步更新数据(内部会进行是否为异步方式更新数据的检测)

action 异步操作,可以获取数据后调用 mutation 提交最终数据


六. Vue.js双向绑定


双向绑定数据的原理

vue.js 则是采⽤数据劫持结合发布者-订阅者模式的⽅式,通过 Object.defineProperty() 来劫持各个属性的 setter,getter在数据变动时发布 消息给订阅者,触发相应的监听回调Vue.js实现数据双向绑定的原理 Object.defineProperty()

vue实现数据双向绑定主要是:采⽤数据劫持结合发布者-订阅者模式的⽅式,通过Object.defineProperty() 来劫持各个属性的setter ,getter在数据变动时发布消息给订阅者,触发相应监听回调。当把⼀个普通 Javascript对象传给Vue 实例来作 为它的 data选项时,Vue将遍历它的属性,⽤ Object.defineProperty()将它们转为 getter/setter 。⽤户看不到 getter/setter ,但是在内部它们让 Vue 追踪依 赖,在属性被访问和修改时通知变化

vue 的数据双向绑定

将 MVVM 作为数据绑定的⼊⼝,整合 Observer , Compile 和 Watcher三者,通过 Observer 来监听⾃⼰的 model 的数据变化,通过Compile来解 析编译模板指令( vue 中是⽤来解析 {{}} ),最终利⽤ watcher 搭起 observer 和 Compile 之间的通信桥梁,达到数据变化 —>视图更新;视图交互变化( input )—> 数据 model 变更双向绑定效果

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容