Vue组件跨层级获取组件操作


Posted in Javascript onJuly 27, 2020

this.$parent 访问父实例

this.$children 当前实例的直接子组件。(不保证顺序,不是响应式)

this.$parent.$parent.$refs.xxx 跨级访问父组件

this.$children.$children.$refs.xxx 跨级访问子组件

这种递归的方式 代码繁琐 性能低效

ref

只能获取当前组件上下文组件 无法跨层级

ref 是字符串 被用来给元素或子组件注册引用信息。

引用信息将会注册在父组件的 $refs 对象上。

如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;

如果用在子组件上,引用就指向组件实例

<!-- vm.$refs.p/this.$refs.p 获取DOM node -->
<p ref="p">hello</p>
<!-- vm.$refs.child/this.$refs.child 获取组件实例 -->
<child-component ref="child"></child-component>

注:

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

$refs 不是响应式的,因此你不应该试图用它在模板中做数据绑定。

这仅作为一个用于直接操作子组件的“逃生舱”——你应该避免在模板或计算属性中访问 $refs。

当 ref 和 v-for 一起使用的时候,你得到的引用将会是一个包含了对应数据源的这些子组件的数组。

如何优雅的获取跨层级实例 ?

1、npm install vue-ref || yarn add vue-ref 安装vue-ref插件

2、导入import ref from "vue-ref"

3、使用插件Vue.use(ref, { name: "ant-ref" });name是给插件起名

插件使用方法

//使用`provide` 在根组件提供数据 
provide() {
 return {
  //主动通知 将组件实例绑定在根组件上
  setChildrenRef: (name, ref) => {
   this[name] = ref;
  },
  //主动获取 获取绑定的组件
  getChildrenRef: name => {
   return this[name];
  },
  // 获取根组件
  getRef: () => {
   return this;
  }
 }
}
// 使用`inject` 在子组件中注入数据
inject: {
 setChildrenRef: {
  default: () => {}
 },
 getParentRef: {
  from: "getRef",
  default: () => {}
 },
 getParentChildrenRef: {
  from: "getChildrenRef",
  default: () => {}
 }
}

//使用指令注册子组件
<ChildrenH v-ant-ref="c => setChildrenRef('childrenH', c)" />
//使用指令注册DOM元素
<h3 v-ant-ref="c => setChildrenRef('childrenE', c)">E 结点</h3>
//获取根组件实例 
this.getParentRef()
//获取指定名称组件实例
this.getParentChildrenRef("childrenH")
//这里输出的事DOM
this.getParentChildrenRef("childrenE")

vue-ref插件源码

"use strict";

Object.defineProperty(exports, "__esModule", {
 value: true
});
exports.default = {
 install: function install(Vue) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  var directiveName = options.name || 'ref';
  console.log(arguments)
  Vue.directive(directiveName, {
   bind: function bind(el, binding, vnode) {
    //自定义指令传入值 是函数, 在这里执行 传入组件实例
    binding.value(vnode.componentInstance || el, vnode.key); //vnode.key 是使用插件时起的名称
   },
   update: function update(el, binding, vnode, oldVnode) {
    if (oldVnode.data && oldVnode.data.directives) {
     var oldBinding = oldVnode.data.directives.find(function (directive) {
      var name = directive.name;
      return name === directiveName;
     });
     if (oldBinding && oldBinding.value !== binding.value) {
      oldBinding && oldBinding.value(null, oldVnode.key);
      // 如果指令绑定的值有变化,则更新 组件实例
      binding.value(vnode.componentInstance || el, vnode.key);
      return;
     }
    }
    // Should not have this situation
    if (vnode.componentInstance !== oldVnode.componentInstance || vnode.elm !== oldVnode.elm) {
     binding.value(vnode.componentInstance || el, vnode.key);
    }
   },
   unbind: function unbind(el, binding, vnode) {
    binding.value(null, vnode.key);
   }
  });
 }
};

补充知识:vue项目中z-index不起作用(将vue实例挂在到window上面)

问题描述:由于原有项目(传统项目)中嵌入新的vue组件,dialog弹出框的z-index:999999;任然不起作用;

解决办法:将vue实例挂载到window

解决代码如下:

入口文件index.js中

import Index from './components/index.vue'
import './index.pcss'

function install (Vue) {
 Vue.component('gys-index-list', Index)
}

if (typeof window !== 'undefined' && window.Vue) {
 install(window.Vue)
}

在父组件中正确引入压缩后的css文件+js文件(这里截图的父组件是html文件)

Vue组件跨层级获取组件操作

将元素添加到body上面(解决z-index不起作用,前面内容只是铺垫)

Vue组件跨层级获取组件操作

总结描述:由于项目版本的迭代,需要将新的项目(使用的vue框架)嵌入到原有的传统的html文件项目中,控制台提示找不到vue组件。除了正确引入vue实例外,需要查看NGINX配置是否正确

以上这篇Vue组件跨层级获取组件操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS写的数字拼图小游戏代码[学习参考]
Oct 29 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
Apr 05 Javascript
使用JS读秒使用示例
Sep 21 Javascript
PHP abstract与interface之间的区别
Nov 11 Javascript
常见的原始JS选择器使用方法总结
Apr 09 Javascript
JavaScript数据类型检测代码分享
Jan 26 Javascript
基于jquery实现在线选座订座之影院篇
Aug 24 Javascript
JS表单验证的代码(常用)
Apr 08 Javascript
Canvas实现放射线动画效果
Feb 15 Javascript
Node.js服务器开启Gzip压缩教程
Aug 11 Javascript
用Webpack构建Vue项目的实践
Nov 07 Javascript
vue实现验证码输入框组件
Dec 14 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
Jul 27 #Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
Jul 27 #Javascript
JS的时间格式化和时间戳转换函数示例详解
Jul 27 #Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
Jul 27 #Javascript
vue键盘事件点击事件加native操作
Jul 27 #Javascript
Element Cascader 级联选择器的使用示例
Jul 27 #Javascript
vue 通过绑定事件获取当前行的id操作
Jul 27 #Javascript
You might like
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP+MySQL5.0中文乱码解决方法
2006/11/20 PHP
php调用c接口无错版介绍
2014/03/11 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
Vue渲染函数详解
2017/09/15 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
Python实现遍历数据库并获取key的值
2015/05/17 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Python语法分析之字符串格式化
2019/06/13 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
购买大码女装:Lane Bryant
2016/09/07 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
高中自我评价分享
2013/12/05 职场文书
领导检查欢迎词
2014/01/14 职场文书
售后客服工作职责
2014/06/16 职场文书
咖啡店创业计划书
2014/08/15 职场文书
怎样写离婚协议书
2014/09/10 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang
Python多个MP4合成视频的实现方法
2021/07/16 Python