在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 element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
Vue.extend 登录注册模态框的实现
Dec 29 Vue.js
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
详解Vue.js 可拖放文本框组件的使用
Mar 03 Vue.js
vue实现拖拽交换位置
Apr 07 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 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
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
Git命令之分支详解
2021/03/02 PHP
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python中安装easy_install的方法
2018/11/18 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
Python学习笔记之变量、自定义函数用法示例
2019/05/28 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
高级护理专业大学生求职信
2013/10/24 职场文书
新郎婚宴答谢词
2014/01/19 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
毕业证明模板
2015/06/19 职场文书
学校运动会通讯稿
2015/07/18 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript