【Vue3】组件元素定义的ref属性和expose,setup返回值的关系

news2024/9/29 21:13:54

1、实例代码

   首先一个测试结果:

    1、在组件模版中元素定义的ref属性,会在编译阶段生成对应的props数据,作为参数传入到创建这个ref所在元素的vnode的方法中。

2、如果ref定义在一般的元素中,那么ref就指向这个元素的dom实例,如果ref定义在子组件上,那么ref就指向这个子组件实例的一个代理属性proxy上(前提是子组件没有通过expose方法指定暴露的信息,如果指定了,就只能有些暴露的属性,其他数据没有)

3、如果在setup函数返回值中有key和这个ref的名称一样的话,那么ref引用的数据就会覆盖setup返回值原来的key对应的值。

4、ref引用的值不管怎么样都会暴露到父组件(如果子组件定义了 ref)的instance.refs属性中。可以在组件定义的methods方法中通过this.$refs获取到。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8"/>
      <style>
         .red{color:red}
      </style>
      <!--
         <script src="https://unpkg.com/vue@3.4.30/dist/vue.global.js"></script>
      -->
   <script src="./vue/vuetest.global.js"></script>
  </head>
  <body>
      <div id="app">
          
      </div>
  </body>   
   
  <script  type="module"> 
   
    const app = Vue.createApp({
         name:"root-component",
         props: {///这个定义 会赋值给组件实例instance中的propsOptions(属性的定义,数据类型,是否必填等)
            rootprops1: String,
         },
         renderTracked:function(e){
            console.log("------------renderTracked,参数e: "+e);
         },
         data:function(){
            return {
                  msg:'hello vue3'
                   }
         },
         methods: {
            dealChange:function(str){
               alert("子组件发射了chanage事件: "+str);
            },
            dealPutinfo:function(str){
               alert("子组件发射了putinfo事件: "+str);
            },
            divtestdata1:function(str){
               console.log(this.$refs.mydiv);
               console.log(this.$refs.tcinstance);
               console.log("--------------------");
               console.log(this.mydiv);
               console.log(this.tcinstance);
            }
         },
         mounted:function(){
            console.log("mount--------------",this.$refs.mydiv,this.$refs.tcinstance);
         },
         beforeCreate:function(){console.log("root-beforeCreate");},
         setup:function(props,ctx){
            ///执行setup函数时, 组件已经实例化了
             // context中有 props, attrs, slots, emit 和 expose
            通过这种方式注册的钩子函数获取不到this,为什么? vue内部创建注册这个钩子函数的时候没后指定bind()
            //通过在组件定义对象定义mounted钩子函数可以获取到this,
            Vue.onMounted((args) => {
               console.log("onMounted--------------");
            });
            //这个mydiv名称要和下面元素中定义的ref的名称一致,然后在setRef函数中就会根据这个名称 把ref值绑定到mydiv中
            //名称不一致的话,那么在setupState中就获取不到mydiv关联的dom或者实例代理对象了
            //tcinstance 也是和mydiv一样
            return {"mydiv":"","tcinstance":"",setupData:{data1:"data1",data2:"data2"}};
         },
         ///用到了template 需要引入的vue中有 编译模块, 或者在构建阶段完成编译
         //这些信息具体是在哪里解析的呢: 在执行父组件的render函数
         template:`<div >
                     <div ref="mydiv" id="root-chidren-div-id" style="color: blue;">----</div>
                     <button @click="divtestdata1" >按钮</button>
                     <test-component ref="tcinstance" v-on:chanage='dealChange' @putinfo="dealPutinfo" >
                        <template v-slot:other="slotProps"><div>我是父组件的other插槽内容测试锻炼{{msg}}--{{slotProps.url}}</div></template>
                     </test-component>
                   </div>`,
      },{rootprops1:"rootmsg1",rootprops2:"rootmsg2"});
      //
      var testComponet={
         name:"test-component",
         props: {
            testpmsg1: String,
            onPutinfo:Function
         },
         data:function(){
            return {
               cmsg:"shengbinqian",
               cdata:"zhongguoren",
               url:"http://www.baidu.com"
            }
         },
         methods: {
            testdata1:function(str){
               console.log("testdata-"+str);
               this.$emit("chanage","你好我是子组件信息chanage");
            },
            testdata2:function(str){
               this.$emit("putinfo","你好我是子组件信息putinfo");
            }
         },
         template:`<div class='border:solid 1px red'>
                     <div>我是子组件testComponent---{{cmsg}}</div> 
                     <div><slot name="other" :url="url"></slot></div>
                     <div><button @click="testdata1" >chanageEmit</button></div> 
                     <div><button @click="testdata2" >putinfoEmit</button></div> 
                  </div>`,
         setup:function(props,ctx){
            let data={tname:"qianqian"};
            //如果父组件的模版定义中,设置了子组件的ref属性,那么在父组件中就可以获取到这个子组件的实例代理对象
            //但是如果子组件要想暴露它想暴露的数据,那么就可以适用expose()方法,如果设置了这个方法,那么父组件就只能访问这些expose的数据
            //起到一个屏蔽的作用
            ctx.expose(data);
            console.log("testComponet-setup");
         }
      };
      ///会在app的上下文对象APPContext中的components中保存testComponet
      app.component("test-component",testComponet);
      app.mount('#app');
  </script>      
</html>

2、大概看下ref的实现原理

 

 

 

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

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

相关文章

6.824 Lab 2C 学习记录

2C的test中的unreliable figure8算是给博主的迎头一棒&#xff0c;需要根据raft论文的figure8进行解决&#xff0c;leader无法提交不属于currentTerm的日志&#xff0c;当确定committed到当前term时才能apply。 这一步没做到时&#xff0c;报错大概率为applied error&#xff0…

leetcode 450.删除二叉搜索树中的结点

1.题目要求: 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。一般来说&#xff0c;删除节点可分为两个步骤&#…

SpringBoot--为什么Controller是串行的?怎样才能并行?

原文网址&#xff1a;SpringBoot--为什么Controller是串行的&#xff1f;怎样才能并行&#xff1f;-CSDN博客 简介 本文介绍SpringBoot为什么Controller是串行的&#xff1f;在什么场景下才能并行执行&#xff1f; 大家都知道&#xff0c;SpringBoot的Controller按理是并行执…

STM32DMA学习日记

STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器&#xff08;DMA_ISR&#xff09;4.2 DMA中断标志清除寄存器&#xff08;DMA_IFCR&#xff09;…

3. 将GitHub上的开源项目导入(clone)到本地pycharm上——深度学习·科研实践·从0到1

目录 1. 在github上搜项目 (以OpenOcc为例&#xff09; 2. 转移到码云Gitee上 3. 下载整个项目到本地 4. 在pycharm中打开项目 1. 在github上搜项目 (以OpenOcc为例&#xff09; 把链接复制下来&#xff0c;转移到国内Gitee上&#xff0c;会更稳定 2. 转移到码云Gitee上 &…

IT基础监控范围和对象

监控易作为一款由美信时代独立自主研发的分布式一体化集中监控平台&#xff0c;其监控范围极为广泛&#xff0c;几乎涵盖了所有主流的IT基础设施以及相关的设备和系统。以下是对监控易监控范围的详细介绍&#xff1a; 一、IT基础资源监控 服务器硬件监控&#xff1a;监控易支…

【CAM350】使用总结 <二>{ 光绘Gerber 比较 }

一、 比较两份版本不同的光绘文件&#xff1a; //Analysis-Compare layers// 二、参数默认&#xff0c;比较完成给出结果 三、也可以直接在一份文件上选择“Draw on top” 四、对比差距直观可见

PageHelper - MyBatis 分页插件

如果你也在用 MyBatis&#xff0c;建议尝试该分页插件&#xff0c;这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页。 学习任何知识都推荐查看它的官方文档&#xff1a;MyBatis 分页插件 PageHelper 文档里面介绍了很多&#xff0c;我这里谈一下我的理解&…

单细胞miloR分析(基于 KNN 图的细胞差异丰度分析方法)

通常情况下&#xff0c;对两组或多组样本进行了不同处理/干预之后&#xff0c;研究者首先会进行同种细胞亚群处理前后的细胞数量的比较&#xff0c;但在单细胞分辨率时代之后&#xff0c;即使是同一个亚群中的不同细胞也应当看成不同的样本。 那么问题就来了&#xff0c;既然应…

矩阵特征值估计

特征值的相关理论 矩阵的特征值与特征向量的定义由于是代数最基本的知识&#xff0c;在此暂且不介绍了&#xff0c;不太清楚的可以查询一下低阶代数课程。 一、矩阵特征值的估计1——矩阵特征值在复平面上的分布 定义 Gerschgorin圆盘&#xff1a;设 A(aij)nn 为实方阵&…

计算机变量内存分区

内存分区 堆区、栈区、全局区、文字常量区、代码区 1.堆区&#xff1a;malloc、calloc、realloc、free操作&#xff0c;可读可写&#xff1b;2.栈区&#xff1a;局部变量、函数形参、返回值 、可读可写3.全局区&#xff1a;全部变量、静态局部变量、静态全局变量 、可读可写&…

动手学深度学习(李沐)PyTorch 第 5 章 深度学习计算

5.1 层和块 为了实现这些复杂的网络&#xff0c;我们引入了神经网络块的概念。 块&#xff08;block&#xff09;可以描述单个层、由多个层组成的组件或整个模型本身。 使用块进行抽象的一个好处是可以将一些块组合成更大的组件&#xff0c; 这一过程通常是递归的&#xff0c;…

Matlab实现鲸鱼优化算法优化回声状态网络模型 (WOA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 鲸鱼优化算法&#xff08;Whale Optimization Algorithm, WOA&#xff09;是一种基于座头鲸捕食行为的群智能优化算法。该算法通过模仿座头鲸使用螺旋形路径和包围猎物的策略来探索和开发解空间&#xff0c;以找到…

「Python入门」Pycharm的安装和运行

文章目录 Pycharm介绍文件介绍安装Pycharm打开pycharm配置python解释器运行代码新建文件 Pycharm介绍 PyCharm是由JetBrains打造的一款Python IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使…

用manim实现有想法的Pi

这幅图展示了一个关于矩阵乘法的数学公式&#xff0c;背景为深绿色&#xff0c;给人一种简洁而专业的感觉。图中间是一个矩阵乘法的表达式&#xff0c;左侧是两个 2222 矩阵&#xff0c;分别为&#xff1a; 右侧则是它们的乘积&#xff0c;结果矩阵为&#xff1a; 整个公式被一…

Windows:win11旗舰版连接无线显示器,连接失败

摘要&#xff1a;win11系统通过 miracast 无线连接到长虹电视的时候&#xff0c;一直连接不上。查看电脑又是支持 miracast 协议&#xff0c;后续发现关闭防火墙即可正常连接。 一、问题现状 最近公司里新换了电视&#xff0c;打算把笔记本电脑投屏到电视上。由于 HDMI 插拔不…

电子信息工程职称评审流程有哪些?

电子信息工程职称评审流程有哪些&#xff1f; 2024年工程类职称评审6大步骤&#xff1a; 1.确认申报条件 2.准备评审材料 3.提交评审材料 4.组织专家评审 5.进入答辩环节 6.职称公示下证 哪些人可以评电子信息工程呢&#xff1f; 从事微电子、计算机与网络、信息与通信、…

媒体发稿:怎样写下有吸引力的文案共享-华媒舍

媒体发稿推广已成为企业、机构和个人宣传策划的重要方式之一。因为市场竞争激烈&#xff0c;怎样写下有吸引力的爆款文案成为了一个重要环节。这篇科谱详细介绍文章内容将为您分享一些对于如何写下爆款文案的机密手册。 1、关键词的风采 题目是文案的店面&#xff0c;取决于读…

头戴式耳机性价比排名有哪些?五大头戴式耳机排名推荐!

现在头戴式耳机凭借其优良的音质、舒适的佩戴体验和出色的隔音效果&#xff0c;成为了众多音乐爱好者和影音娱乐用户的首选。然而&#xff0c;面对市场上众多品牌和型号&#xff0c;如何选择一款性价比高、符合个人需求的耳机&#xff0c;头戴式耳机性价比排名有哪些&#xff1…

Android OpenGLES2.0开发(三):绘制一个三角形

我们总是对陌生人太客气&#xff0c;而对亲密的人太苛刻 上一篇文章中&#xff0c;我们已经将OpenGL ES环境搭建完成。接下来我们就可以开始我们的绘图之旅了。该篇我们讲解最基本图形三角形的绘制&#xff0c;这是一切绘制的基础。在OpenGL ES的世界里一切图形都可以由三角形拼…