在vue中通过render函数给子组件设置ref操作


Posted in Vue.js onNovember 17, 2020

正常我们的写法是,这样ref不会生效,h是作用在渲染的时候的,而ref是渲染之后才创建的,因此在h函数中使用ref是无效的。

render: (h, params) => {
       
 return h(expandRow, {
   ref:'child',
   props: {
     row: params.row
   }  
 })  
}

我们常见h函数的用法是:

render: (h) => {
  return h(ele)
}

=> 是es6的用法,相当于 (h) => {} 相当于 function(){},上面的代码可解析为:

render: function(createElement) {
  return createElement(ele);
}

Vue在创建Vue实例时,通过render作为函数来渲染Dom树,而在render方法中,又调用createElement函数来渲染子组件或元素。

因此此时元素或子组件处于渲染过程。

ref是用来给元素或子组件注册引用信息的,引用信息将会注册在父组件的$refs对象上。

因为 ref 本身是作为渲染结果被创建的,在初始渲染的时候你不能访问它们 - 它们还不存在!

解决办法

把h改为创建 this.$createElement

render: (h, params) => {
       
 return this.$createElement(expandRow, {
   ref:'child',
   props: {
     row: params.row
   }
  
 })  
}

补充知识:Vue 里怎样在 Render 中使用 $refs

背景:

使用 element-ui 组件,发现el-popover组件有一个方法: doClose();调用方法为:this.refs[name].doClose();经过测试正常使用是没问题的。现在想要在组件内的render函数中调用,一直获取不到this.refs[name].doClose();经过测试正常使用是没问题的。

现在想要在组件内的render函数中调用,一直获取不到this.refs[name].doClose();经过测试正常使用是没问题的。现在想要在组件内的render函数中调用,一直获取不到this.refs[name],报undefined

解决思路:

添加vue-DevTools工具,查看$refs属性下是否存在该元素,分析Dom元素存在的位置,进行逐层分解

打印当前render下的this,发现并没有当前元素的相关属性,so: this指向没有问题,但并非是我们的Dom元素

理解Vue.component和render所创建的组件的关系和指向问题,render相当于是在当前的父组件内创建了子组件

解决方式:this.$refs[父组件ref名].refs[子组件ref名]+方法属性

代码结构:

// 父组件TableList内的属性
<template>
 <el-card class="auto-schedu-class">
  <TableList border ref="TableList" :columns="columns(this)" />
 </el-card>
</template>
 
<script>
const columns = that => [
 {
  render: (h, parmas) => {
   return h(
    "el-popover",
    {
     ref: "popover",
     props: {
      placement: "top",
      width: "160"
     }
    },
    [
     h("p", "当前规则生效中,是否确认删除?"),
     [
      h(
       "el-button",
       {
        props: {
         type: "text",
         size: "mini"
        },
        on: {
         click: row => {
          console.log(this, "-------------");
          that.handleDeleteRow(row);
         }
        }
       },
       "取消"
      ),
      h(
       "el-button",
       {
        props: {
         type: "text",
         size: "mini"
        }
       },
       "确定"
      )
     ],
     h(
      "el-button",
      {
       props: {
        type: "text",
        size: "mini"
       },
       slot: "reference"
      },
      "删除"
     )
    ]
   );
  }
 }
];
export default {
 data() {
  return {
   columns
  };
 },
 methods: {
  handleDeleteRow(row) {
   console.log(this, "=======");
   this.$refs.TableList.$refs.popover.doClose(); // 获取到子组件内的属性方法
  }
 }
};
</script>

vue-DevTools元素层级分析总结:

在vue中通过render函数给子组件设置ref操作

在vue中通过render函数给子组件设置ref操作

作者也看了好多类似的文章,并没有找到一个合理的解决方式和解析文章

通过我们的vue工具,逐层进行元素的拆解,证明我们的refs元素是存在的,so:Dom的一种解析加载方式和层级关系就是我们的一个思路点,很多文章归结在this的指向上面,而render的创建和vue.component的关系才是我们的突破点

以上这篇在vue中通过render函数给子组件设置ref操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
在vue中import()语法不能传入变量的问题及解决
Apr 01 Vue.js
vue代码分块和懒加载非必要资源文件
Apr 11 Vue.js
vue数据字典取键值项目的字典问题
Apr 12 Vue.js
vue3语法糖内的defineProps及defineEmits
Apr 14 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 Vue.js
vue里使用create, mounted调用方法
Apr 26 Vue.js
Vue Element plus使用方法梳理
Dec 24 Vue.js
vue中音频wavesurfer.js的使用方法
Feb 20 #Vue.js
vue使用vant中的checkbox实现全选功能
Nov 17 #Vue.js
vue+vant实现购物车全选和反选功能
Nov 17 #Vue.js
vue+iview分页组件的封装
Nov 17 #Vue.js
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 #Vue.js
vue+iview实现分页及查询功能
Nov 17 #Vue.js
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 #Vue.js
You might like
很实用的一个完整email发送程序
2006/10/09 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
解决python3 pika之连接断开的问题
2018/12/18 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
python如何判断IP地址合法性
2020/04/05 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
管理站站长岗位职责
2013/11/27 职场文书
化学实验员岗位职责
2013/12/28 职场文书
25岁生日感言
2014/01/13 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
元旦活动感言
2014/03/08 职场文书
经典广告词大全
2014/03/14 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
求职自我推荐信
2014/06/25 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
商超业务员岗位职责
2015/02/13 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python
Win11 BitLocker 驱动器加密
2022/04/19 数码科技