组合式API - provide和inject、Vue3小案例【Vue3】

news2024/12/28 3:46:23

组合式API - provide和inject

作用和场景:顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信
跨层传递普通数据

  1. 顶层组件通过provide函数提供数据 provide('key', 顶层组件中的数据)
  2. 底层组件通过inject函数获取数据 const message = inject('key')

跨层传递响应式数据
在调用provide函数时,第二个参数设置为ref对象
顶层组件:provide('app-key', ref对象)
底层组件:const message = inject('app-key')

<template>
  <div class="page">
    顶层组件
    <RoomMsgItem/>
  </div>
</template>

<script setup>
import {provide, ref} from 'vue'
import RoomMsgItem from './room-msg-item.vue'
//组件嵌套关系:RoomPage -> RoomMsgItem ->RoomMsgComment

// 1.顶层组件提供数据
provide('data-key', 'this is room data')

// 传递响应式的数据
const count = ref(0)
prodive('count-key', count)
setTimeout(()=>{
    count.value = 100
}, 3000)
</script>

<style>

</style>
<script setup>
import { inject } from "vue";

// 2.接收数据
const roomData = inject('data-key')

//接收响应式数据
const countData = inject('count-key')
</script>

<template>
    <div class="comment">
        底层组件
        <div>
            来自顶层组件中的数据为:{{ roomData }}
        </div>
        <div>
            来自底层组件中的数据为:{{ counntData }}
        </div>
    </div>
</template>

<style>

</style>

跨层传递方法
顶层组件可以向底层组件传递方法,底层组件调用方法修改顶层组件中的数据
总结:

  1. provide和inject的作用是什么?
    跨层组件通信
  2. 如何在传递过程中保持数据响应式?
    第二个参数传递ref对象
  3. 底层组件想要通知顶层组件做修改,如何做?
    传递方法,底层组件调用方法
  4. 一颗组件树中只有一个顶层或底层组件吗?
    相对概念,存在多个顶层和底层的关系

Vue3小案例

在这里插入图片描述
App.vue

<script setup>
import { onMounted, ref } from 'vue'
import Edit from './components/Edit.vue'
import axios from 'axios'


// TODO: 列表渲染
// 思路:声明响应式list -> 调用接口获取数据 -> 后端数据赋值给list -> 绑定到table组件
const list = ref([])
const getList = async () => {
  // 接口调用
 const res = await axios.get('./list')
  // 交给list
  list.value = res.data
}

onMounted(()=>getList())

// TODO: 删除功能
//思路:获取当前行的id -> 通过id调用删除接口 -> 更新最新的列表

const onDelete = async (id) => {
  console.log(id);
  await axios.delete(`/del/${id}`)
  getList()
}

// TODO: 编辑功能
// 思路:打开弹框 -> 回填数据 -> 更新数据

// 1.打开弹框(获取到子组件实例 调用方法或者修改属性)
// 2.回填数据(调用详情接口 / 当前行的静态数据)
const editRef = ref(null)
const onEdit = (row)=>{
  editRef.value.open(row)
}



</script>

<template>
  <div class="app">
    <el-table :data="list">
      <el-table-column label="ID" prop="id"></el-table-column>
      <el-table-column label="姓名" prop="name" width="150"></el-table-column>
      <el-table-column label="籍贯" prop="place"></el-table-column>
      <el-table-column label="操作" width="150">
        <template #default="{row}">
          <el-button type="primary" @click="onEdit(row)" link>编辑</el-button>
          <el-button type="danger" @click="onDelete(row.id)" link>删除</el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
  <Edit ref="editRef" @on-update="getList"/>
</template>

<style scoped>
.app {
  width: 980px;
  margin: 100px auto 0;
}
</style>

components/Edit.vue

<script setup>
// TODO: 编辑
import axios from 'axios'
import { ref } from 'vue'

// 弹框开关
const dialogVisible = ref(false)
// 准备form
const form = ref({
  name: '',
  place: '',
  id: ''
})
const open = (row)=>{
  console.log(row);
  form.value.name = row.name
  form.value.place = row.place
  form.value.id = row.id
  dialogVisible.value = true
}
defineExpose({
  open
})

// 更新
const emit = defineEmits(['on-update'])
const onUpdate = async ()=>{
// 1.收集表单数据 调用接口
  await axios.patch(`/edit/${form.value.id}`, {
    name: form.value.name,
    place: form.value.place,
  })
// 2.关闭弹框
dialogVisible.value = false
// 3.通知父组件做列表更新
emit('on-update')

}
</script>

<template>
  <el-dialog v-model="dialogVisible" title="编辑" width="400px">
    <el-form label-width="50px">
      <el-form-item label="姓名">
        <el-input placeholder="请输入姓名" v-model="form.name"/>
      </el-form-item>
      <el-form-item label="籍贯">
        <el-input placeholder="请输入籍贯" v-model="form.place"/>
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="onUpdate">确认</el-button>
      </span>
    </template>
  </el-dialog>
</template>

<style scoped>
.el-input {
  width: 290px;
}
</style>

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

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

相关文章

每日学术速递6.14

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Realistic Saliency Guided Image Enhancement 标题&#xff1a;现实显着性引导图像增强 作者&#xff1a;S. Mahdi H. Miangoleh, Zoya Bylinskii, Eric Kee, Eli Shechtman, Ya…

js创建对象三种方式

创建对象三种方式 1、利用对象字面量创建对象2、利用 new Object 创建对象3、利用构造函数创建对象3.1 构造函数 1、利用对象字面量创建对象 const obj {name: 张三,age: 20 } console.log(obj)结果如下&#xff1a; 2、利用 new Object 创建对象 const obj new Object({…

Jmeter使用||接口测试实战

标题 Jmeter与postman一样&#xff0c;都可以用来进行接口测试。 前面的文章&#xff08; 测试工具介绍||Jmeter的简单使用&#xff09;&#xff0c;介绍了jmeter的下载、安装及简单使用。基于此背景&#xff0c;通过实例的形式&#xff0c;来介绍下如何利用jmeter进行接口测试…

Rancher集群containerd导出镜像

奇墨科技是国内领先的全域IT质量管理平台及服务商&#xff0c;创始团队为在ITSM、公有云&#xff0c;私有云&#xff0c;超融合及安全业务方向服务多年的业界精英团队&#xff0c;尤其具备领先的运维服务和业务理解能力&#xff0c;已服务了大量的世界及中国500强客户&#xff…

【深度学习】3-4 神经网络的学习- 学习算法的实现

神经网络的学习步骤如下所示&#xff1a; 步骤1(mini-batch) 从训练数据中随机选出一部分数据&#xff0c;目标是减小mini-batch的损失函数的值 步骤2(计算梯度) 为了减小mini-batch的损失函数的值&#xff0c;需要求出各个权重参数的梯度 步骤3(更新参数) 将权重参数沿梯度…

redhat 6.4安装oracle11g RAC (四)

创建集群数据库 在节点rac1上用oracle用户执行dbca创建RAC数据库 [rootrac1 ~]# su - oracle [oraclerac1 ~]$ dbca选择创建数据库 自定义数据库&#xff08;也可以是通用&#xff09; 配置类型选择Admin-Managed&#xff0c;输入全局数据库名orcl&#xff0c;每个节点实例SI…

java线上问题排查基本命令

1、jvm基本命令 1.1、java命令 1.1.1、简介 java命令启动java应用程序。它通过启动Java运行时环境&#xff08;JRE&#xff09;、加载指定的类并调用该类的main&#xff08;&#xff09;方法来实现这一点。 1.1.2、命令链接 https://docs.oracle.com/javase/8/docs/techno…

electron 连接打印机打印pdf文件

electron 打印内容 区分系统 类似unix系统的使用 npm包&#xff1a;unix-printwindow系统使用&#xff1a; pdf-to-printer 运行线程 视图线程 函数参数 两个包都提供了print函数来打印文件&#xff0c;配置基本一致&#xff0c;只是参数形式有所不同&#xff0c;pdf-to-pr…

ESP32开发环境搭建Windows VSCode集成Espressif IDF插件ESP32_IDF_V5.0开发编译环境搭建

一、安装ESP32-IDF库 下载网址&#xff1a;https://dl.espressif.com/dl/esp-idf/ 打开上面的网页&#xff0c;选择单击页面中 ESP32-IDF v5.0.2 - Offine Installer&#xff0c;5.0.2是当前最新版本&#xff0c;如果没有ESP32-IDF v5.0.2 - Offine Installer&#xff0c;说明…

JS获取省市区/县,layui获取省市区,layui实现省市区联动,jquery实现省市区联动

前言 通过JS方式获取省市区数据&#xff0c;可自己手动更改JS文件数据 非常简单 效果 实现 百度网盘链接: https://pan.baidu.com/s/1RktJgXY0NP7Eq0ohvBPOEA 提取码: 477z gitee下载链接&#xff1a;https://gitee.com/yuanyongqiang/common-files/blob/master/area.js 下…

超高压系列IXBX50N360HV、IXBT14N300HV、IXBH32N300高压反向导通 (BiMOSFET™) IGBT器件

器件介绍&#xff1a; 超高压系列3000V - 3600V反向导通 (BiMOSFET™) IGBT将MOSFET和IGBT的优势相结合。这些高压器件的饱和电压和内置二极管的正向电压降均具有正电压温度系数&#xff0c;因此非常适合用于并联运行。“自由”内置体二极管用作保护二极管&#xff0c;为器件关…

LibOS Gramine安装

文章目录 参考资料Gramine安装运行helloworld升级kernel到5.15 参考资料 Gramine Quick start Gramine安装 Gramine安装要求&#xff1a; Linux 内核版本至少为 5.11&#xff08;启用 SGX 驱动程序&#xff09; 如果是5.4.0-150-generic版本&#xff0c;则可以参考《Install …

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像写入相机内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像写入相机内存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和相机内存的技术背景Baumer工业相机通过BGAPISDK将相机图像写入相机内存功能1.引用合适的类文件2.通过BGAPISDK将相机图像写入相机内存功能…

ADManager Plus:提升企业管理效率的强大利器

导语&#xff1a; 在当今数字化时代&#xff0c;企业管理的重要性不言而喻。有效的企业管理可以提高生产力、优化业务流程&#xff0c;并促进组织的持续增长。而ADManager Plus作为一款功能强大的企业管理工具&#xff0c;为企业提供了全面的解决方案&#xff0c;帮助企业管理…

从0到1精通自动化测试,pytest自动化测试框架,Fixture之conftest.py与yield实现teardown(四)

目录 一、Fixture之conftest.py 1、Fixture优势 2、fixture参数传入&#xff08;scope”function”&#xff09; 3、conftest.py配置 二、Fixture之yield实现teardown 1、scope“module” 2、yield执行teardown 3、yield遇到异常 4、addfinalizer终结函数 一、Fixture…

【云原生•监控】基于Prometheus的云原生集群监控(理论+实践)-01

【云原生•监控】基于Prometheus的云原生集群监控(理论实践)-01 前言 「笔者已经在公有云上搭建了一套临时环境&#xff0c;可以先登录体验下&#xff1a;」 http://124.222.45.207:17000/login 账号&#xff1a;root/root.2020 云原生监控挑战 Prometheus 是用 Go 语言编写&am…

FreeRTOS实时操作系统(四)中断任务管理

系列文章目录 文章目录 系列文章目录前言中断优先级FreeRTOS中的中断管理一系列中断管理寄存器中断配置寄存器中断屏蔽寄存器 中断管理实战 前言 跟着正点原子学习一下中断管理&#xff0c;正好之间没有总结过&#xff0c;还有些地方不清楚。 中断优先级 中断的工作方式就不介…

Oracle的DCL、DDL、DML语言学习使用——oracle入门学习(一)

Oracle的DCL、DDL、DML语言学习使用 前言1.SQL Plus1.1 命令行SQL PLUS使用sqlplus /nologsqlplus / as sysdba 1.2 oracle自带SQL PLUS使用1.3 sys和system用户的区别 2. Oracle的体系结构3.DCL语言什么是DCL语言3.1 查看数据文件位置和表空间3.2 创建表空间3.3 删除表空间3.4…

鉴源实验室丨TBOX通讯模组AT指令测试

作者 | 李伟 上海控安安全测评部总监 来源 | 鉴源实验室 引言&#xff1a;上一篇文章我们讲了整车的OTA升级测试(详解车载设备FOTA测试&#xff09;&#xff0c;本篇我们介绍在车载零配件上比较少见却很实用的测试&#xff1a;通讯模组的AT&#xff08;Attention&#xff09;指…

总结Nginx的安装、配置与设置开机自启

在Ubuntu下安装Nginx有以下方法&#xff0c;但是如果想要安装最新版本的就必须下载源码包编译安装。 一、Nginx安装 1、基于APT源安装 sudo apt-get install nginx 安装好的文件位置&#xff1a; /usr/sbin/nginx&#xff1a;主程序 /etc/nginx&#xff1a;存放配置文件 /us…