【无标题】

1.什么是Vue生命周期?
vue生命周期是指vue是对象从创建到销毁的过程。
2.Vue生命周期的作用是什么?
在vue生命周期的不同阶段通过对应的钩子函数来实现组件数据管理和DOM渲染两大重要功能。
创建阶段:
beforecreate:实例已经初始化,但不能获取DOM节点。(没有data,没有el)
created:实例已经创建,仍然不能获取DOM节点。(有data,没有el)
载入阶段:
beforemount:模板编译完成,但还没挂载到界面上。(有data,有el)
mounted:编译好的模板已挂载到页面中(数据和DOM都已经渲染出来)。
更新阶段:
beforeupdate:数据发生变化立即调用,此时data中数据是最新的,但页面上数据仍然是旧的(检测到数据更新时,但DOM更新前执行)。
updated:更新结束后执行,此时data中的值和页面上的值都是最新的。
销毁阶段:
beforedestroy:当要销毁vue实例时,在销毁之前执行。
destroy:在销毁vue实例时执行。
3.第一次页面加载会触发哪几个钩子函数?
beforeCreate, created, beforeMount, mounted。
4.简述每个生命周期具体适合哪些场景?
beforecreate:可以加Loading事件。
create:初始化完成时的事件写在这里,异步请求也适宜在这里调用(请求不宜过多,避免白屏时间太长)。
可以在这里结束loading事件,还做一些初始化,或实现函数的自执行。
此时未挂载DOM,若在此阶段进行DOM操作一定要放在Vue.nextTick()的回调函数中。
mounted:此时完成挂载DOM和渲染,需要操作DOM的方法可以放在这里,也可在这发起后端请求,拿回数据,配合路由钩子做一些事情。
beforeupdate:可在更新前访问现有的DOM,如手动移出添加的事件监听器。
updated:组件DOM已完成更新,可执行依赖的DOM操作。
注意:不要在此函数中操作数据(修改属性),会陷入死循环。
activated:在使用vue-router时有时需要使用来缓存组件状态,这个时候created钩子就不会被重复调用了。
如果我们的子组件需要在每次加载的时候进行某些操作,可以使用activated钩子触发。
deactivated:组件被移除时使用。
beforedestroy:销毁前,可以做一些删除提示,如:您确定删除xx吗?
destroy:销毁后,这时组件已经没有了,无法操作里面的任何东西了。

5.created和mounted的区别?
created:实例已经创建,但不能获取DOM节点。
mounted:模板已经挂载到页面上,可以操作DOM元素。

6.vue组件间通信六种方式
组件之间的传值通信
组件之间通讯分为三种: 父传子、子传父、兄弟组件之间的通讯;
(1)props/$emit

父传子:props
子传父:父组件向子组件传递事件方法,子组件通过$emit触发事件,回调给父组件

(2) e i m t / eimt/ eimt/on

这种方法通过一个空的Vue实例作为中央事件总线(事件中心),用它来触发事件和监听事件,巧妙而轻量地实现了任何组件间的通信,包括父子、兄弟、跨级。
具体实现方式:

var Event=new Vue();
Event. e m i t ( 事 件 名 , 数 据 ) ; E v e n t . emit(事件名,数据); Event. emit(,);Event.on(事件名,data => {});
// 假设兄弟组件有三个,分别是A、B、C组件,C组件如何获取A或者B组件的数据
// 组件A、B通过Event. e m i t ( 事 件 名 , 数 据 ) 将 数 据 传 递 , 组 件 C 通 过 E v e n t . emit(事件名,数据)将数据传递,组件C通过 Event. emit(,)CEvent.on(事件名,data => {})接受组件A、B传递的数据

(3)Vuex

vuex 就是一个仓库,仓库里放了很多对象。在state中存放数据源,当组件要更改state中的数据时,必须通过mutation进行,mutation储存的是改变state中数据的操作方法,之后通过actions储存的操作去触发mutation中的方法,由组件中的$store.dispatch('action 名称', data1)来触发。然后由commit()来触发mutation的调用 , 间接更新 state。

(4)Vuex + localstorage

vuex 是 vue 的状态管理器,存储的数据是响应式的。但是并不会保存起来,刷新之后就回到了初始状态,具体做法应该在vuex里数据改变的时候把数据拷贝一份保存到localStorage里面,刷新之后,如果localStorage里有保存的数据,取出来再替换store里的state。
这里需要注意的是:由于vuex里,我们保存的状态,都是数组,而localStorage只支持字符串,所以需要用JSON转换。

(5) a t t r s / attrs/ attrs/listeners

$attrs:包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。
$listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。

(6)provide/inject

provide/inject:vue2.2.0 新增API,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
总而言之:祖先组件中通过provider来提供变量,然后在子孙组件中通过inject来注入变量。
provide / inject API主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。

// A.vue
export default {
provide: {
name: ‘nora’
}
}
/**************************************/
// B.vue
export default {
inject: [‘name’],
mounted () {
console.log(this.name); // nora
}
}

需要注意的是:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的----vue官方文档
provide与inject 怎么实现数据响应式?
使用2.6最新API Vue.observable 优化响应式 provide(推荐)

我们来看个例子:孙组件D、E和F获取A组件传递过来的color值,并能实现数据响应式变化,即A组件的color变化后,组件D、E、F会跟着变(核心代码如下:)

//A组件

A 组件

// 方法二:使用2.6最新API Vue.observable 优化响应式 provide
provide() {
this.theme = Vue.observable({
color: “blue”
});
return {
theme: this.theme
};
},
methods: {
changeColor(color) {
if (color) {
this.theme.color = color;
} else {
this.theme.color = this.theme.color === “blue” ? “red” : “blue”;
}
}
}
/******************************************************************/
// F 组件

F 组件

(7)$parent / $children与 ref

ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例
$parent / $children:访问父 / 子实例
需要注意的是:这两种都是直接得到组件实例,使用后可以直接调用组件的方法或访问数据。
$parent :访问父实例,如果当前实例有的话。
$children:当前实例的直接子组件。需要注意 $children并不保证顺序,也不是响应式的。如果你发现自己正在尝试使用 $children来进行数据绑定,考虑使用一个数组配合 v-for 来生成子组件,并且使用 Array 作为真正的来源。
这两种方法的弊端是,无法在跨级或兄弟间通信。

// component-a 子组件
export default {
data () {
return {
title: ‘Vue.js’
}
},
methods: {
sayHello () {
window.alert(‘Hello’);
}
}
}
/***********************************/
// 父组件


.vuex是什么?怎么使用?哪种功能场景使用它?

    vuex 就是一个仓库,仓库里放了很多对象。
    其中 state 存放的是数据状态,不可以直接修改里面的数据。
    getters类似vue的计算属性,主要用来过滤一些数据。
    mutations:存放的是动态修改Vuex的state中保存的数据状态的方法。
    actions:保存的触发mutations中方法的方法,可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。

一般什么样的数据会放在 State 中呢?
目前主要有两种数据会使用 vuex 进行管理: 1、组件之间全局共享的数据 2、通过后端异步请求的数据 比如做加入购物车、登录状态等都可以使用Vuex来管理数据状态

    怎么使用Vuex? 在main.js引入store,注入。新建了一个目录store,… export
    场景有:单页应用中,组件之间的状态、音乐播放、登录状态、加入购物车

8.开发时,改变数组或者对象的数据,但是页面没有更新如何解决?

    对于数组:
    Vue 不能检测以下数组的变动:
    1.当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
    2.当你修改数组的长度时,例如:vm.items.length = newLength

//举个例子:
var vm = new Vue({
data: {
items: [‘a’, ‘b’, ‘c’]
}
})
vm.items[1] = ‘x’ // 不是响应性的
vm.items.length = 2 // 不是响应性的

//为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将在响应式系统内触发状态更新:
// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
// 你也可以使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名:
vm.$set(vm.items, indexOfItem, newValue)
// 为了解决第二类问题,你可以使用 splice
vm.items.splice(newLength)

数组通过变异方法变化数据才能被检测到:
对于对象:

var vm = new Vue({
data: {
userProfile: {
name: ‘Anika’
}
}
})

//你可以添加一个新的 age 属性到嵌套的 userProfile 对象:
Vue.set(vm.userProfile, ‘age’, 27)
//你还可以使用 vm. s e t 实 例 方 法 , 它 只 是 全 局 V u e . s e t 的 别 名 : v m . set 实例方法,它只是全局 Vue.set 的别名: vm. setVue.setvm.set(vm.userProfile, ‘age’, 27)
//有时你可能需要为已有对象赋予多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。
vm.userProfile = Object.assign({}, vm.userProfile, {
age: 27,
favoriteColor: ‘Vue Green’
})

    强制刷新this.$forceUpdate()
    原文参考:https://blog.csdn.net/sunzbking/article/details/86150365

9.vue弹窗后如何禁止滚动条滚动?
参考原文:
vue弹窗屏蔽滑动的两种解决方案
vue弹窗后如何禁止滚动条滚动?
vue如何禁止弹窗后面的滚动条滚动?

10.如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
参考原文:
如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件

作者:Angel_6c4e
链接:https://www.jianshu.com/p/7c3dc76178bf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值