Vue3<script setup>语法糖下,实现父子组件通信以及数据监听。

news2024/11/24 2:10:44

在Vue3的script setup语法糖中,没有办法通过Vue2的ref、props、parent、中央时间总线等等众多方法,通过this指针简单的实现父子组件的通信,网络上也很少有关于script setup语法糖的相关教程,所以决定自己写一个详细教程,方便以后学习查看并记录。
在这里插入图片描述

一、通过defineProps()和watch()方法实现父子组件通信以及数据监听。

1.父组件代码实例:props传值

<script setup>
import { ref } from 'vue';
import { get_article_cates } from "@/api/api.js";
import Article from "./article/index.vue";
const cate_list=ref([]);
const active = ref(0)
const Cates=()=>{
    get_article_cates().then((res) => {
        cate_list.value=res.data.data;
    }).catch((err) => {
        console.log(err)
    })
}
Cates();
const cates_id=ref();
const go_cates=(data)=>{
    cates_id.value=data.id;
};

</script>

<template>
    <div class="hu_box">
        <var-tabs v-model:active="active" color="rgba(255, 255, 255, 0.35)" active-color="#1e131d" inactive-color="#36292f" class="hu_tab">
            <var-tab v-for="(item,index) in cate_list" @click="go_cates(item)">{{item.name}}</var-tab>
        </var-tabs>
        <div class="hu_index">
            <Article :cates_id="cates_id" />
        </div>
    </div>
</template>

2.子组件代码实例:defineProps()方法获取父组件的值,watch()方法监听props的值

<script setup>
import { ref, watch } from 'vue';
import { post_articles_list,get_article_details } from "@/api/api.js";
const Art_list=ref([]);

//子组件相关方法
let query={
    classifyID: '',
    page: 1,
    pagesize: 5 
}
const Articles_list=()=>{
    post_articles_list(query).then((res) => {
        Art_list.value=res.data.data;
    }).catch((err) => {
        console.log(err)
    });
}

//通信部分方法
//传入props数据
const props = defineProps({
    cates_id: String
})
if (props.cates_id==undefined) {
    Articles_list();
}
//数据监听
watch(() => props.cates_id, (newValue, oldValue) => {
  query.classifyID=newValue;
  Articles_list();
});
</script>

<template>
    <div class="hu_article">
        <div class="hu_son_box" v-for="(item,index) in Art_list" :key="index" @click="go_router(item.Id)">
            <div>{{ item.title }}</div>
            <div>{{ item.pub_date }}</div>
        </div>
    </div>
</template>

二、通过defineProps()、watch()、ref()、defineExpose()方法实现父子组件通信以及数据监听。

1.父组件代码实例:props传值、ref执行子组件方法

<script setup>
import { ref } from 'vue';
import { get_article_cates } from "@/api/api.js";
import Article from "./article/index.vue";
const cate_list=ref([]);
const active = ref(0)
const Cates=()=>{
    get_article_cates().then((res) => {
        cate_list.value=res.data.data;
    }).catch((err) => {
        console.log(err)
    })
}
Cates();
const cates_id=ref();
const Son_subassembly = ref();
const go_cates=(data)=>{
    cates_id.value=data.id;
    if (Son_subassembly.value) {
        Son_subassembly.value?.Articles_list();
    }
};

</script>

<template>
    <div class="hu_box">
        <var-tabs v-model:active="active" color="rgba(255, 255, 255, 0.35)" active-color="#1e131d" inactive-color="#36292f" class="hu_tab">
            <var-tab v-for="(item,index) in cate_list" @click="go_cates(item)">{{item.name}}</var-tab>
        </var-tabs>
        <div class="hu_index">
            <Article :cates_id="cates_id" ref="Son_subassembly"/>
        </div>
    </div>
</template>

2.子组件代码实例:defineProps()方法获取父组件的值,watch()方法监听props的值,defineExpose()暴露出子组件属性。

<script setup>
import { ref, watch } from 'vue';
import { post_articles_list,get_article_details } from "@/api/api.js";
const Art_list=ref([]);

//子组件相关方法
let query={
    classifyID: '',
    page: 1,
    pagesize: 5 
}
const Articles_list=()=>{
    post_articles_list(query).then((res) => {
        Art_list.value=res.data.data;
    }).catch((err) => {
        console.log(err)
    });
}

//通信部分方法
//传入props数据
const props = defineProps({
    cates_id: String
})
if (props.cates_id==undefined) {
    Articles_list();
}
//数据监听
watch(() => props.cates_id, (newValue, oldValue) => {
  query.classifyID=newValue;
});
//子组件实例暴露出属性:defineExpose
defineExpose({
    Articles_list
})
</script>

<template>
    <div class="hu_article">
        <div class="hu_son_box" v-for="(item,index) in Art_list" :key="index" @click="go_router(item.Id)">
            <div>{{ item.title }}</div>
            <div>{{ item.pub_date }}</div>
        </div>
    </div>
</template>

本文原创,原创不易,如需转载,请联系作者授权。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1091202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建IDEA模板

将常用的配置文件内容、模板框架等放到IDEA的模板中保存&#xff0c;方便以后使用。以mybatis-config.xml和一个映射文件为例&#xff08;这是我自己学习SSM时用到的&#xff0c;后面学习SpringBoot时发现配置都只需要写到application.yml中就ok了&#xff0c;配置变得非常简单…

07_03文件系统怎么玩的

文件系统 Linux将文件系统分为了两层&#xff1a;VFS&#xff08;虚拟文件系统&#xff09;、具体文件系统&#xff0c;如下图所示&#xff1a; VFS&#xff08;Virtual Filesystem Switch&#xff09;称为虚拟文件系统或虚拟文件系统转换&#xff0c;是一个内核软件层&#…

【计算机网络】IP协议详解

文章目录 一、引入 二、简单认识IP协议 2、1 IP协议基本概念 2、2 IP协议报文格式 2、3 分片与组装 2、3、1 MTU 与 MSS 2、4 网段划分 2、4、1 简单理解路由 2、4、2 IP地址 2、4、3 IP地址的划分 2、4、4 CIDR&#xff08;无类别域间路由&#xff09; 2、4、5 特殊的IP地址 …

磁盘非跨盘访问算法实现

1. 背景说明 本算法基于已将磁盘分布合并并排序为升序线性表。实现示例为&#xff1a;磁盘扇区大小&#xff1a;32&#xff08;可自定义&#xff09;&#xff0c;待拆分磁盘内存&#xff1a; [0 - 50]&#xff0c;[60 - 100]&#xff08;可增加&#xff09;。示意图如下&#x…

【电机控制】FOC电机控制

FOC&#xff08;Field-Oriented Control&#xff0c;磁场定向控制&#xff09;是一种电机控制策略&#xff0c;又称矢量控制&#xff0c;是通过控制变频器输出电压的幅值和频率控制三相直流无刷电机的一种变频驱动控制方法。 FOC 的实质是运用坐标变换将三相静止坐标系下的电机…

什么是 CSRF 、原理及其解决方式

什么是 CSRF &#xff1f; 跨站请求伪造&#xff08;CSRF&#xff0c;Cross-site request forgery&#xff09;&#xff0c;也称为 XSRF&#xff0c;Sea Surf 或Session Riding&#xff0c;是一个攻击向量&#xff0c;它欺骗 Web 浏览器在登录用户的应用程序中执行不需要的动作…

如何处理前端国际化和本地化?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

“比特币市场风起云涌:第三季度报告揭示表现和未来趋势“

要点&#xff1a; 比特币的季度价格表现较差&#xff0c;为 -11.5%&#xff0c;但今年迄今为止的表现仍优于大多数资产类别&#xff1b; 截至撰写本文时&#xff0c;上半年推动比特币上涨的美国购买力已完全减弱&#xff1b; 交易量、流动性、波动性和搜索趋势均继续…

idea安装汉化插件

settings plugins 插件搜索chinese 重启 成功

第五十五章 学习常用技能 - 删除存储的数据

文章目录 第五十五章 学习常用技能 - 删除存储的数据删除存储的数据重置存储Storage浏览表格 第五十五章 学习常用技能 - 删除存储的数据 删除存储的数据 在开发过程中&#xff0c;可能需要删除某个类的所有现有测试数据&#xff0c;然后重新生成它&#xff08;例如&#xff…

基于SSM的校园音乐平台系统

基于SSM的校园音乐平台系统~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 歌手管理 歌曲管理 摘要 校园音乐平台系统&#xff08;Campus Mu…

三、RocketMQ的JAVAAPI的基础概念

消息(Message) 生产者和消费者数据流转的基础数据模型&#xff0c;主要属性有 字段名默认值必要性说明Topicnull必填消息所属topic的名称Bodynull必填消息体Tagsnull选填消息标签&#xff0c;方便服务器过滤使用。目前只支持每个消息设置一个Keysnull选填代表这条消息的业务关…

飞花令游戏(Python)

飞花令是古时候人们经常玩一种“行酒令”的游戏&#xff0c;是中国古代酒令之一&#xff0c;属雅令。“飞花”一词则出自唐代诗人韩翃《寒食》中 春城无处不飞花 一句。行飞花令时选用诗和词&#xff0c;也可用曲&#xff0c;但选择的句子一般不超过7个字。 在《中国诗词大会》…

四、RocketMQ发送普通消息、批量消息和延迟消息

Producer发送普通消息的方式 1.同步发送消息 同步消息代表发送端发送消息到broker之后&#xff0c;等待消息发送结果后&#xff0c;再次发送消息 实现步骤 创建生产端&#xff0c;声明在哪个生产组注册NameServer地址构建Message实体&#xff0c;指定topic、tag、body启动…

论文阅读之《Learn to see in the dark》

Learning to See in the Dark-CVPR2018 Chen ChenUIUC&#xff08;伊利诺伊大学厄巴纳-香槟分校&#xff09; Qifeng Chen, Jia Xu, Vladlen Koltun Intel Labs(英特尔研究院) 文章链接&#xff1a;https://arxiv.org/pdf/1805.01934.pdfhttps://arxiv.org/pdf/1805.01934.p…

使用hugging face开源库accelerate进行多GPU训练(单机多卡)时,在保存模型结构的时候出现的问题

目录 问题描述问题分析问题解决 问题描述 我在保存模型结构的时候&#xff0c;先获取模型参数&#xff0c;然后再保存&#xff0c;代码如下&#xff1a; 图示代码是在训练主循环中的&#xff1a; 这种情况下会出现报错&#xff1a; nboundLocalError: UnboundLocalErrorloc…

计算机毕业设计选什么题目好?springboot 医院门诊在线预约挂号系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

《C++ Primer》练习9.52:使用栈实现四则运算

栈可以用来使用四则运算&#xff0c;是一个稍微有点复杂的题目&#xff0c;去学习了一下用栈实现四则运算的原理&#xff0c;用C实现了一下。首先要把常见的中缀表达式改成后缀表达式&#xff0c;然后通过后缀表达式计算&#xff0c;具体的原理可以参考这位博主的文章&#xff…

本、硕、博区别真的辣么大吗?

61&#xff1a; 发际线已经说明了一切…… Super Mario&#xff1a; 小学&#xff0c;老师告诉学生&#xff1a;“森林里有只老虎&#xff0c;已经被我关在笼子里&#xff0c;我会带你去那个地方&#xff0c;然后给你一把猎枪&#xff0c;告诉你猎枪怎么用&#xff0c;并开枪…