在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实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
vue中activated的用法
Jan 03 Vue.js
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
vue+spring boot实现校验码功能
May 27 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 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
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
js实现放大镜特效
2017/05/18 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
python中字典(Dictionary)用法实例详解
2015/05/30 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
python实现上传下载文件功能
2020/11/19 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
python列表使用实现名字管理系统
2019/01/30 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
Python数据类型之Set集合实例详解
2019/05/07 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
旅游管理本科生求职信
2013/10/14 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
cf收人广告词
2014/03/14 职场文书
2014年新教师工作总结
2014/11/08 职场文书
交通事故被告答辩状
2015/05/22 职场文书
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL