在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中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
vue+openlayers绘制省市边界线
Dec 24 Vue.js
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
vuex的使用和简易实现
Jan 07 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
vue封装数字翻牌器
Apr 20 Vue.js
Vue OpenLayer测距功能的实现
Apr 20 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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
js的onload事件及初始化按钮事件示例代码
2013/09/25 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
jQuery获取当前点击的对象元素(实现代码)
2016/05/19 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
Python中的默认参数详解
2015/06/24 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
eBay奥地利站:eBay.at
2019/07/24 全球购物
运动会广播稿50字
2014/01/26 职场文书
物理系毕业生自荐书范文
2014/02/22 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
师范毕业生求职信
2014/07/11 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
齐云山导游词
2015/02/06 职场文书
初中生物教学随笔
2015/08/15 职场文书
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js