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 prototype属性深入介绍
Nov 27 Javascript
使用js实现雪花飘落效果
Aug 26 Javascript
修复bash漏洞的shell脚本分享
Dec 31 Javascript
js实现自动轮换选项卡
Jan 13 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
JavaScript中Object基础内部方法图
Feb 05 Javascript
vue内置指令详解
Apr 03 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
Sep 05 Javascript
关于layui时间回显问题的解决方法
Sep 24 Javascript
这15个Vue指令,让你的项目开发爽到爆
Oct 11 Javascript
Vue+Element实现网页版个人简历系统(推荐)
Dec 31 Javascript
在Webpack中用url-loader处理图片和字体的问题
Apr 28 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 读取Postgresql中的数组
2013/04/14 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
短信提示使用 特效
2007/01/19 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
JS的反射问题
2010/04/07 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
关于json字符串与实体之间的严格验证代码
2016/11/10 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
Python开发的实用计算器完整实例
2017/05/10 Python
利用Python破解斗地主残局详解
2017/06/30 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
Python遍历numpy数组的实例
2018/04/04 Python
Sanic框架请求与响应实例分析
2018/07/16 Python
python中web框架的自定义创建
2019/09/08 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
python怎么自定义捕获错误
2020/06/29 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
通过实例解析python and和or使用方法
2020/11/14 Python
python 实现性别识别
2020/11/21 Python
善意的谎言事例
2014/02/15 职场文书
大学军训感言400字
2014/03/11 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
夏洛特的网观后感
2015/06/15 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android