当前位置:   article > 正文

Vue3快速上手(简易版)

Vue3快速上手(简易版)

0.小前置

  1. <script lang="ts" setup name="App">
  2. <style scoped>

        define开头的函数是可以不用引入的哦

第一阶段:ref (值,对象响应化), reactive(对象响应化)

        1.ref处理响应式数据 ref (单值)

                目标1:实现一个加法

  1. <template>
  2.    <p>这是一个数字{{ number }}</p>
  3.    <button @click="Add">我是加法</button> //绑函数
  4. </template>
  5. <script setup lang="ts">
  6. import { ref } from "vue" //引入响应包
  7. let number = ref(0); //数据响应化
  8. function Add(){
  9.    number.value++; //必须改数据的值
  10. }
  11. </script>

        2.reactive处理响应式数据 reactive (只能对象,数组)

                目标1:实现一个对象修改

  1. <template>
  2.    <p>我是{{ number.name }} , 我值{{ number.price }}元</p>
  3.    <button @click="Add">我是加法</button>
  4. </template>
  5. <script setup lang="ts">
  6. import { reactive } from "vue" //引入响应包
  7. let number = reactive({name:"苹果",price:100}); //数据响应化
  8. function Add(){
  9.    number.price = number.price + 10;
  10. }
  11. </script>

        3.ref处理响应式数据 ref (对象,数组)

                目标1:实现一个对象修改

  1. <template>
  2.    <p>我是{{ number.name }} , 我值{{ number.price }}元</p>
  3.    <button @click="Add">我是加法</button>
  4. </template>
  5. <script setup lang="ts">
  6. import { ref } from "vue"
  7. let number = ref({name:"苹果",price:100});
  8. function Add(){
  9.    number.value.price = number.value.price + 10;
  10. }
  11. </script>

        4.上述小知识总结

                ref > reactive ------- ref._value == reactive

                        宏观角度看:

                                1.ref 用来定义:--> 基本类型数据 , 对象类型数据

                                2.reactive用来定义:--> 对象类型数据

                        区别:

                                1.ref创建的变量必须使用.value

                                2.reactive重新分配一个新对象,会失去响应式

                        使用原则:

                                1.若需要一个基本类型的响应式数据,必须使用ref

                                2.若需要一个响应式对象,层级不深,ref,reactive都可以

                                3.若需要一个响应式对象,且层级较深,推荐使用reactive

        5.(1,2,3重难点)(数据的再赋值)ref,reactive

                ref

  1. <template>
  2.    <p>我是{{ number.name }} , 我值{{ number.price }}元</p>
  3.    <button @click="Add">我是加法</button>
  4.    <button @click="Switch">我是切换</button>
  5. </template>
  6. <script setup lang="ts">
  7. import { ref } from "vue"
  8. let number = ref({name:"苹果",price:100});
  9. function Add(){
  10.    number.value.price = number.value.price + 10;
  11. }
  12. function Switch(){
  13.    number.value = {name:"梨" , price: 200}
  14. }
  15. </script>

                reactive

  1. <template>
  2.    <p>我是{{ number.name }} , 我值{{ number.price }}元</p>
  3.    <button @click="Add">我是加法</button>
  4.    <button @click="Switch">我是切换</button>
  5. </template>
  6. <script setup lang="ts">
  7. import { reactive } from "vue"
  8. let number = reactive({name:"苹果",price:100});
  9. function Add(){
  10.    number.price = number.price + 10;
  11. }
  12. function Switch(){
  13.    //number = {name:"梨" , price: 200} //错误写法
  14.    //number = reactive({name:"梨" , price: 200}) //错误写法
  15.    Object.assign(number,{name:"梨" , price: 200})
  16. }
  17. </script>

——————————————————————————————————————

恭喜你,学到这你已经学完了Vue3的第一阶段了

——————————————————————————————————————

第二阶段:toRefs , toRef (内值响应化)

        前置

                toRefs与reactive的比对 , ref好像不需要

  1. Proxy(Object) {name: '苹果', price: 100} //reactive的内值并没有响应化
  2. {name: ObjectRefImpl, price: ObjectRefImpl} //toRefs会使内值响应化
        所以,我们现在有一个要解决的问题
  1. <template>
  2. <p>我是{{ number.name }} , 我值{{ number.price }}元</p>
  3. <button @click="Add">我是加法</button>
  4. </template>
  5. <script setup lang="ts">
  6. import { reactive } from "vue"
  7. let number = reactive({
  8. name:"苹果",
  9. price:100
  10. });
  11. let {price} = number;
  12. function Add(){
  13. price += 1 //为什么数据没有发生变化
  14. }
  15. </script>

        1.toRefs数据内全值响应化

                目标1:使内数据响应化

  1. <template>
  2. <p>我是{{ number.name }} , 我值{{ number.price }}元</p>
  3. <button @click="Add">我是加法</button>
  4. </template>
  5. <script setup lang="ts">
  6. import { reactive , toRefs } from "vue"
  7. let number = reactive({
  8. name:"苹果",
  9. price:100
  10. });
  11. let {price} = toRefs(number); //内数据ref化 ,注:此处为地址引用,
  12. //修改的为实际number
  13. function Add(){
  14. price.value += 1 //所以这里要加value
  15. }
  16. </script>

        2.toRef数据内单值响应化

                目标1:使内数据某一个值响应化

  1. <template>
  2. <p>我是{{ number.name }} , 我值{{ number.price }}元</p>
  3. <button @click="Add">我是加法</button>
  4. </template>
  5. <script setup lang="ts">
  6. import { reactive , toRef } from "vue"
  7. let number = reactive({
  8. name:"苹果",
  9. price:100
  10. });
  11. let price = toRef(number , "price")
  12. function Add(){
  13. price.value += 1
  14. }
  15. </script>

——————————————————————————————————————

恭喜你,学到这你已经学完了Vue3的第二阶段了

——————————————————————————————————————

第三阶段:computed , v-model

        彩蛋插入 v-model

                打断一下,这里教大家一下数据的双向绑定v-model

  1. <template>
  2. 姓:<input type="text" v-model="firstName"><br>
  3. 名:<input type="text" v-model="lastName"><br>
  4. 姓名:{{ firstName + lastName }}
  5. </template>
  6. <script setup lang="ts">
  7. import { ref } from "vue"
  8. let firstName = ref("博丽")
  9. let lastName = ref("七七")
  10. </script>

                当数据更改时 input.value赋值给firstName导致姓名发生变化,lastName同理

        1.computed处理多次执行函数(有缓存)

                目标1:不想让全名等于firstName+lastName

  1. <template>
  2. 姓:<input type="text" v-model="firstName"><br>
  3. 名:<input type="text" v-model="lastName"><br>
  4. 姓名:{{ fullName }}
  5. </template>
  6. <script setup lang="ts">
  7. import { ref , computed } from "vue"
  8. let firstName = ref("博丽")
  9. let lastName = ref("七七")
  10. let fullName = computed(()=>{
  11. return firstName.value + lastName.value;
  12. })
  13. </script>

        但是,我们又出现了新的问题,computed绑定的fullName是可读的,我们修改不了它的值,fullName.value = ”1“ 这会报错的,那我们应该怎么优化呢?

  1. <template>
  2. 姓:<input type="text" v-model="firstName"><br>
  3. 名:<input type="text" v-model="lastName"><br>
  4. 姓名:{{ fullName }}
  5. </template>
  6. <script setup lang="ts">
  7. import { ref , computed} from "vue"
  8. let firstName = ref("博丽")
  9. let lastName = ref("七七")
  10. let fullName = computed({
  11. get(){
  12. return firstName.value + lastName.value
  13. },
  14. set(val){ val就是传入的fullName.value
  15. console.log(val)
  16. firstName.value = val
  17. .... //这里我们就可以进行后续操作啦
  18. }
  19. })

——————————————————————————————————————

恭喜你,学到这你已经学完了Vue3的第三阶段了

——————————————————————————————————————

第四阶段:watch(手动监视器) , watchEffect(自动监视器)

        前置

                作用:监视数据的变化

                特点:Vue3中的watch只能监视以下四种数据

                        1.ref定义的数据

                        2.reactive定义的数据

                        3.函数返回一个值

                        4.一个包含上述内容的数组

                注:watch里ref不写value哦

        1.watch监视情况1 ref

                目标1:加到10后停止输出

  1. <template>
  2. 我是数字{{ number }}
  3. <button @click="Add">我是加法</button>
  4. </template>
  5. <script setup lang="ts">
  6. import { ref, watch } from "vue"
  7. let number = ref(0);
  8. function Add() {
  9. number.value++;
  10. }
  11. const stopWatch = watch(number, (newValue, oldValue) => {
  12. console.log(newValue , oldValue);
  13. if(newValue > 10){
  14. stopWatch() //大于10就结束监视
  15. }
  16. })
  17. </script>

        2.watch深度监视 ref

                若修改的是ref定义的对象中的属性,newValue和oldValue都是新值,因为它们是同一个对象

                若修改整个ref定义的对象,newValue是新值,oldValue是旧值,因为不是同一个对象了

                目标1:深度监视

  1. <template>
  2. 我是名字:{{ number.name }}<br>
  3. 我是价格:{{ number.price }}<br>
  4. <button @click="Add">我是加法</button>
  5. <button @click="Switch">我是切换</button>
  6. </template>
  7. <script setup lang="ts">
  8. import { ref, watch } from "vue"
  9. let number = ref({name:"博丽七七" , price:100});
  10. function Add() {
  11. number.value.price++;
  12. }
  13. function Switch(){
  14. number.value = {name:"李四" , price:300}
  15. }
  16. watch(number, (newValue, oldValue) => {
  17. console.log(newValue , oldValue);
  18. } , {deep:true})//深度监视可选
  19. </script>

                此时,有个注意点深度监视开启时,如果价格改变,新旧值则是相同的

  1. Proxy(Object) {name: '博丽七七', price: 101}
  2. Proxy(Object) {name: '博丽七七', price: 101}
  1. ​​​​​​​Proxy(Object) {name: '博丽七七', price: 101}
  2. Proxy(Object) {name: '博丽七七', price: 101}

                如果改变对象,新旧值则是

  1. Proxy(Object) {name: '李四', price: 300}
  2. Proxy(Object) {name: '博丽七七', price: 102}

                一般我们不管旧值

        3.watch深度监视 reactive

                监视reactive定义的对象类型数据,默认开启了深度监视,且无法关闭

                同上

  1. <template>
  2. 我是名字:{{ number.name }}<br>
  3. 我是价格:{{ number.price }}<br>
  4. <button @click="Add">我是加法</button>
  5. <button @click="Switch">我是切换</button>
  6. </template>
  7. <script setup lang="ts">
  8. import { reactive, watch } from "vue"
  9. let number = reactive({name:"博丽七七" , price:100});
  10. function Add() {
  11. number.price++;
  12. }
  13. function Switch(){
  14. Object.assign(number,{name:"李四" , price:300})
  15. }
  16. watch(number, (newValue, oldValue) => {
  17. console.log(newValue , oldValue);
  18. })
  19. </script>

        4.watch监听特定属性

                若该属性值不是对象类型,需要写成函数形式

                若该属性值依然是对象类型,可直接写,也可写成函数,建议直接写成函数

                同上

  1. <template>
  2. 我是名字:{{ number.name }}<br>
  3. 我是价格:{{ number.price }}<br>
  4. <button @click="Add">我是加法</button>
  5. <button @click="Switch">我是切换</button>
  6. </template>
  7. <script setup lang="ts">
  8. import { reactive, watch } from "vue"
  9. let number = reactive({
  10. name: "博丽七七",
  11. price: 100,
  12. other: {
  13. a: 1,
  14. b: 2,
  15. }
  16. });
  17. function Add() {
  18. number.price++;
  19. number.other.a++;
  20. }
  21. function Switch() {
  22. Object.assign(number, { name: "李四", price: 300 })
  23. }
  24. watch(() => number.price, (newValue, oldValue) => {
  25. console.log(newValue, oldValue);
  26. })
  27. //这里只展示推荐写法
  28. watch(() => number.other, (newValue, oldValue) => {
  29. console.log(newValue, oldValue);
  30. }, { deep: true })
  31. </script>

        5.watch监视多个数据

                同上

  1. watch([() => number.other , number.price , ......], (newValue, oldValue) => {
  2. console.log(newValue, oldValue);
  3. }, { deep: true })

        其他

  1. watch([temp , heigth], (Value) => {
  2. let [newTemp , newHeigt] = value
  3. 传入不同变化,是会赋给两个哦
  4. })

        6.watchEffect实现自动监视

                watch与watchEffect对比

                        1.都能监听响应式数据的变化,不同的是监听数据变化的方式不同

                        2.watch:要明确指出监视的数据

                        3.watchEffect:不用明确指出监视的数据

                目标1:实现一个水位控制器

  1. <template>
  2. 需求:当水温达到60度,或水位达到80cm<br>
  3. 当前水温:{{ temp }}<br>
  4. 当前水位:{{ height }}<br>
  5. <button @click="tempAdd">增加水温</button><br>
  6. <button @click="heightAdd">增加水位</button><br>
  7. </template>
  8. <script setup lang="ts">
  9. import { ref, watchEffect } from "vue"
  10. let temp = ref(10);
  11. let height = ref(0);
  12. function tempAdd() {
  13. temp.value += 10;
  14. }
  15. function heightAdd() {
  16. height.value += 10;
  17. }
  18. watchEffect(()=>{
  19. if(temp.value >=60 || height.value >=80){
  20. console.log("发出警告")
  21. }
  22. })
  23. </script>
  24. <style></style>

                与之相对的watch写法

  1. watch([temp , height],(value)=>{
  2. let [newTemp , newHeight] = value
  3. if(newTemp >= 60 || newHeight >= 80){
  4. console.log("发出警告")
  5. }
  6. })

——————————————————————————————————————

恭喜你,学到这你已经学完了Vue3的第四阶段了

——————————————————————————————————————

第五阶段(休息区):标签内ref , defineExpose(暴露值)

        这里是轻松愉快小课堂

        父组件

  1. <template>
  2. <Test ref="abc"></Test> //ref命名
  3. <button @click="add">点我</button>
  4. </template>
  5. <script setup lang="ts">
  6. import Test from "./components/test.vue"
  7. import { ref } from "vue";
  8. let abc = ref() //ref获取
  9. function add() {
  10. console.log(abc.value.a) //获取子组件的值
  11. }
  12. </script>

        子组件

  1. <template></template>
  2. <script setup lang="ts">
  3. import { ref, defineExpose } from "vue";
  4. let a = ref("你好");
  5. let b = ref(1);
  6. defineExpose({ a, b }) //注意:必须要暴露出去父组件才可以拿的到哦
  7. </script>

——————————————————————————————————————

恭喜你,学到这你已经学完了Vue3的第五阶段了

——————————————————————————————————————

第六阶段:这里是TS区(想看就看,不看也行)

        How to write an interface document about typescript

        my typescript file

  1. export interface PersonInter {
  2. id:string,
  3. name:string,
  4. age:number
  5. price?:number //这是可选的
  6. } //这是给对象用的
  7. export type Persons = Array<PersonInter , ... , ...>//这是给数组用的
  8. export type Persons = PersonInter[]//这么写也写

        use file

  1. <script ... ... >
  2. import {type PersonInter , type Persons} from "ts路径"//记得要写type哦
  3. let personList:Persons = [{},{},{}]
  4. let personList = reactive<Persons>([{},{},{}])//优雅写法

——————————————————————————————————————

恭喜你,学到这你已经学完了Vue3的第六阶段了...呃,应该叫ts第一阶段

——————————————————————————————————————

第七阶段:终于到props啦 ,withDefaults

        这节涉及到组件通信,非常重要哦,一定要好好听

        入门

                父组件

<子组件 a = "abc"></子组件>	//父组件往子组件传了个值

                子组件

  1. <template>
  2. {{ a }}
  3. </template>
  4. <script ... ... >
  5. import { defineProps } from "vue"
  6. defineProps(["a"]) //获得父组件传入的值
  7. //注意,defineProps是有返回值的,返回值为对象
  8. const jkl = defineProps(["a"])//打印的话是一个对象哦
  9. </script>

        基础props (限制类型)

defineProps<{list:Persons}>()	//同ts , ()里面没东西

        进阶props (限制类型+限制必要性+指定默认值)

  1. import { withDefaults } from "vue"
  2. withDefaults(defineProps<{list?:Persons}>(),{
  3. list:()=> [{id:... , name:... , ......}]
  4. })
  5. <Test person="ppa" ></Test>
  6. withDefaults(defineProps<{person?: string}>(),{
  7. person: "bbc"
  8. })

——————————————————————————————————————

这么难的props居然都被你学会了,继续加油吧,第七阶段, complete!

——————————————————————————————————————

第八阶段:生命周期函数!!!

        这个不难,直接按流程走一遍就行

  1. import { ref , onBeforeMount , onMounted ,
  2. onBeforeUpdate , onUpdated ,
  3. onBeforeUnmount , onUnmounted} from "vue"
  4. let sum = ref(0) //数据
  5. function add(){} //方法
  6. console.log() //创建
  7. onBeforeMount(()=>{}) //挂载前
  8. onMounted(()=>{}) //挂载完毕 出生
  9. onBeforeUpdate(()=>{}) //数据更新前
  10. onUpdated(()=>{}) //数据更新完毕 常用
  11. onBeforeUnmount(()=>{}) //卸载前 例如v-if不满足的时候
  12. onUnmounted(()=>{}) //卸载完毕 常用

        子优先于父

——————————————————————————————————————

第八阶段结束了,进入第九阶段Ciallo~(∠・ω< )⌒★

——————————————————————————————————————

第九阶段:进网络啦,这阶段我写的比较杂

        简单axios , 记得下载axios

  1. import { ref , reactive } from "vue"
  2. import axios from "axios"
  3. export default function (){
  4. let doglist = reactive([...])
  5. async function getDog(){
  6. try{
  7. let result = await axios.get()
  8. dogList.push(result.data.message)
  9. } catch(error){
  10. alert(error)
  11. }
  12. }
  13. //向外部提供东西
  14. return {dogList , getDog}
  15. }

        什么是hook

                进入src目录,创建hook文件,里面就放常调用的函数

                使用

  1. import useDog from "@/hook/useDog"
  2. const {dogList,getDog} = useDog()

——————————————————————————————————————

恭喜你,学到这你已经学完了Vue3的第九阶段了

——————————————————————————————————————

第十阶段:路由

        安装vue-router src文件夹里创建router文件夹

        创建一个ts文件

  1. import { createRouter, createWebHistory } from "vue-router"
  2. //引入一个一个可能要呈现的组件
  3. import abc from "@/components/test.vue"
  4. //创建路由
  5. const router = createRouter({
  6. history: createWebHistory(),
  7. routes: [
  8. {
  9. path:"/home",
  10. component:abc
  11. }
  12. ]
  13. })
  14. export default router

        main.ts里引入router , 使用router

        RouterView路由插槽占位

                父组件

  1. <RouterLink to="路由path" active-class="激活时的类名"></RouterLink>
  2. //略等于a标签 , active-class路由自带的
  3. to的第二种写法--> :to="{path:"/about"}"
  4. <RouterView></RouterView> //路由展示区
  5. <script......>
  6. import { RouterView , RouterLink } from "vue-router"
  7. </script>

                src创建pages或views放路由页

                换路由会被视作生命周期(卸载)

        命名路由

                定义

  1. routes: [
  2. {
  3. name:"abc"
  4. path:"/home",
  5. component:abc
  6. }
  7. ]

                使用

<RouterLink :to="{name:'abc'}" active-class="激活时的类名"></RouterLink>

        子集路由

                定义

  1. routes: [
  2. {
  3. name:"abc"
  4. path:"/home",
  5. component:abc,
  6. children:[
  7. {
  8. path:"detail" //子集就不用写/了
  9. component:...
  10. }
  11. ]
  12. }
  13. ]

                使用 , 别忘了路由插槽

<RouterLink to="/news/detail"></RouterLink>

        query参数 (query版路由传参)

                太简单了,直接上代码

                        父组件

  1. <RouterLink
  2. :to="{
  3. path:"/fff/fff",
  4. query:{
  5. id:news.id,...
  6. title:news.title...
  7. }
  8. }"></RouterLink>
  9. //等同于....?fff=...&kkk=...

                路由页获取

  1. {{ query.id }}
  2. <script>
  3. import { toRefs } from "vue"
  4. import { useRoute } from "vue-router"
  5. let route = useRoute()
  6. let { query } = toRefs(route)
  7. </script>

        params参数 (params版路由传参)

                太简单了,直接上代码

                路由规则 , 记得占位

  1. routes: [
  2. {
  3. name:"abc"
  4. path:"/home",
  5. component:abc,
  6. children:[
  7. {
  8. name:"//"
  9. path:"detail/:id/:title?" //子集就不用写/了
  10. //?为可选
  11. component:...
  12. }
  13. ]
  14. }
  15. ]

                父组件

                        RouterLink 不能用path换路由了

  1. <RouterLink
  2. :to="{
  3. name:"avcs",
  4. params:{
  5. id:news.id,...
  6. title:news.title...
  7. }
  8. }"></RouterLink>
  9. //等同于/.../.../...

                子组件用params就行

        props配置 (是路由参数获取变得更简单)

                第一种写法 (将路由收到的params参数作为props传给路由组件)

  1. children:[
  2. {
  3. name:"//"
  4. path:"detail/:id/:title?" //子集就不用写/了
  5. //?为可选
  6. component:...
  7. props:true
  8. }
  9. ]

                使用

  1. {{ id }}
  2. defineProps(["id"])

                第二种写法 (query传)

  1. children:[
  2. {
  3. name:"//"
  4. path:"detail/:id/:title?" //子集就不用写/了
  5. //?为可选
  6. component:...
  7. props(route){
  8. return route.query
  9. }
  10. }
  11. ]

                用法同上

                第三种写法 (随便传)

  1. children:[
  2. {
  3. name:"//"
  4. path:"detail/:id/:title?" //子集就不用写/了
  5. //?为可选
  6. component:...
  7. props:{
  8. a:100,
  9. b:200
  10. }
  11. }
  12. ]

        repalce属性 (禁止返回上一步)

<RouterLink replace :to="{name:'abc'}"></RouterLink>

                编程式路由导航(脱离RouterLink进行路由跳转)

                例:

  1. import { useRouter } from "vue-router"
  2. const router = useRouter()
  3. router.push("路由地址")

                正确写法

  1. const router = useRouter()
  2. interface NewsInter {
  3. id:string,
  4. number:number
  5. }
  6. function ...(news:NewInter){
  7. router.push({ //push换replace的话就不能返回上一步了 , 看需求
  8. name:"/"
  9. query:{
  10. id:news.id
  11. number:news.number
  12. }
  13. })
  14. }

        重定向

  1. path:"原路径"
  2. redirect:"新路由路径" -> 会执行这个地址

——————————————————————————————————————

最长的路由你也都学会了吗,太棒啦,继续加油吧

——————————————————————————————————————

第十一阶段:组件通信

        1.props (父传子 , 子传父)

                父传子

  1. <template>
  2. 父组件
  3. <Test :car="car"></Test>
  4. </template>
  5. <script setup lang="ts">
  6. import { ref } from "vue"
  7. import Test from "./components/test.vue"
  8. let car = ref("奔驰");
  9. </script>
  10. <template>
  11. 子拿到的{{ car }}
  12. </template>
  13. <script setup lang="ts">
  14. defineProps(["car"])
  15. </script>

                子传父

  1. <template>
  2. 父组件<br>
  3. 父拿到的{{ toy }}
  4. <Test :sendToy="getToy"></Test>
  5. </template>
  6. <script setup lang="ts">
  7. import { ref } from "vue"
  8. import Test from "./components/test.vue"
  9. let toy = ref("")
  10. function getToy(value:string){
  11. toy.value = value
  12. }
  13. </script>
  14. <template>
  15. 子给的{{ toy }}
  16. <button @click="sendToy(toy)">子给父的</button>
  17. </template>
  18. <script setup lang="ts">
  19. import { ref } from "vue"
  20. let toy = ref("玩具车");
  21. defineProps(["sendToy"])
  22. </script>

        2.自定义事件传参 emit

                子传父

  1. <template>
  2. 父组件<br>
  3. 父拿到的{{ toy }}
  4. <Test @sendToy="getToy"></Test>
  5. </template>
  6. <script setup lang="ts">
  7. import { ref } from "vue"
  8. import Test from "./components/test.vue"
  9. let toy = ref("")
  10. function getToy(value:string){
  11. toy.value = value
  12. }
  13. </script>
  14. ///
  15. <template>
  16. 子给的{{ toy }}
  17. <button @click="emit('sendToy' , toy)">子给父的</button>
  18. </template>
  19. <script setup lang="ts">
  20. import { ref } from "vue"
  21. let toy = ref("玩具车");
  22. const emit = defineEmits(["sendToy"])
  23. </script>

        3.mitt实现任意组件通信(第三方)

                记得下载 pnpm i mitt

                首先,src的目录里新建utils文件夹里面新建一个emitter.ts的文件

  1. //引入mitt
  2. import mitt from "mitt"
  3. const emitter = mitt()
  4. export default emitter

                使用

  1. <template>
  2. 父组件<br>
  3. 父有的{{ toy }}
  4. <Test></Test>
  5. <button @click="emitter.emit('send-toy' , toy)">父给子</button>
  6. </template>
  7. <script setup lang="ts">
  8. import { ref } from "vue"
  9. import Test from "./components/test.vue"
  10. import emitter from './utils/emitter';
  11. let toy = ref("玩具车")
  12. </script>
  13. /
  14. <template>
  15. 父给子的{{ toy }}
  16. </template>
  17. <script setup lang="ts">
  18. import { ref, onUnmounted } from "vue"
  19. import emitter from "../utils/emitter";
  20. let toy = ref("");
  21. emitter.on("send-toy", (value: string) => {
  22. toy.value = value
  23. })
  24. onUnmounted(() => {
  25. emitter.off("send-toy")
  26. })
  27. </script>

        4.v-model以后再说

        5.剩下的不写了,写多了记不住

——————————————————————————————————————

恭喜你,学到这你已经学完了Vue3的第十一阶段了

——————————————————————————————————————

第十二阶段:插槽

<slot></slot>

        具名插槽

  1. 插得元素
  2. <template v-slot:插槽名>
  3. 被插的
  4. <slot name="插槽名"></slot>

        作用域插槽

                插槽子传父

                        插得元素

  1. <template v-slot="params">
  2. <ul>
  3. <v-for="item in params.youxi":key="item.id"></v-for>
  4. </ul>
  5. </template>

                        被插的

  1. <slot :youxi="game"></slot>
  2. <script>
  3. let games = reactive([
  4. {},{},{}
  5. ])
  6. </script>

                插的起名这么起

<template v-slot:插槽名="params">
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/391476
推荐阅读
相关标签
  

闽ICP备14008679号