vue知识要点(一)

283 阅读3分钟

生命周期钩子函数

beformeCreate 是获取不到props和data中的数据,也不能操作dom,只能执行一次

created 是vue生命周期中第一个访问到data和props中数据,但是不能操作dom树,只能执行一次

beforeMount 渲染前,能操作数据但不能操作dom,只能执行一次

mounted 渲染后,生命周期中第一个能操作dom,只能执行一次

beforeUpdate和updated 数据更新前后会调用,可以多次调用,但基本不用

在使用keep-alive的页面有两个独有的生命周期,activated 该页面显示时执行,deactivated在页面隐藏时执行

最后是销毁前后钩子函数,beforeDestroy和destroyed,前者适合做页面的善后工作(移出事件和定时器等),避免造成内存泄漏

组件通讯

组件通讯一般分为以下几种

  • 父子组件通讯
  • 兄弟组件通讯
  • 跨多层级组件通讯
  • 任意组件

父子组件

父组件通过props传递数据给子组件,子组件通过emit发送事件传递数据给父组件。但是这种传值是单向数据流,必须通过事件的方式告诉父组件修改数据

兄弟组件通讯

可以通过公共bus进行组件之间的传值

跨多层级组件通讯

是通过vue中的provide和inject结合使用

任意组件通讯

在vue中多处对一个数据进行更改,最好使用vuex进行通讯

组件间通信方式

  • ref & parent
    • 父传子(父访问子实例对象(this))
      • 在子组件标签上定义ref属性
      • this.$refs.ref值===子组件this
    • 子传父(子访问父的实例的对象)
      • this.$parent===父组件的this
      // app 
      	<van-button>
          	<son></son>
          </van-button>
      // son
      	this.$parent===van-button的this
      
  • props emit
    • eventbus
      • 定义:中间信息中转站在main.js中定义一个$bus
        • Vue.prototype.$bus=new Vue()

      • 注册:在想接受相应信息的组件创建一个监听事件
        this.$bus.on('message',(str)=>{
        	console.log(str)
        })
        
      • 触发:在想发送信息的组件中通过$emit发送消息

      this.bus.bus.emit('事件名','传递的参数')

  • vuex
  • attrs & listeners
    • v-bind="attrs"attrs" attrs非props属性
    • v-on="$listeners"
  • provide & inject
    • 高阶组件传值
    • 只用于高等组件传值给低等组件
      • provide的值不可修改
      • inject:的值(堆可修改,栈不可修改),原始值不可改,引用值只要不改变它的引用,它的值可以随意修改

computed和watch的区别

computed是计算属性,依赖一个或者多值,产生新的值,computed有缓存,只用当依赖的值发生改变时才会改变

watch 监听的值发生改变时才会执行,有两个参数,一个是旧值,一个是新值。

keep-alive组件的作用

在切换组件时,保持一些组件的状态防止多次渲染,可以使用keep-alive包裹该组件的路由出口,使用name标识,如果有多个使用逗号隔开。 在keep-alive中有两个特殊的生命周期构子函数,在组件切换的时候,不会进行销毁,而是缓存到内存中并执行deactivated钩子函数,该组件重新渲染时会执行actived钩子函数

v-if和v-show区别

v-show是通过控制display:none;和display:block之间进行切换,不会重新渲染dom,消耗比较小,适用于频繁切换

v-if是vue底层编译,当为false时,所在组件就不会编译,直到为true的时候才会编译渲染到页面中。(v-if不能和v-for在同一标签中使用)

动态组件

vue中提供一个特殊的元素用来动态地挂载不同的组件,使用is特性来选择要挂载的组件

<ul>
	<li @click="mycom='login'">登录</li>
    <li @click="mycom='regitser'">注册</li>
</ul>
<compontent :is="mycom"></compontent>

<script>
import login from './login'
import regitser from './register'
export default{
	data(){
    	return {
        	mycom:'login'
        }
    }
}

性能优化

vue的缺点: 1 首次加载慢 2 兼容性,只支持IE8以上 vue优化

  • gzip压缩(服务器处理)
    • gzip就是压缩了相应的html,css,js
    • 前端压缩
      • 在webpack打包是支持压缩
    • 后端压缩
  • 路由懒加载
  • 减少接口请求
    • 缓存组件
    • vuex存储用户信息
  • 组件按需加载(异步组件,公共方法等)
  • 图片精灵图(减少了服务器请求)
  • cdn全局使用的js库
  • 图片等资源压缩