Vue 组件中 data 为什么必须是函数?
因为一个组件是可以共享的,但他们的data是私有的,所以每个组件都要return一个新的data对象,返回一个唯一的对象,不要和其他组件共用一个对象。
- 注册组件的本质其实就是建立一个组件构造器的引用。
- 使用组件才是真正创建一个组件实例。
- 所以,注册组件其实并不产生新的组件类,但会产生一个可以用来实例化的新方式。
var MyComponent = function() {}
MyComponent.prototype.data = {
a: 1,
b: 2,
}
上面是一个虚拟的组件构造器,真实的组件构造器方法很多
var component1 = new MyComponent()
var component2 = new MyComponent()
上面实例化出来两个组件实例,也就是通过调用,创建的两个实例
component1.data.a === component2.data.a // true
component1.data.b = 5
component2.data.b // 5
可以看到上面代码中最后三句,这就比较坑爹了,如果两个实例同时引用一个对象,那么当你修改其中一个属性的时候,另外一个实例也会跟着改。这怎么可以,两个实例应该有自己各自的域才对。所以,需要通过下面方法来进行处理:
var MyComponent = function() {
this.data = this.data()
}
MyComponent.prototype.data = function() {
return {
a: 1,
b: 2,
}
}
这样每一个实例的data属性都是独立的,不会相互影响了。所以,你现在知道为什么vue组件的data必须是函数了吧。这都是因为js本身的特性带来的,跟vue本身设计无关。
vue中 keep-alive 组件的作用
keep-alive:
主要用于保留组件状态
或 避免重新渲染
。
1、属性:
-
include:
字符串或正则表达式。只有匹配的组件会被缓存。 -
exclude:
字符串或正则表达式。任何匹配的组件都不会被缓存。
2、用法:
包裹动态组件
时,会缓存
不活动的组件实例,而不是销毁
它们。和<transition>
相似,<keep-alive>
是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。
<!-- 基本 -->
<keep-alive>
<component :is="view"></component>
</keep-alive>
<!-- 多个条件判断的子组件 -->
<keep-alive>
<comp-a v-if="a > 1"></comp-a>
<comp-b v-else></comp-b>
</keep-alive>
<!-- 和 `<transition>` 一起使用 -->
<transition>
<keep-alive>
<component :is="view"></component>
</keep-alive>
</transition>
2.1.0 新增
include
和exclude
属性允许组件有条件地缓存。二者都可以用逗号
分隔字符串、正则表达式
或一个数组
来表示:
<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
<component :is="view"></component>
</keep-alive>
<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
<component :is="view"></component>
</keep-alive>
<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
<component :is="view"></component>
</keep-alive>
匹配首先检查组件自身的 name 选项
,如果 name 选项不可用,则匹配它的局部注册名称
(父组件 components 选项的键值)。匿名组件不能被匹配。
vue生命周期钩子函数有哪些?
生命周期钩子函数(11个)
生命周期钩子函数(11个) | 类型 | 详细 |
---|---|---|
beforeCreate | Function | 在实例初始化之后 ,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 |
created | Function | 在实例创建完成后 被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer) ,属性和方法的运算 ,watch/event 事件回调 。然而,挂载阶段还没开始,$el 属性目前不可见。 |
beforeMount | Function | 在挂载开始之前 被调用:相关的 render 函数首次被调用。 |
mounted | Function |
el 被新创建的vm.$el 替换,并挂载到实例上去之后 调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。 |
beforeUpdate | Function |
数据更新时调用 ,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行。
|
updated | Function | 由于数据更改导致的虚拟 DOM 重新渲染和打补丁 ,在这之后 会调用 该钩子。 |
activated | Function |
keep-alive 组件激活时调用 。该钩子在服务器端渲染期间不被调用。
|
deactivated | Function |
keep-alive 组件停用时调用 。该钩子在服务器端渲染期间不被调用。
|
beforeDestroy | Function | 实例销毁之前调用。在这一步,实例仍然完全可用。该钩子在服务器端渲染期间不被调用。 |
destoryed | Function | Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。 |
errorCaptured(2.5.0+ 新增) | Function | 当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。 |
当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。
注意:
1、mounted
、updated
不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图
都渲染完毕
,可以用vm.$nextTick
替换掉mounted
、updated
:
updated: function () {
this.$nextTick(function () {
// Code that will run only after the
// entire view has been re-rendered
})
}
2、http请求建议在created
生命周期内发出
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。