首页 > 其他分享 >Vue3之ref取render形式组件jsx元素节点

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

时间:2023-07-28 23:13:11浏览次数:37  
标签:return render setup Vue3 ref defineComponent chartRef

[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 属性。

待更正补充...

标签:return,render,setup,Vue3,ref,defineComponent,chartRef
From: https://www.cnblogs.com/lastkiss/p/17589101.html

相关文章

  • ARC(Automatic Reference&nb…
    此文章由Tom翻译AutomaticReferenceCounting(ARC)是一个编译期的技术,利用此技术可以简化Objective-C编程在内存管理方面的工作量。这里我把此技术翻译为自动内存计数器管理技术,下图是使用和不使用此技术的Objective-C代码的区别。ARC技术是随着XCode4.2一起发布的,在缺省工程模......
  • 【C++学习之路】引用(reference)
    变量名实质上是一段连续内存空间的别名,是一个标号,程序通过变量来申请并命名内存空间。引用的本质:就是给变量名取一个别名普通变量的引用inta=10;//定义的时候,&修饰变量为引用b就是a的别名(引用)//洗头膏不会为引用开辟空间int&b=a;//引用必须初始化系统数组的引用intarr[5]......
  • vue3拖拽插件vue-draggable-next
    -基于sortablejs;npm地址:https://www.npmjs.com/package/vue-draggable-next配置项:https://github.com/SortableJS/Sortable#options import{VueDraggableNextasDraggable}from'vue-draggable-next';components:{HeaderTitle,TitlePanel,Draggable},......
  • vue3跨越
    在vue3项目中使用跨域1.服务器代理server:{port:8080,//设置服务启动端口号open:true,//设置服务启动时是否自动打开浏览器cors:true,//允许跨域//设置代理,根据我们项目实际情况配置proxy:{'/api':{//apiTest是自行设置的请求前......
  • window.location.href的用法 导出数据
    一、前言window.location.href是一个用于获取当前页面URL或让浏览器跳转到新URL的重要方法,是window.location对象的属性。它返回一个字符串,表示当前页面的URL;同时,当通过将URL指定给window.location.href时,可以让浏览器跳转到新的URL。二、常见用例self.location.hre......
  • Vue2 & Vue3生命周期对比
    Vue2生命周期图示  Vue3生命周期图示  二者对比 ......
  • vue-cli构建Vue3项目
    1、node环境检查node-v//查询Node版本 2、vue-cli版本检查vue-V//查询vue-cli版本npmuninstall-gvue-cli//卸载旧版vue-clinpminstall-gvue-cli//旧版vue-cli2npminstall-g@vue-cli//vue-cli3  其他命令:vue-V//查询vue-cli脚手架版本np......
  • Arm Neoverse N2 reference design Technical Overview
    RDN2Intro本文档是ARM提供给SoC设计人员的一份概述设计文档,较为详细的描述了SoC的方方面面,具有很好的参考意义。SoC的系统架构,硬件互联SoC各block的功能描述、细节描述软件栈概述RDN2的其他参考文档DocumentNameDocumentIDLicenseeonlyAMBA4AXI-StreamPr......
  • Vue3多条数据复制功能,复制内容用逗号拼接
    <divclass="person-list"><divclass="person-item">9939939939399399</div><divclass="person-item">1111111111111111</div></div>&......
  • Vue3的响应式数据处理方式
    问题:data[0].tableId是undefined,但控制台可以打印出data[0]的值原因: Vue3的响应式数据处理方式导致的。Vue3使用了Proxy来实现响应式数据。当你访问一个响应式对象的属性时,Vue会在底层进行拦截,并返回响应式的值。这意味着,当你访问`data[0].TableId`时,Vue会返回......