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 相关文章推荐
JavaScript 打地鼠游戏代码说明
Oct 12 Javascript
jquery中使用ajax获取远程页面信息
Nov 13 Javascript
jQuery自带的一些常用方法总结
Sep 03 Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
Nov 09 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
Feb 01 Javascript
ES6新特性之Object的变化分析
Mar 31 Javascript
angularJs select绑定的model取不到值的解决方法
Oct 08 Javascript
详解webpack loader和plugin编写
Oct 12 Javascript
详解Vue中CSS样式穿透问题
Sep 12 Javascript
Typescript3.9 常用新特性一览(推荐)
May 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
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
php读取XML的常见方法实例总结
2017/04/25 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
Js+XML 操作
2006/09/20 Javascript
用javascript实现自定义标签
2007/05/08 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
Python生成随机密码的方法
2017/06/16 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
Python整数对象实现原理详解
2019/07/01 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
python打印异常信息的两种实现方式
2019/12/24 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
信息服务专业毕业生求职信
2014/03/02 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
python中subplot大小的设置步骤
2021/06/28 Python