Vue3之ref取render形式组件jsx元素节点

这篇具有很好参考价值的文章主要介绍了Vue3之ref取render形式组件jsx元素节点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[2023 年 7 月 28 日 22:16:06]

ref 取 render 方式组件节点

一开始注意到组件 setup 和 render 一起使用的情况,好奇怎么通过 ref 取到 render 中 jsx 里的节点,一开始试了以下的尝试,结果是 undefined 的:

import { defineComponent, ref, onMounted } from "vue";

export default defineComponent({
  setup() {
    let chartRef = ref()

    onMounted(() => {
      console.log(chartRef.value); // undefined
    })

    return {
      chartRef
    }
  },
  render() {
    return <div ref={this.chartRef} style="{{ width: 200px, height: 100px }}"></div>
  },
});

后来经过大佬指点,改成以下形式:

import { defineComponent, ref, onMounted } from 'vue'

export default defineComponent({
  setup() {
    let chartRef = ref<HTMLDivElement | null>()

    onMounted(() => {
      console.log(chartRef.value) // Element div...
    })

    return {
      chartRef
    }
  },
  render() {
    return <div ref={el => this.chartRef = el} style="{{width: 200px, height: 100px}}"></div>
  }
})

render 这一步就很像 react 里 jsx 的写法了,react 里也有回调 ref,都是一样写法。回调函数参数el引用了 div 元素节点,通过赋值到chartRef。这种方式在 react 里是保持引用响应的,vue3 也是。

这种方式在 vue3 官方文档的函数模板引用是有注明的,这里容易漏,做下记录。

渲染函数 h 引申

在以往的 vue2 中我们会看到如下的代码:

new App({
  el: "app",
  render: (h) => h(App)
});

是不是熟悉起来了? h 到底是什么意思,h => h(App)箭头函数,如果我把无语义的h参数替换成 createElement 呢?没错,就是这个意思,它是个函数,创建虚拟 dom 的函数,该函数传的参数也是有区分的:

  • 如果是组件,App就是一个组件,参数直接传组件就好;
  • 如果是标签,第一个参数是渲染的 dom 标签,第二个是渲染该标签内的内容,createElement('h1', 'Hello World!')

所以在 vue3 中,以上面的例子改写成如下:

import { defineComponent, ref, onMounted, h } from 'vue'

export default defineComponent({
  setup() {
    let chartRef = ref<HTMLDivElement | null>()

    onMounted(() => {
      console.log(chartRef.value) // Element div...
    })

    return {
      chartRef
    }
  },
  render() {
    // return <div ref={(el) => this.chartRef = el} style="{{width: 200px, height: 100px}}"></div>
    return h('div', {style : {width: '200px', height: '100px'}, ref: el => this.chartRef = el}, 'setup&render方式h函数渲染')
  }
})

setup&return 组件写法也是类似:

import { defineComponent, ref, onMounted, h } from 'vue'

export default defineComponent({
  setup() {
    let chartRef = ref<HTMLDivElement | null>()

    onMounted(() => {
      console.log(chartRef.value) // Element div...
    })

    return() => {
      return h('div', {style : {width: '200px', height: '100px'}, ref: chartRef}, 'setup&return方式h函数渲染')
    }
  }
})

相比下就是把setup外部的render配置项拿到了 setup 里用return匿名函数代替了,而且拿到setup里可以直接绑定 ref 属性,在 setup() 内部声明的渲染函数天生能够访问在同一范围内声明的 props 和许多响应式状态这点在vue3官方文档声明渲染函数也有说明。

待更正补充...文章来源地址https://www.toymoban.com/news/detail-610340.html

到了这里,关于Vue3之ref取render形式组件jsx元素节点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 使用ref 获取 dom 元素的高度

    代码实现: 输出结果:  

    2024年02月16日
    浏览(32)
  • vue3 setup 通过ref访问dom元素

    2024年02月15日
    浏览(34)
  • vue3父组件使用ref调用子组件方法

    在vue2中,父组件通过ref调用子组件的方法只需要给子组件添加ref属性,然后使用this.$refs.XXX.method即可 但是在vue3中,子组件需先使用defineExpose将方法暴露给父组件 调用方法如下: 1、使用getCurrentInstance 2、使用ref函数创建一个响应式的引用,并将其绑定到子组件上

    2024年01月16日
    浏览(38)
  • vue3中ref获取子组件的值

    一、 script setup 通过ref获取子组件的值或方法 父组件: 子组件: 二、setup()通过ref获取子组件值 父组件: 子组件:

    2024年02月16日
    浏览(29)
  • vue3探索——使用ref与$parent实现父子组件间通信

    在vue3中,可以使用vue3的API defineExpose() 函数结合 ref 或者 $parent ,实现父子组件数据的传递。 子组件:通过 defineExpose() 函数,向外暴露响应式数据或者方法 父组件:通过 ref 获取子组件实例,进而获取子组件暴露的响应式数据或方法 💡 你没看错!这里的 ref 就是经常用来定

    2024年02月10日
    浏览(33)
  • vue3中ref获取不到组件实例&&数组中对象的属性值去重

    1、vue3中ref获取不到组件实例 原因 :使用语法糖的组件是默认关闭的,也即通过模板 ref 或者 $parent 链获取到的组件的公开实例,不会暴露任何在 script setup 中声明的绑定。 解决方法 : 为了在 语法糖组件中明确要暴露出去的属性,使用 defineExpose 编译器宏将需要暴露出去的变

    2024年02月11日
    浏览(33)
  • vue3组件多个根节点报错

    打开扩展商店搜索下载 vetur  打开设置命令面板 搜索eslint  将下面的勾选取消            

    2024年02月11日
    浏览(21)
  • vue - 动态绑定ref(使用变量)以及获取方式,解决v-for循环嵌套自定义子组件时无法this.$refs.xx找到动态组件的情况(详细示例教程)适合 vue.js nuxt.js uniapp

    正常情况,我们需要在vue中获得某个dom或者组件,我们会通过绑定 ref 然后通过绑定后的名字来获取这个dom 。 但是,如果我们在v-for中绑定ref的话,那么这个ref就会存在多个,比如我们点击事件让对应的显示/隐藏的话,我们很难找到这个对应的元素。 那么,这时我们需要动

    2024年02月13日
    浏览(39)
  • 【vue3】学习笔记--组件通信方式

    学习vue3总是绕不开vue2 vue3组件通信方式如下: props数据只读,从父组件传递到子组件,子组件内部不可直接更改 子组件需要使用defineProps方法接受父组件传递过来的数据 setup语法糖下局部组件无需注册直接可以使用 父组件 子组件 vue框架中事件分为两种:原生的DOM事件和自定

    2024年02月13日
    浏览(36)
  • Vue3组件间的通信方式

    目录  1.props父向子组件通信 2.自定义事件 子向父组件通信 3.全局事件总线 4.v-model组件通信(父子组件数据同步) 绑定单个数据同步  绑定多个数据同步  5.useAttrs组件通信  6.ref与$parent ref获取子组件实例对象  $parent获取父组件实例对象  7.provide-inject 可以实现隔辈传输 8.

    2024年02月17日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包