Vue3.0初体验(组合API使用)

构建项目

写文章时的代码
<template>
    <h1>{{ msg }}</h1>
    <button @click="numAdd">count is: {{ num }}</button>
    <button @click="changeAge">age is: {{ obj.age }}</button>
    <p ref="hello">Edit <code>components/HelloWorld.vue</code> to test hot module replacement.</p>
    <piTest></piTest>
    <button @click="changeProvide1">changeProvide1</button>
    <button @click="changeProvide2">changeProvide2</button>
</template>

<script>
import {
    onMounted,
    onUpdated,
    reactive,
    ref,
    watch,
    computed,
    provide,
} from "vue";
import piTest from "../components/piTest.vue";
export default {
    name: "HelloWorld",
    props: {
        msg: String,
    },
    data() {
        return {
            count: 0,
        };
    },
    components: {
        piTest,
    },
    setup(props, context) {
        console.log(props);
        console.log(context);

        const name = ref("rmq");
        const like = reactive({ dog: "wangwang", cat: "maomao" });
        const provide1 = provide("name", name);
        const provide2 = provide("like", like);
        const changeProvide1 = () => {
            name.value = "xr";
        };
        const changeProvide2 = () => {
            like.dog = "ww";
            like.cat = "mm";
        };

        // const provide1 = provide("name", "rmq");
        // const provide2 = provide("like", { dog: "wangwang", cat: "maomao" });

        const num = ref(0);
        const numAdd = () => {
            num.value++;
        };
        watch(
            () => num.value,
            (newNum, oldNum) => {
                console.log("newNum:" + newNum);
                console.log("oldNum:" + oldNum);
            }
        );
        const obj = reactive({ name: "rmq", age: 22 });
        const changeAge = () => {
            obj.age++;
        };
        watch(
            () => obj.age,
            (newAge, oldAge) => {
                console.log("newAge:" + newAge);
                console.log("oldAge:" + oldAge);
            }
        );

        const doubleCount = computed(() => num.value * 2);

        const hello = ref("hello");
        onMounted(() => {
            hello.value.style.color = "pink";
        });

        return {
            num,
            numAdd,
            changeAge,
            obj,
            doubleCount,
            hello,
            changeProvide1,
            changeProvide2,
        };
    },
};
</script>

关于watch监听

  • 监听简单的数据
    const num = ref(0);
    const numAdd = () => {
        num.value++;
    };
    watch(
        () => num.value,
        (newNum, oldNum) => {
            console.log(newNum);
            console.log(oldNum);
        }
    );
    // 或者
    // watch(num.value, (newNum, oldNum) => {
    //     console.log(newNum);
    //     console.log(oldNum);
    // });

在这里插入图片描述

  • 监听复杂一点的
        const obj = reactive({ name: "rmq", age: 22 });
        const changeAge = () => {
            obj.age++;
        };
        watch(
            () => obj.age,
            (newAge, oldAge) => {
                console.log("newAge:" + newAge);
                console.log("oldAge:" + oldAge);
            }
        );

在这里插入图片描述

  • 监听多个
   const num = ref(0);
   const numAdd = () => {
       num.value++;
   };

   const obj = reactive({ name: "rmq", age: 22 });
   const changeAge = () => {
       obj.age++;
   };

   watch([num, () => obj.age], ([newNum, newAge], [oldNum, oldAge]) => {
       console.log(newNum);
       console.log(oldNum);
       console.log(newAge);
       console.log(oldAge);
   });

在这里插入图片描述

ref获取Dom

vue3.0的获取DOM和之前有点不同

  1. setup中先声明
  2. return出去
  3. DOM中ref去引用
//<p ref="hello">Edit <code>components/HelloWorld.vue</code> to test hot module replacement.</p>
   const hello = ref("hello");
   onMounted(() => {
       hello.value.style.color = "pink";
   });
    return {
     hello,
 	};

在这里插入图片描述

setup()的参数props和context

   setup(props, context) {
       console.log(props);
       console.log(context);
   }

在这里插入图片描述

生命周期

选项 APIHook inside inside setup
beforeCreateNot needed*
createdNot needed*
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeUnmountonBeforeUnmount
unmountedonUnmounted
errorCapturedonErrorCaptured
renderTrackedonRenderTracked
renderTriggeredonRenderTriggered

提供和注入

  • provide,api声明
import {
    onMounted,
    onUpdated,
    reactive,
    ref,
    watch,
    computed,
    provide,
} from "vue";
setup(){
    const provide1 = provide("name", "rmq");
    const provide2 = provide("like", { dog: "wangwang", cat: "maomao" });
}
  • inject,api使用
<template>
    <h2>piTest</h2>
    <div>{{inject1}}</div>
    <div>{{inject2}}</div>
</template>

<script>
import { inject } from "vue";
export default {
    setup() {
        const inject1 = inject("name");
        const inject2 = inject("like");
        return {
            inject1,
            inject2,
        };
    },
};
</script>

<style>
</style>

在这里插入图片描述

  • 也可以声明响应式的
     const name = ref("rmq");
     const like = reactive({ dog: "wangwang", cat: "maomao" });
     const provide1 = provide("name", name);
     const provide2 = provide("like", like);
     const changeProvide1 = () => {
         name.value = "xr";
     };
     const changeProvide2 = () => {
         like.dog = "ww";
         like.cat = "mm";
     };

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值