在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+iview分页组件的封装
Nov 17 Vue.js
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
vue 页面跳转的实现方式
Jan 12 Vue.js
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 Vue.js
如何在 Vue 中使用 JSX
Feb 14 Vue.js
vue+django实现下载文件的示例
Mar 24 Vue.js
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
Vue的列表之渲染,排序,过滤详解
Feb 24 Vue.js
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
Vue组件化(ref,props, mixin,.插件)详解
May 15 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中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
Function eregi is deprecated (解决方法)
2013/06/21 PHP
php时间计算相关问题小结
2016/05/09 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
PHP递归的三种常用方式
2019/02/28 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
详解Angular2中的编程对象Observable
2016/09/17 Javascript
vue.js实现简单轮播图效果
2017/10/10 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
vue内置指令详解
2018/04/03 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
vue-cli 打包后提交到线上出现 &quot;Uncaught SyntaxError:Unexpected token&quot; 报错
2018/11/06 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Python 创建子进程模块subprocess详解
2015/04/08 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
python的concat等多种用法详解
2018/11/28 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
美国休闲服装品牌:Express
2016/09/24 全球购物
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
仓库组长岗位职责
2014/01/29 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
学历公证书范本
2014/04/09 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
Spring整合Mybatis的全过程
2021/06/28 Java/Android
python中urllib包的网络请求教程
2022/04/19 Python