compositionAPI

本文详述了Vue的Composition API,包括setup、ref、reactive、computed、watchEffect、watch等核心概念的使用,以及在实际操作中遇到的错误和解决方案,深入探讨响应式原理和组件生命周期。
摘要由CSDN通过智能技术生成

目录

开始工作

有关API学习整理

setup

ref和reactive

computed

watchEffect

watch

[readonly]

[toRef]

toRefs

判断创建类型的API

生命周期Lifecycle Hooks

错误记录

【已解决】Error: Cannot find module 'core-js/modules/es.[number].constructor'

【未解决】"export 'xxx' was not found in '@vue/composition-api'


开始工作

如何搭建一个可以运行CompositionAPI的项目

Vue Composition API中文文档

 

【响应式】:Vue的响应式数据,也就是mvvm双向绑定模式

有关API学习整理

setup

【setup】:整个组件的入口点,会在beforeCreate之后,created之前执行返回一个对象,而这个对象上的属性则会直接暴露给模版渲染上下文
【setup参数】:props,context

  • props:父组件传递给子组件的数据

  • context:自组件无法直接使用props的数据,需要通过context.xxx去获取

 

ref和reactive

【ref和reactive】:都是将传入的参数转化为响应式对象的方法

区别

  • ref是将基本数据类型转换为响应式数据,而且定义之后可以直接使用,ref会将基本数据包装一层,因此使用的时候需要.value,但是在模版template中回自动拆开

    • number、string、boolean、null、undefined、Symbol

  • reactive是将其他数据类型转换为响应式数据

    • Object

【ref和reactive在模版中简单使用】的一个代码记录

<template>
  <div>
    ref:
    <span>{{count}}</span>
    <br />
    reactive:
    <span>{{obj.count}}</span>
  </div>
</template>

<script>
import Vue from 'vue'
import VueCompositionApi, { reactive,ref,onMounted, defineComponent } from '@vue/composition-api'
  
Vue.use(VueCompositionApi)

export default defineComponent({
  setup () {
    const count = ref(0);
    const obj = reactive({count:0});
    // 返回一个对象
    return {
      state,
      obj
    }
  }
})
</script>

【修改ref和reactive的值】代码记录

<template>
  <div>
    ref:
    <span @click="handleClickRef">{{count}}</span>
    <br />
    reactive:
    <span @click="handleClickReactive">{{obj.count}}</span>
  </div>
</template>

<script>
import Vue from 'vue'
import VueCompositionApi, { reactive,ref } from '@vue/composition-api'
import { onMounted, defineComponent } from '@vue/composition-api'

Vue.use(VueCompositionApi)

export default defineComponent({
  setup () {
    const count = ref(0);
    const obj = reactive({count:0})
    onMounted(() => {
    });
    function handleClickRef() {
      // ⚠️注意:修改的使用需要.value获取
      count.value++;
    } 
    function handleClickReactive() {
      obj.count++;
    }
    return {
      count,obj,handleClickRef,handleClickReactive
    }
  },
})
</script>

 

computed

简单来说就是可以配置get/set,类似于之前版本

<template>
    <div>
        computed:
        <input @change="handleClickPlusCount" type="text" v-model="userInput">
        <br />
        <span >{{plusCount}}</span>
    </div>
</template>>

<script>
import Vue from 'vue'
import VueCompositionApi, { ref, defineComponent, computed } from '@vue/composition-api'

Vue.use(VueCompositionApi)

export default defineComponent({
    setup () {
        const count = ref(0);
        const userInput = ref(null);
        // * 默认是get选项
        // const plusCount = computed(()=>count.value+1);

        const plusCount = computed({
            get: ()=>count.value,
            set: (val)=>{
                count.value = val; 
            }
        });

        function handleClickPlusCount(){
            const input = userInput.value;
            plusCount.value = parseInt(input);
        }

        return {
            plusCount,
            userInput,
            handleClickPlusCount
        }
    }

})
</script>

 

watchEffect

当追踪到依赖的数据改变后,会立即的执行一个函数

按照下面的demo,运行过程是,会立即执行watchEffect传入的函数,因为函数需要执行的话就根据count.value,所以下面在不断改变count的过程中,也触发了watchEffect传入函数的执行

其实,就是类似于watch的用法,只是代码里面帮你监听了依赖的其他数据,不用自己手动传入。

const stop = watchEffect(()=>console.log(count.value));
setInterval(()=>{
    count.value++;
},1000);

// 停止监听
stop();

 

watch

类似于之前版本的watch,允许我们传入需要监听的参数,默认是懒执行,也就是说仅在监听的源变更时才执行回调

 

[readonly]

传如一个对象或者ref,返回一个原始对象的只读代理。一个只读的代理是“深层的”,对象内部任何嵌套的属性也都是只读的

【⚠️】:在使用的过程中发现报错,暂时没有找到有关的解决办法

 

[toRef]

可以将一个reactive对象的属性创建一个ref。这个ref可以被传递并且能够保持响应性

【⚠️】:使用过程中报错,还未解决

 

toRefs

把一个响应式对象转换成普通对象,该不同对象的每个property都是一个ref,和响应式对象property一一对应

setup() {
  const state = reactive({
    foo: 1,
    bar: 2
  });

  const state_toRefs = toRefs(state);
  // ! 因为state是reactive创建的,所以获取值直接获取就好,而toRefs之后是ref,需要使用.value的形式获取值
  // change state.foo
  state.foo = 2;        
  console.log(state.foo,state_toRefs.foo.value); // 2 2
  // change state_toRefs
  state_toRefs.foo.value++;
  console.log(state.foo,state_toRefs.foo.value); // 3 3
}

 

判断创建类型的API

isRef

【作用】:判断一个值是否是ref对象

isProxy

【作用】:reactive or readonly

isReactive

【作用】:判断一个值是否是reactive创建的响应式代理

isReadonly

【作用】:判断一个对象是否是由readonly创建的只读代理

 

生命周期Lifecycle Hooks

before

now

beforeCreate

give up->set up

created

give up->set up

beforeMount

onBeforeMount

mounted

onMounted

beforeUpdate

onBeforeUpdate

updated

onUpdated

updated

onUpdated

destoryed

onUnmounted

errorCaptured

onErrorCaptured

总的来说,大部分的初始化代码都放到了setup中,总的生命周期命名都变成了onXxx的形式

【errorCaputred->onErrorCaptured】:当捕获到一个来自子孙组件的错误时被调用

错误记录

【已解决】Error: Cannot find module 'core-js/modules/es.[number].constructor'

【错误说明】:当使用props的时候,需要对父组件传过来的值进行格式验证出现的一个错误,不过按照这样的猜想,错误的原因对于es.[type].constructor应该都是适用的

【解决】:

npm install --save core-js

而且似乎版本好还不能是2,必须要3以上才可以

 

【未解决】"export 'xxx' was not found in '@vue/composition-api'

【compositionapi版本】:0.5.0(暂时是目前的最新版)

一些在文档中看到的API,但是使用的时候报错,而且查看node_modules确实没有看到有关API的到导出,所以不知道是不是被舍弃了还是啥的,暂时还没有被解决

  • readonly

  • toRef

【说明】:该模块还没正式上线,暂时还不能使用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值