vue3组合式API学习笔记

19 阅读3分钟

组合式API

父传子

基本操作

  • 父组件给子组件绑定属性
  • 子组件内部通过props选项接受

image.png

静态传值

在App.vue中局部导入子组件,给子组件以添加属性的方式传值

image.png

由于写了setup,所以无法直接配置props选项

因此需要借助于"编译器宏"函数 (defineProps) 接受子组件传递的数据

const props = defineProps({
  car: String
})

对于pops传递过来的数据,模版中可以直接使用。(即模版中的插值表达式语法)

image.png

动态传值

动态传值.gif

App.vue导入ref,并且设置变量放置初始值。

import {ref} from 'vue'
const money = ref(100)

image.png

设置一个函数,让变量money每次点击按钮都自加2

image.png

子组件当中接收父组件传递过来的值与静态传值一样。

子传父

基本步骤

  • 父组件当中给子组件标签用@绑定事件
  • 子组件内部用emit方法触发事件,其中emit方法需要用defineEmits(数组)的方式来获取

子组件中首先运用defineEmits来获取emit方法,之后用emit向父组件传值。

image.png

父组件用 @changeMoney="changeFn" 接收子组件传过来的值,之后设定一个changFn函数来修改原来的值。

const changeFn = (newMoney) => {
  money.value = newMoney
}

子传父通过这两个步骤就可以实现传值的效果了。

模版引用

模版引用需要在组件挂载完毕之后使用,可以获取到组件和元素并且直接使用。

模版引用需要调用ref函数,再利用ref标识来绑定ref对象到标签之中。

通过ref对象.value即可访问到绑定的元素 (必须渲染完成后才能拿到)

<script setup>
import TextCom from '@/components/text-com.vue';
import { onMounted, ref } from 'vue';
const clickFn = () => {
  inp.value.focus();
}

const testRef = ref(null);
const getCom = () => {
  console.log(testRef.value.count);
  console.log(testRef.value.sayHi());
}
</script>

<template>
  <div>
    <input ref="inp" type="text">
    <button @click="clickFn">点击让输入框获取焦点</button>
  </div>
  <TextCom ref="testRef"></TextCom>
  <button @click="getCom">获取组件</button>
</template>
<script setup>
const count = 999;
const sayHi = () => {
  console.log('你好');
}

defineExpose({
  count,
  sayHi
})
</script>

<template>
  <div>
    我是用于测试的组件 - {{ count }}
  </div>
</template>

setup语法糖组件内部的属性和方法是不允许父组件访问的

image.png

那么此时使用defineExpose编译宏可以指定需要访问的属性和方法。

project 和 inject

即顶层组件向任意的底层组件传递数据和方法,实现了层级组件之间的通信。

跨层传递普通数据

App.vue组件使用provide函数提供数据。

image.png

bottom-com.vue文件使用inject函数获取数据

const themeColor = inject('theme-color');
<h3>我是底层组件 - {{ themeColor }}</h3>

跨层传递方法

顶层组件向底层组件传递方法,底层组件则调用方法修改顶层组件数据。

image.png

const count = inject('count');
<h3>我是底层组件 - {{ count }}</h3>

跨层传递函数

image.png

image.png

defineOptions

在父传子和子传父当中认识到了 defineEmitsdefineProps 这两个编译宏,可是这两个只能用在emits和props当中。

为了能够定义组件中的name和其他自定义属性,那么defineOptins也就派上了用场。

image.png

defineModel

自定义组件中的v-model相当于传递一个modelValue属性,同时触发update:modelValue事件。

defineModel可以替代defineProps传过来的数据,即直接当做props来使用。

image.png

definModel明显比之前使用props接收再用emits触发更简洁。