You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
vm._self=vm;initLifecycle(vm);initEvents(vm);initRender(vm);callHook(vm,'beforeCreate');initInjections(vm);// resolve injections before data/propsinitState(vm);initProvide(vm);// resolve provide after data/propscallHook(vm,'created');
functioncallHook(vm,hook){// #7573 disable dep collection when invoking lifecycle hookspushTarget();varhandlers=vm.$options[hook];varinfo=hook+" hook";if(handlers){for(vari=0,j=handlers.length;i<j;i++){invokeWithErrorHandling(handlers[i],vm,null,vm,info);}}if(vm._hasHookEvent){vm.$emit('hook:'+hook);}popTarget();}
varhookRE=/^hook:/;Vue.prototype.$on=function(event,fn){varvm=this;if(Array.isArray(event)){for(vari=0,l=event.length;i<l;i++){vm.$on(event[i],fn);}}else{(vm._events[event]||(vm._events[event]=[])).push(fn);// optimize hook:event cost by using a boolean flag marked at registration// instead of a hash lookupif(hookRE.test(event)){vm._hasHookEvent=true;}}returnvm};
一键生成.vue文件模板
我们借用vscode自带的功能
编辑自己写的.vue模板,进行保存
我们新建.vue文件,在首行输入vue按键盘Enter就可以了
重置data或者获取data初始值
在某些情况我们可能要重置data上面的某些属性
强制刷新组件
performance文档
进行组件初始化、编译、渲染和打补丁的性能追踪
长列表优化
当我们遇到很多的数据展示且不需要响应式变化时,我们就可以使用Object.freeze进行优化;
Object.freeze()
方法可以冻结一个对象。一个被冻结的对象再也不能被修改;当我们把一个对象传给实例的data,Vue会使用
Object.defineProperty
把这些属性响应式,使用了 Object.freeze之后,不仅可以减少observer
的开销,还能减少不少内存开销,Vue有人提了相关issue$attrs & $listeners
我们平时组件传值props跟emit用的比较多,但是有些时候他们不是父子组件就比较麻烦了
现在三个嵌套的组件, A -> B -> C ,我们现在要从A传值给C, 或者C通过emit传值给A
A组件
B组件
C组件
这样我们就实现了跨组件传值,一般在对UI组件进行二次封装时,只写上常用的一些属性跟方法,然后写上$attrs和$listners,我们使用组件时就可以直接使用原组件的属性跟方法
.sync修饰符
因为vue带来的双向绑定给开发带来了便利,同时也带来了代码维护上的问题,我们可以在子组件直接修改父组件穿的prop,新版本直接修改会报warn,官方推荐以
update:myPropName
的模式触发事件取而代之hook
这是一个文档中没有的api,在源码中存在的,我们可以看vue源码_init函数中是通过callHook调用生命周期的
然后我们找到callHook,我们可以看到vm._hasHookEvent为true时就会执行 vm.$emit('hook:' + hook)
然后我们通过
_hasHookEven
t找到相关代码,当通过$on去监听时,如果事件名以 hooks: 作为前缀,vm._hasHookEvent就会被置为true使用场景
自定义组件的
v-model
文档一个组件上的
v-model
默认会利用名为value
的 prop 和名为input
的事件,但是像单选框、复选框等类型的输入控件可能会将value
特性用于不同的目的。model
选项可以用来避免这样的冲突:这里的
lovingVue
的值将会传入这个名为checked
的 prop。同时当 触发一个change
事件并附带一个新的值的时候,这个lovingVue
的属性将会被更新。自动引入route文件
当我们项目比较大的时候,我们就会把路由文件根据不同的业务模块拆分
每个子模块导出一个路由配置数组
我们现在要实现的是每增加一个模块自动引入,我们借用
webpack
的api
require.context更新缓存的组件
使用vue的生命周期函数activated
watch的高级用法
1.当我们watch一个值时,第一次不会执行,只有值发生变化时才会执行,此时需要我们将immediate设为true
2.普通的watch方法无法无法监听对象内部属性的改变,我们把deep设为true时就能进行深度监听了
异步数据传值给子组件
这是新手都会遇到的问题,父组件异步获取数据传给子组件,子组件拿不到值,下面是我平时的解决方案
在子组件使用watch监听prop
or
巧用slot
插槽是一个很好用的api,特别是在封装组件的时候,让组件有更多扩展的空间
开发插件
Vue.js 的插件应该暴露一个
install
方法。这个方法的第一个参数是Vue
构造器,第二个参数是一个可选的选项对象:然后在main.js引入, 通过全局方法
Vue.use()
使用插件,查看vue文档ref
ref
被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的$refs
对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例在操作dom的时候尽量使用ref去获取,因为它只作用于当前组件,而不是使用queryselector等全局选择器造成意外的bug
一些不常用的api
Vue.observable( object )
让一个对象可响应。Vue 内部会用它来处理
data
函数返回的对象。当我们项目没使用vuex时,就可以使用这个apiv-pre
跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。
v-cloak
这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如
[v-cloak] { display: none }
一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示原始 Mustache 标签。我们可以使用 v-cloak 指令来解决这一问题。
v-once
只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能
The text was updated successfully, but these errors were encountered: