vue3.0开发知识点

155 阅读3分钟

vue3.0开发知识点

vue3.0新特性

更快

  • 虚拟dom和diff算法冲重写
  • 优化slots的生成
  • 静态树提升
  • 静态属性提升
  • 基于proxy的响应式数据

Composition Api 组合Api

基于reactivity(响应式)的思想进行组件构建,将逻辑封装到函数中,方便的调用和组合

Teleport 传入

此功能,可以帮我们把全屏组件移植到vue app节点之外,而不需要在 UI 界面上修改其他组件样式,方便实现全屏蒙层、浮层弹窗等效果

Fragments 碎片

在vue模板中可以有多个同级的根元素

<template>
  <div class="top">头部</div>
  <div class="center">中间区域</div>
  <div class="bottom">底部</div>
</template>

Vue3.0中暴露的方法

reactive

该函数传入一个对象,里面的数据会变成响应式的数据。类似于react中的state,只不过state更新的时候不需要setState一遍了

ref

ref也是创建响应式数据的,区别在于要用xxx.value才能访问到数据值,更推荐用ref,然后配合reactive使用

toRefs

toRefs() 函数可以将 reactive() 创建出来的响应式对象,转换为普通的对象,只不过,这个对象上的每个属性节点,都是 ref() 类型的响应式数据

isRef

用来判断某个值是否是ref创建出来的响应式对象

watch

监听属性的变化

computed

该函数用来创造计算属性,和过去一样,它返回的值是一个ref对象

provide inject

组件之间传递参数(包括跨层级),可以取代props

getCurrentInstance

获取当前组件示例,相当于this

onMounted

组件渲染完成

onUpdated

组件更新完成

onUnmounted

组件卸载完成

vue3.0生命周期

 vue3.0生命周期与2.0相比,去掉了部分,修改了已有生命周期的写法,只能在setup中使用,setup只执行一次

1.去掉beforeCreate和created,使用setup()

  1. beforeMount 换成 onBeforeMount

  2. mounted 换成 onMounted

  3. beforeUpdate 换成 onBeforeUpdate

  4. updated 换成 onUpdated

  5. beforeDistory 换成 onBeforeUnmount

  6. distoryed 换成 onUnmounted

  7. errorCaptured 换成 onErrorCaptured

vue3.0中的setup方法

setup方法只执行一次,其接收两个参数props(传递的属性),context(用来定义上下文)

export default {
  props: {
    title: String
  },
  setup(props, context){
    const { title } = props
    // context包括如下属性方法,在vue2.0中都需要通过this获取
    context.attrs
    context.slots
    context.parent
    context.root
    context.emit
    context.refs
  }
}
组件之间的交互

父传子:属性传递

<child :info="info"></child>
import { ref } from 'vue'
setup () {
  const info = ref('我是info')
}
<div>{{ info }}</div>
export default {
  props: {
    info: String
  }
}
父传子: provide 和 inject 可实现跨组件直接的交互
provide('title', '我是数据')

const title = inject('title')
子传父
<child @change="change"></child>
setup (){
 const change = (value) => {
    console.log(value)
  }
  return {
    change
  }
}
<div @change="change"></div>
setup(props, { emit }) {
  const change = () => {
    emit('change','newValue')
  }
  return {
    change
  }
}
父子数据双向绑定,可以同时绑定多个值
<child v-model:foo="foo" v-model:zoo="zoo"></child>
import { ref } from 'vue'
setup (){
  const foo = ref('foo')
  const zoo = ref('zoo')
  return {
   foo,
   zoo
 }
}
<div>
  <span>{{ foo }}</span>
  <span>{{ zoo }}</span>
  <div @click="change">改变</div>
</div>
export default {
  props: {
    foo: String,
    zoo: String
  },
  setup(props, {emit}){
    const change = () => {
      emit('update:foo', 'newfoo')
      emit('update:zoo', 'newzoo')
    }
    return {
       change
    }
  }
}
computed计算属性
import { computed } from 'vue'
export default {
  props: {
   info: String
  },
  setup() {
   const newInfo = computed({
    get: () => props.info,
    set: value => { // 执行操作 }
   })
  }
}
directive自定义指令

路由传参

import { getCurrentInstrance } from 'vue'
setup() {
  const { ctx } = getCurrentInstance() 
  ctx.$router.push({
    path: '/list',
     query: {
       title: data.title
     }
  })
  ctx.$router.push({
    name: 'list',
    params: {
       title: data.title
    }
  })
}
import { getCurrentInstrance } from 'vue'
setup() {
  const { ctx } = getCurrentInstance()
  const title = ctx.$router.currentRoute.value.query.title
  const title = ctx.$router.currentRoute.value.params.title
}
watch方法
import { watch } from 'vue'
setup() {
  const count = ref(0)
  watch(count, (newVal, oldVal) => {
   // 执行
  })
  setTimeout(() => {
    conut.value++
  }, 2000)
}
通过ref获取dom元素

只需要保证html标签的ref属性值和创建的响应式数据值一致,就可以实现绑定关系

<div ref="myRef">我是dom</div>
import { ref } from 'vue'
setup() {
  const myRef = ref(null)
  setTimeout(() => {
    console.log(myRef.value)
  }, 2000)
  return {
    myRef
  }
}

路由缓存