vue3+js

90 阅读2分钟

一、分析工程结构

创建应用实例对象-app(类似于之前vue2中的vm,但app比vm更“轻”)

image.png

二、常用组合式API

1.setup

  • vue3中一个新的配置项,值为一个函数

  • 组件中用到的:数据、方法,均要配置在setup中

  • setup函数的两种返回值

    1. 若返回一个对象,则对象中的属性、方法,在模板中均可以直接使用
    2. 若返回一个渲染函数,则可以自定义渲染内容

注意:

image.png

2.ref函数

需要引入,ref加工生成引用对象(ref对象),实现响应式

image.png

  1. ref函数处理基本类型

image.png

  1. ref函数处理对象类型

image.png

3.reactive函数

需要引入,只能定义对象类型或数组类型的响应式数据,不可以定义基本类型响应式数据

image.png

  • 对象类型

image.png

  • 数组类型

image.png

4.computed计算属性

  1. 简写

image.png

  1. 完整写法(读和写)

image.png

<template>
  <h1>一个人的信息</h1>
  姓:<input type="text" v-model="person.firstName"><br>
  名:<input type="text" v-model="person.lastName">
  <p>全名:{{ person.fullName }}</p>
  <p>全名:<input type="text" v-model="person.fullName"></p>
</template>

<script>
import {computed, reactive} from 'vue'
export default {
  name: 'App',
  setup(){
    let person = reactive({
      firstName:'张',
      lastName:'三'
    })
    // 计算属性-简写(没考虑计算属性被修改的情况)
    // person.fullName = computed(()=>{
    //   // 函数体
    //   return person.firstName + person.lastName
    // })

    // 计算属性-完整写法(考虑读和写)
    person.fullName = computed({
      get(){
        return person.firstName + '-' + person.lastName
      },
      set(value){
        console.log(value);
        const nameArr = value.split('-')
        person.firstName = nameArr[0]
        person.lastName = nameArr[1]
      }
    })

    // 返回一个对象
    return{
      person
    }
  }
}
</script>

<style>

</style>

5.watch监视属性

  1. 监视ref所定义的一个响应式数据

image.png

image.png

  1. 监视ref所定义的多个响应式数据

image.png

  1. 监视reactive定义的数据
  • 整个对象

如果不需要oldValue,这种情况很常用

image.png

  • 某个属性

image.png

image.png

  • 某些属性

image.png

image.png

  • 特殊情况

image.png

image.png

总结:

image.png

6.watchEffect函数

image.png

image.png

7.vue3生命周期

image.png

image.png

组合式API的生命周期优先级更高

8.自定义hook函数

image.png

可复用的自定义hook函数

image.png

image.png

9.toRef

image.png

  • toRef

image.png

  • toRefs

image.png

三、其他Composition API

1.shallowReactive与shallowRef

image.png

2.readonly与shallowReadonly

image.png

“压根不能改”和“能改但不响应式显示出来”不是一回事

3.toRaw与markRaw

image.png

  • toRaw只能处理reactive生成的响应式对象

4.provide与inject

image.png

image.png

  • 祖先组件

image.png

  • 子组件

image.png

  • 孙子组件

image.png

5.响应式数据的判断

image.png

image.png

四、组合式API的优势

1.Options API(配置API)存在的问题

image.png

2.Composition API(组合API)的优势

image.png

五、新的组件

1.Fragment

image.png

2.Teleport

image.png

image.png

image.png

<template>
    <div>
        <button @click="isShow = true">点我弹个窗</button>
        <teleport to="body">
            <div class="mask" v-if="isShow">
                <div class="dialog" >
                    <h3>我是一个弹窗</h3>
                    <h4>内容</h4>
                    <h4>内容</h4>
                    <h4>内容</h4>
                    <h4>内容</h4>
                    <h4>内容</h4>
                    <h4>内容</h4>
                    <button @click="isShow = false">关闭弹窗</button>
                </div>
            </div>

        </teleport>

    </div>
</template>

<script>
import { ref } from 'vue'
export default {
    setup() {
        let isShow = ref(false)
        return {
            isShow
        }
    }
}
</script>

<style>
.mask{
    position: absolute;
    top:0;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: rgba(0,0,0,0.5);
}
.dialog {
    position: absolute;
    /* 水平垂直居中 */
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%); 
    width: 300px;
    height: 300px;
    background-color: green;
}
</style>

3.Suspense

image.png

image.png

image.png

image.png