vue面试题:1.Vue生命周期 2.Vue中的data属性是一个函数而不是一 个对象

简介: 结论●根实例对象data可以是对象也可以是函数(根实例是单例),不会产生数据污染情况●组件实例对象data必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染。采用函数的形式,initData时会将其作为工厂函数都会返回全新data对象

文章目录

说说你对Vue生命周期的理解

为什么Vue中的data属性是一个函数而不是一 个对象?

说说你对Vue生命周期的理解

生命周期是什么

基本涵义可以通俗地理解为“从摇篮到坟墓”(Cradle-to-Grave)的整个过程在Vue中实例从创建到销毁的过程就是生命周期,即指从创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程

在Vue生命周期钩子会自动绑定 this 上下文到实例中,因此你可以访问数据,对 property 和方法进行运算这意味着你不能使用箭头函数来定义一个生命周期方法 (例如 created: () => this.fetchTodos())


生命周期整体流程




beforeCreate -> created

●初始化vue实例,进行数据观测


created

●完成数据观测,属性与方法的运算,watch、event事件回调的配置

●可调用methods中的方法,访问和修改data数据触发响应式渲染dom,可通过computed和watch完成数据计算

◆此时vm.$el 并没有被创建


created -> beforeMount

●判断是否存在el选项,若不存在则停止编译,直到调用vm.$mount(el)才会继续编译

●优先级:render > template > outerHTML

vm.el获取到的是挂载DOM的


beforeMount

●在此阶段可获取到vm.el

●此阶段vm.el虽已完成DOM初始化,但并未挂载在el选项上


beforeMount -> mounted

此阶段vm.el完成挂载,vm.$el生成的DOM替换了el选项所对应的DOM


mounted

●vm.el已完成DOM的挂载与渲染,此刻打印●vm.$el,发现之前的挂载点及内容已被替换成新的DOM


beforeUpdate

●更新的数据必须是被渲染在模板上的(el、template、render之一)

●此时view层还未更新

●若在beforeUpdate中再次修改数据,不会再次触发更新方法


updated

完成view层的更新

若在updated中再次修改数据,会再次触发更新方法(beforeUpdate、updated)


beforeDestroy

实例被销毁前调用,此时实例属性与方法仍可访问


destroyed

●完全销毁一个实例。可清理它与其它实例的连接,解绑它的全部指令及事件监听器

●并不能清除DOM,仅仅销毁实例


使用场景分析

●beforeCreate 执行时组件实例还未创建,通常用于插件开发中执行一些初始化任务

●created 组件初始化完毕,各种数据可以使用,常用于异步数据获取

●beforeMount 未执行渲染、更新,dom未创建

●mounted 初始化结束,dom已创建,可用于获取访问数据和dom元素

●beforeUpdate 更新前,可用于获取更新前各种状态

●updated 更新后,所有状态已是最新

●beforeDestroy 销毁前,可用于一些定时器或订阅的取消

●destroyed 组件已销毁,作用同上


数据请求在created和mouted的区别

created是在组件实例一旦创建完成的时候立刻调用,这时候页面dom节点并未生成mounted是在页面dom节点渲染完毕之后就立刻执行的触发时机上created是比mounted要更早的两者相同点:都能拿到实例对象的属性和方法讨论这个问题本质就是触发的时机,放在mounted请求有可能导致页面闪动(页面dom结构已经生成),但如果在页面加载前完成则不会出现此情况建议:放在create生命周期当中


为什么Vue中的data属性是一个函数而不是一 个对象?

组件data定义函数与对象的区别

在我们定义好一个组件的时候,vue最终都会通过Vue.extend()构成组件实例

这里我们模仿组件构造函数,定义data属性,采用对象的形式


function Component(){


}

Component.prototype.data = {

   count : 0

}

1

2

3

4

5

6

创建两个组件实例


const componentA = new Component()

const componentB = new Component()

1

2

修改componentA组件data属性的值,componentB中的值也发生了改变


console.log(componentB.data.count)  // 0

componentA.data.count = 1

console.log(componentB.data.count)  // 1

1

2

3

产生这样的原因这是两者共用了同一个内存地址,componentA修改的内容,同样对componentB产生了影响

如果我们采用函数的形式,则不会出现这种情况(函数返回的对象内存地址并不相同)


function Component(){

   this.data = this.data()

}

Component.prototype.data = function (){

   return {

          count : 0

   }

}

1

2

3

4

5

6

7

8

vue组件可能会有很多个实例,采用函数返回一个全新data形式,使每个实例对象的数据不会受到其他实例对象数据的污染


结论

●根实例对象data可以是对象也可以是函数(根实例是单例),不会产生数据污染情况

●组件实例对象data必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染。采用函数的形式,initData时会将其作为工厂函数都会返回全新data对象


目录
相关文章
|
23天前
|
JavaScript 前端开发 应用服务中间件
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
这篇文章分析了Vue项目在服务器部署后出现404错误的原因,主要是由于history路由模式下服务器缺少对单页应用的支持,并提供了通过修改nginx配置使用`try_files`指令重定向所有请求到`index.html`的解决方案。
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
|
23天前
|
JavaScript 前端开发 数据处理
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
这篇文章讨论了Vue中实现权限管理的策略,包括接口权限、路由权限、菜单权限和按钮权限的控制方法,并提供了不同的实现方案及代码示例,以确保用户只能访问被授权的资源。
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
|
19天前
|
JavaScript 前端开发
vue3通过render函数实现一个菜单下拉框
【8月更文挑战第18天】vue3通过render函数实现一个菜单下拉框
56 0
|
13天前
|
JavaScript
Vue3使用全局函数或变量的两种常用方式
这篇文章介绍了Vue 3中实现全局函数或变量的两种方法:一种是使用`provide/inject`进行依赖注入,另一种是利用`app.config.globalProperties`和`getCurrentInstance()`来注册全局属性。
Vue3使用全局函数或变量的两种常用方式
|
2天前
|
缓存 JavaScript 前端开发
|
23天前
|
JavaScript 安全 前端开发
【Vue面试题二十九】、Vue项目中你是如何解决跨域的呢?
这篇文章介绍了Vue项目中解决跨域问题的方法,包括使用CORS设置HTTP头、通过Proxy代理服务器进行请求转发,以及在vue.config.js中配置代理对象的策略。
【Vue面试题二十九】、Vue项目中你是如何解决跨域的呢?
|
23天前
|
JavaScript 前端开发 编译器
【Vue面试题三十二】、vue3有了解过吗?能说说跟vue2的区别吗?
这篇文章介绍了Vue 3相对于Vue 2的改进和新增特性,包括性能提升、体积减小、更易维护、更好的TypeScript支持、新的Composition API、新增的Teleport和createRenderer功能,以及Vue 3中的非兼容性变更和API的移除或重命名。
【Vue面试题三十二】、vue3有了解过吗?能说说跟vue2的区别吗?
|
23天前
|
JavaScript 前端开发 API
【Vue面试题三十一】、你是怎么处理vue项目中的错误的?
这篇文章讨论了Vue项目中错误的处理方式,包括后端接口错误和代码逻辑错误的处理策略。文章详细介绍了如何使用axios的拦截器处理后端接口错误,以及Vue提供的全局错误处理函数`errorHandler`和生命周期钩子`errorCaptured`来处理代码中的逻辑错误。此外,还分析了Vue错误处理的源码,解释了`handleError`、`globalHandleError`、`invokeWithErrorHandling`和`logError`函数的作用和处理流程。
【Vue面试题三十一】、你是怎么处理vue项目中的错误的?
|
20天前
|
JavaScript
vue 函数化组件
vue 函数化组件
|
7天前
|
JavaScript
vue中使用@scroll不生效的问题
vue中使用@scroll不生效的问题