Vue中的组合API详解

一、组合API是什么?

通过创建 Vue 组件,我们可以将界面中重复的部分连同其功能一起提取为可重用的代码段。

  • 组合api
  • 提供复用性
  • 降低耦合性
  • 增加可读性

二、组合式 API 基础

1.setup 组件

setup是一个接收2个参数的函数props和context

  • props:props是setup的第一个参数,该参数是响应式的,因此不能用 ES6进行解构,因为会消除它的响应式
  • context:context是setup的第二个参数,context是JavaScript中的一个普通对象,它不是响应式的可以放心的使用ES6结构。context对外暴露了一些可能会用到的值,比如:attrs、slots、emit、expose等
  • setup函数中不能使用this,因为这里this并不会找到vue的实例
import { ref } from 'vue'

export default{
	components:{},
	props:{title},
	setup(props,context){
		let message = ref('hello world')//定义一个响应式的变量
		const getTitle = ()=>{ console.log('title')}//定义一个普通函数
		onMounted(getTitle);//调用生命周期函数
		//所有需要给模板或其它钩子函数使用的都需要在这里暴露出去
		return {
			message,
			getTitle
		}
	}
}
2.带 ref 的响应式变量

在 Vue 3.0 中,我们可以通过一个新的 ref 函数使任何响应式变量在任何地方起作用,如下所示

import { ref } from 'vue'

// 定义响应式数据 count 默认值是10
const count = ref(10);
3.reactive方法

返回对象的响应式副本
响应式转换是“深层”的——它影响所有嵌套 property。

有了这个reactive的方法后,我们就可以想定义多少就定义多少了,而且访问和修改也不需要通过点value的形式了

const book = reactive({
  author: '秃头老石',
  year: '2022',
  price: 'free'
})
4.watch监听

监听对象的变化

import { watch } from 'vue'
watch(count, (nval, oval) => {
	if (nval > 50) {
		console.log(oval);
		Notify({
			type: 'success',
			message: '大于50!'
		});
	}
})
5.watchEffect

立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。

const stop = watchEffect(()=>{
    // 这个回调函数引用的值,都会被监听
    console.log(num.value,list[0]);
    localStorage.setItem("num",num.value);
})
6.computed 属性

与 ref 和 watch 类似,也可以使用从 Vue 导入的 computed 函数在 Vue 组件外部创建计算属性

接受一个 getter 函数,并根据 getter 的返回值返回一个不可变的响应式 ref 对象

const counter = ref(0)
const twiceTheCounter = computed(() => counter.value * 2)

或者,接受一个具有 get 和 set 函数的对象,用来创建可写的 ref 对象。

const counter = computed({
     // 当获取counter值调用函数
     get(){return num.value},
     // 设置counter值调用函数
     set(v){
         num.value = v;
         if(v>10){
         num.value = 20};
					
    }
})
7.setup生命周期

组合式 API 上的生命周期钩子与选项式 API 的名称相同,但前缀为 on:即 mounted 看起来会像 onMounted。

Vue2.xVue3.0
beforeCreatesetup(不需要)
createdsetup(不需要)
beforeMount(挂载前)onBeforeMount
mounted(挂载后)onMounted
beforeUpdate(数据更新前)onBeforeUpdate
updated(数据更新后)onUpdated
beforeDestroy(销毁前)onBeforeUnmount
destroyed(销毁后)onUnmounted

三、自定义组合API

这里我们自定义了翻转文本顺序和获取窗口宽高的方法

import{ref, reactive, onMounted} from 'vue'
function reverseText(){
    const reverseRef = ref(nul);
    onMounted(() => {
    	// reverseRef.value 就是引用的 DOM
        reverseRef.value.onclick = function(){
		    // 获取 DOM 的文本
        	var msg = reverseRef.value.innerText;
            // 翻转文本
            msg = msg.split('').reverse().join('');
            // 赋值给DOM 
            reverseRef.value.innerText = msg;
        }
    })
   	// 返回 DOM 引用对象
    return reverseRef;
}
function uewinSize(){
    // 定义默认的宽高
    const size = reactive({w:window.innerWidth, h:window.innerHeight});
    onMounted(() => {
        // 当窗口发生变化时更新宽高
        window.addEventListener("resize", function(){
            size.w = window.innerWidth;
            size.h = window.innerHeight;
        })
    })
    // 返回size
    return size;
}
export {reverseText, userwinSize};
<template>
	<div class="about">
        <h1 ref="elem">自定义组合API页面</h1>
        <h1 ref="el">学习VUE3</h1>
        <p>w:{{size.w}}, h:{{size.h}}</p>
    </div>
</template>
<script>
	// 导入reverseText
    import {reverseText, userwinSize} from './utils.js'
    export default{
        // 引用一个组件,单击哪个,文本翻转
        setup(props, ctx){
            const elem = reverseText();
            const el = reverseText();
            const size = usewinSize();
            return {elem, el, size};
        }
    }
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值