vue

173 阅读3分钟

vue生命周期有哪些?

  beforeCreate      创建组件实例前
  created           创建实例完成,配置数据观测(data observer),属性和方法的运算, watch/event       事件回调。
  beforeMount       挂载之前,完成了$el和data初始化  ,编译html模板
  mounted           el 被新创建的 vm.$el 替换,将html渲染到页面,
  beforeUpdate      数据更新时调用 该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行。
  updated           数据更改导致的虚拟 DOM 重新渲染
  beforeDestory     组件销毁前调用   实例仍然完全可用。该钩子在服务器端渲染期间不被调用。 
  destory           组件销毁后调用 Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

  activated     for keep-alive,组件被激活时调用
  deactivated   for keep-alive,组件被移除时调用
  
    父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
    父beforeUpdate->子beforeUpdate->子updated->父updated
    父beforeUpdate->父updated
    父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
    
    1、mounted、updated不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用vm.$nextTick 替换掉mounted、updated:

vuex的原理?

State:  Vuex仓库中的数据。
Getter: 类似于Vue实例中的计算属性,Getter就是普通的获取state包装函数。
Mutations: Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。
Action: action可以触发Mutations,不能直接改变state。  dispatch触发方法

getter与computed的区别? computed与watch的区别?

getter读取  setter设值 
computed可以读取和设值 

watch执行异步操作场景更适用
computed数据未发生变化时,优先读取缓存,发生变化时改变要计算的属性

Vue路由传参

this.$router.push(id){path:`/decribe/${id}`}   path:'/decribe/:id';
params
query

路由懒加载

 组件分割 import异步引入 结合webpack按需加载,减少首页加载用时。

如何编写可复用组件

prop允许外部环境传递数据给组件,在vue-cli工程中也可以使用vuex等传递数据。
事件允许组件触发外部环境的 action
slot允许外部环境将内容插入到组件的视图结构内。
    //示例
        <my-component
    	:foo="bar"
        :bar="qux"
        //子组件调用父组件方法
        @event-a="doThis"
        @event-b="doThat">
        <!-- content -->
        <img slot="icon" src="..." />
        <p slot="main-text">Hello!</p>
        </my-component>

Vue 组件中 data 为什么必须是函数?

返回一个唯一的对象,不要和其他组件共用一个对象进行返回;因为一个组件是可以共享的,但他们的data是私有的,所以每个组件都要return一个新的data对象,返回一个唯一的对象,不要和其他组件共用一个对象。

这个操作是一个简易操作,实际上,它
首先需要创建一个组件构造器,
然后注册组件。
注册组件的本质其实就是建立一个组件构造器的引用。
使用组件才是真正创建一个组件实例。
所以,注册组件其实并不产生新的组件类,但会产生一个可以用来实例化的新方式。
理解这点之后,再理解js的原型链:
var MyComponent = function() {}
MyComponent.prototype.data = {
  a: 1,
  b: 2,
}
如果两个组件实例同时引用一个对象,那么当你修改其中一个属性的时候,另外一个实例也会跟着改。这怎么可以,两个实例应该有自己各自的域才对。

这样每一个实例的data属性都是独立的,不会相互影响了。所以,你现在知道为什么vue组件的data必须是函数了吧。这都是因为js本身的特性带来的,跟vue本身设计无关。

Proxy

Vue3.0使用Proxy替换Object.defineProperty来实现双向数据绑定。 let p = new Proxy(target,handler);