javascript - 如何在 Vue 中转发 $refs
问题描述
我有一个组件应该将所有内容传递给孩子。我已经成功通过$attrs
并且$listeners
已经:
<template>
<el-form v-on="$listeners" v-bind="$attrs" :label-position="labelPosition">
<slot />
</el-form>
</template>
但是我不确定如何$refs
像我们在React中那样进行转发,以便在像这样使用我的组件时:
<el-form-responsive
class="form"
:model="formValues"
status-icon
:rules="rules"
ref="form"
label-width="auto"
@submit.native.prevent="submitForm"
>
然后this.$refs.form
实际上是对孩子的引用<el-form>
。
el-form-responsive
我宁愿透明地执行此操作,因为您传递的道具与传递给 a的道具完全相同,el-form
而无需知道refs
必须以特殊方式传递。
解决方案
我认为不可能直接模仿React 的 ref
. Vue中的ref
属性只是一个字符串,用于在渲染函数期间注册子组件对父对象的引用。$refs
所以基本上这是一种倒置的逻辑。在 Vue 中,我们不是将 ref 传递给子节点,而是将它从子节点传递给父节点。因此,此时创建孙子引用实际上是不可能的,而这正是您所需要的。
不过有一些解决方法。
1. 快速脏且不透明,但从技术上讲它会起作用:
在使用您的el-form-responsive
, on mounted
hook 的父组件中,我们可以用孙子引用替换原始子引用。
你的el-form-responsive
组件。模板:
<el-form ref="elform">
使用您的el-form-responsive
. 模板:
<el-form-responsive ref="form">
脚本:
...
mounted () {
this.$refs.form = this.$refs.form.$refs.elform
}
在这之后this.$refs.form
实际上是对孙子的引用<el-form>
2. 这个会更精细,但可能比第一种方法更好:
为了使el-form-responsive
组件真正透明,您可以将子el-form
组件的一些方法和属性公开给任何潜在的父组件。像这样的东西:
el-form-responsive
. 模板:
<el-form ref="elform">
脚本:
export default {
data: () => ({
whatever: null
}),
mounted () {
this.whatever = this.$refs.elform.whatever
},
methods: {
submit () {
this.$refs.elform.submit()
}
}
}
因此,在某些父级内部el-form-responsive
可以这样使用:
<el-form-responsive ref="form">
...
mounted () {
const formWhatever = this.$refs.form.whatever // actually `whatever` from `el-form`
this.$refs.form.submit() // eventually calls submit on `el-form`
},
推荐阅读
- angular - xmpp 消息列表器中的问题,connection.addHandler() 不调用子组件(带有 angular6 的 xmpp)
- svn - svn add * --force 不添加递归
- php - 如何在 xampp ubuntu 中启用 sqlsrv - PDO 驱动程序?
- bash - 计算毫秒级的时差
- java - 如果您在 pom.xml 文件中有错误,创建 maven 项目可能有什么问题
- angular-material - 有没有人尝试使用角度 6 将键盘固定在屏幕上?
- c# - 即使对象超出范围,Dotnet 也不会调用其终结器。那么如何释放非托管资源呢?
- angular - Spring Boot 始终从 index.html 提供服务
- docker - 网络“fabric”被声明为外部,但找不到。您需要在部署堆栈之前创建一个集群范围的网络
- base64 - RSA 签名 base64 或原始数据