vue3组件之间通信(三)——爷孙组件传递属性和方法

2023-11-18


前言:爷孙组件使用prop一层一层传值和方法由于比较简单这里就不讲了,主要讲解使用$attrs是如何解决爷孙组件传值的

1:setup函数传递属性和方法($attrs)

1:代码

// 爷组件  grandFather.vue
<template>
  <div class="father">
    <h1>爷组件:{{ grandFatherMsg }}</h1>
    <Father
      :grandFatherMsg="grandFatherMsg"
      :str="'张三'"
      :num="111"
      :bol="true"
      @clickGrandFather="clickGrandFather"
      :sdfsdf="sdfsdf"
    />
  </div>
</template>
<script>
import { defineComponent, ref } from "vue";
import Father from "./father.vue";
export default defineComponent({
  components: {
    Father,
  },
  setup(prop, ctx) {
    const grandFatherMsg = ref("爷组件的值——张三");
    function clickGrandFather() {
      console.log("爷组件的log");
    }
    function sdfsdf() {
      console.log("爷组件的log222");
    }
    return {
      grandFatherMsg,
      clickGrandFather,
      sdfsdf,
    };
  },
});
</script>
// 父组件   father.vue
<template>
  <div class="father">
    <h1>父组件</h1>
    <grandSon v-bind="$attrs" />
  </div>
</template>
<script>
import { defineComponent } from "vue";
import grandSon from "./grandSon.vue";
export default defineComponent({
  components: {
    grandSon,
  },
  setup(prop, ctx) {
    console.log("父组件", prop, ctx);
    return {};
  },
});
</script>
// 孙组件   grandSon.vue
<template>
  <div class="grandSon">
    <h2>孙组件</h2>
    <button @click="clickgrandSon">点我触发爷组件</button>
  </div>
</template>
<script>
import { defineComponent, ref } from "vue";
export default defineComponent({
  setup(prop, ctx) {
    console.log("孙组件", prop, ctx.attrs);
    // 孙组件的方法
    function clickgrandSon() {
      ctx.attrs.onClickGrandFather();
      ctx.attrs.sdfsdf();
      console.log("grandSon的log");
    }
    return {
      clickgrandSon,
    };
  },
});
</script>
<style scoped>
.grandSon {
  width: 200px;
  height: 100px;
  border: 1px solid green;
}
</style>


2:主要代码和详细讲解

在这里插入图片描述

3:注意点

(1)与父子组件不同,爷孙组件传递的方法使用@和:都是可以的如下图,但是为了更好的区分属性和方法,并不推荐使用:的形式来传递方法
在这里插入图片描述

注意点:(2):如下面代码所示,‘@’传递的方法在孙组件使用的时候,需要将方法名首字母大写,并且前面加上on关键字,而‘’传递的方法则不需要

// 孙组件的点击方法
function clickgrandSon() {
  ctx.attrs.onClickGrandFather(); // @传递的方法首字母大写,前面加上关键字on
  ctx.attrs.sdfsdf();  // : 传递的方法可以直接使用
  console.log("grandSon的log");
 }

2:script setup 语法糖传递属性和方法

1:代码

// 爷组件  grandFather.vue
<template>
  <div class="father">
    <h1>爷组件:{{ grandFatherMsg }}</h1>
    <Father
      :grandFatherMsg="grandFatherMsg"
      :str="'李四'"
      :num="111"
      :bol="true"
      @clickGrandFather="clickGrandFather"
      :sdfsdf="sdfsdf"
    />
  </div>
</template>
<script setup>
import { ref } from "vue";
import Father from "./father.vue";

const grandFatherMsg = ref("爷组件的值——李四");
function clickGrandFather() {
  console.log("爷组件的log");
}
function sdfsdf() {
  console.log("爷组件的log222");
}
</script>
<style scoped>
.father {
  width: 200px;
  height: 200px;
  border: 1px solid red;
}
</style>
// 父组件  father.vue
<template>
  <div class="father">
    <h1>父组件</h1>
    <grandSon v-bind="$attrs" />
  </div>
</template>
<script setup>
import grandSon from "./grandSon.vue";
</script>
<style scoped>
.father {
  width: 200px;
  height: 200px;
  border: 1px solid yellow;
}
</style>

// 孙组件  grandSon.vue
<template>
  <div class="grandSon">
    <h2>孙组件:{{ $attrs.grandFatherMsg }}</h2>
    <button @click="$attrs.onClickGrandFather()">点我触发爷组件方法1</button>
    <button @click="$attrs.sdfsdf()">点我触发爷组件方法2</button>
    <button @click="clickgrandSon">点我触发爷组件方法333</button>
  </div>
</template>
<script setup>
import { ref, useAttrs } from "vue";
const attrs = useAttrs();
// 孙组件的方法
function clickgrandSon() {
  console.log("孙组件的方法", attrs);
}
</script>
<style scoped>
.grandSon {
  width: 200px;
  height: 100px;
  border: 1px solid green;
}
</style>

2:主要代码和详细讲解

在这里插入图片描述

3:注意点

(1):在html内容中setup函数的页面可以直接使用 $attrs.xxx 来获取方法和属性,但这样你会发现不能使用属性进行操作,所以我依旧推荐第二种方法,但这种方法可以使得你直接调用爷组件的方法
(2):在script setup 中请你记住下面两行代码,它可以使你获取到爷组件传递过来的所有属性和方法

import { useAttrs } from "vue";
const attrs = useAttrs();

参考文章:详细了解Vue3 - $attrs 的几种用法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3组件之间通信(三)——爷孙组件传递属性和方法 的相关文章

随机推荐

  • ImportError: DLL load failed while importing cymj: 找不到指定的模块解决办法

    报错如下 解决办法 我的python版本是3 9 版本太高导致的 需要在import mujoco py代码前加上三行代码 如下所示 import os os add dll directory C Users luckyli mujoco
  • 1. 模型的代码生成 - 代码生成方法

    文章目录 1 模型的代码生成 代码生成方法 1 1 模型的解算器solver设置 1 2 生成的系统目标文件设置 1 3 其它生成代码的设置 1 3 1 硬件平台设置 1 3 2 Optimization页面的设置 1 3 3 Report
  • js如何获取当前时间、前几个月或后几个月时间

    获取当前的时间 格式为 YYYY MM DD function getNowTime var year nowDate getFullYear var month nowDate getMonth 1 lt 10 0 nowDate get
  • 安装scikit-learn的详细过程

    1 打开命令终端 检查Python和pip的版本 scikit learn支持的Python版本是3 6及以上 pip版本最低为9 0 1 2 升级pip版本 可选 使用命令 pip install user upgrade pip 升级p
  • MySQL substr函数使用详解

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 专栏简介 此文章已录入专栏 MySQL数据库快速入门 substr函数 一 作用 二 语法 三 使用 1 截取字符串 2 截取
  • (数据科学学习手札52)pandas中的ExcelWriter和ExcelFile

    一 简介 pandas中的ExcelFile 和ExcelWriter 是pandas中对excel表格文件进行读写相关操作非常方便快捷的类 尤其是在对含有多个sheet的excel文件进行操控时非常方便 本文就将针对这两个类的使用方法展开
  • TP框架修改后台路径方法

    直接映射 admin 后台修改路径为 myadmin888 文章来源 外星人来地球 欢迎关注 有问题一起学习欢迎留言 评论 转载于 https www cnblogs com lovebing p 11579639 html
  • 青蛙过河 蓝桥杯 2097

    问题描述 小青蛙住在一条河边 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线 小青蛙每次跳跃必须落在一块石头或者岸上 不过 每块石头有一个高度 每次小青蛙从一块石头起跳 这块石头的高度就 会下降 1
  • 自动驾驶:轨迹预测综述

    自动驾驶 轨迹预测综述 轨迹预测的定义 轨迹预测的分类 基于物理的方法 Physics based 基于机器学习的方法 Classic Machine Learning based 基于深度学习的方法 Deep Learning based
  • Java全栈面试题(三)--Redis

    对Redis的理解 Redis是一款开源的高性能键值对存储系统 支持多种数据类型 如字符串 哈希 列表 集合 有序集合等 主要用于缓存 消息队列 排行榜 计数器等场景 能够提供快速读写 高并发 持久化等功能 Redis是单线程的 通过采用多
  • java -jar后台启动的四种方式

    Linux系统启动java项目四种方法 1 用java jar xxx jar 点击回车就会启动成功 但是当退出或者关闭远程工具就会把进程关闭 以上就是启动的项目Java jar xxx jar 但是点击过Ctl c或者把此窗口关闭 就会杀
  • 【Linux】shell命令与文件权限

    目录 前言 shell命令以及运行原理 Linux权限的概念 1 文件访问者的分类 人 2 文件类型和访问权限 事物属性 3 文件权限值的表示方法 4 文件访问权限的相关设置方法 4 1 chmod指令 4 2 chown指令 4 3 ch
  • 计算机应届博士生的一点求职经验——华为篇

    一点也许有用的求职经验与感悟 前言 机考 技术面试 主管面试 HR面试 性格测试 思考与选择 前言 华为的应届生申请可以填写2个志愿 一共有五道考核 机考 必做 2轮技术面试 部门主管面试 HR 面试和性格测试 本文会对这几个方面分别展开
  • 解决neo4j导入数据时报错:neo4j already contains data, cannot do import here报错

    完整报错如下 java lang IllegalStateException neo4j already contains data cannot do import here at org neo4j internal batchimpo
  • Android Webview 部分图片显示不出来问题

    最近发现在华为Mate 10 上面我们app的内置webview会有部分图片不展示 直接就图裂了 经过绕了一大圈后才解决了问题 其实问题原因很简单 但是分析过程不顺利 拿出来分享下 希望可以帮助大家少走弯路 简单说下这个问题的背景 1 我们
  • Geoffrey Hinton、姚期智、张钹、Sam Altman等专家共话AI安全与对齐丨2023智源大会议程公开...

    6月9日 2023北京智源大会 将邀请AI领域的探索者 实践者 以及关心智能科学的每个人 共同拉开未来舞台的帷幕 你准备好了吗 与会知名嘉宾包括 图灵奖得主Yann LeCun OpenAI创始人Sam Altman 图灵奖得主Geoffr
  • stata如何看某个命令的options?即逗号后面可以加上哪些命令

    以codebook这一命令为例 在命令窗口输入 help codebook 则会出现以下内容
  • mysql text多少字节_mysql里面text能存多大的数据

    展开全部 最多可以存储65535字节来数据 源 在mysql中 文本文件bai存储从0到65 535字节 du64KB 的字节 因此 mysql中的文zhi本最多可以dao存储65 535字节 文本文件有四种类型 tinytext Text
  • 05_numpy学习笔记(下):大作业

    大作业回顾 1 导入鸢尾属植物数据集 保持文本不变 知识点 输入和输出 如何导入存在数字和文本的数据集 numpy loadtxt 2 求出鸢尾属植物萼片长度的平均值 中位数和标准差 第1列 sepallength 知识点 统计相关 如何计
  • vue3组件之间通信(三)——爷孙组件传递属性和方法

    文章目录 1 setup函数传递属性和方法 attrs 1 代码 2 主要代码和详细讲解 3 注意点 2 script setup 语法糖传递属性和方法 1 代码 2 主要代码和详细讲解 3 注意点 前言 爷孙组件使用prop一层一层传值和