当前位置: 首页 > 知识库问答 >
问题:

前端 - Vue3 tsx 中如何同时注册 ref 并传递字符串 ref 属性到子组件?

何琨
2024-06-26

Vue3组合式语法中使用tsx , 往一个子组件上注册一个 ref 引用,同时又通过展开运算符... 将一个含有值是字符串的ref属性的 props 传递给子组件,此时子组件上会有2个ref,我该如何在子组件间中得到props中的字符串ref?

代码简单演示:

const nodeRef = ref()const props = {    ref:'uuid_xxx',    //...any more}//... more codereturn <ChildComp ref="nodeRef" {...props} />

ChildComp 可能是 SFC 也可能是 tsx 组件。

这种设计不友好,但是由于某些原因,目前只能保持现状。

2个 ref ,一个是mounted后赋值为组件实例,一个是想传递到子组件内部的字符串属性。
目前已经做了尝试,无法在子组件中通过 $attrs & useAttrs() 获取到透传的字符串 ref——'uuid_xxx',但其实'uuid_xxx'值已经通过$attrs的方式挂到 ChildComp 根元素的__id__ attribute上了。

<!-- ChildComp 根元素 --><div __id__="uuid_xxx" ...more />

我希望能保持此种情况下,获取到该字符串ref属性值('uuid_xxx')。

共有3个答案

夹谷飞龙
2024-06-26

以下是在 Vue 3 的 TSX 中同时注册 ref 并传递字符串 ref 属性到子组件的示例代码:

import { defineComponent, ref } from 'vue';interface Props {  refName: string;}const ParentComponent = defineComponent({  setup(props: Props) {    const childRef = ref(null);    return () => (      <ChildComponent ref={childRef} refName={props.refName} />    );  },});const ChildComponent = defineComponent({  setup(props, { attrs }) {    console.log(attrs.refName);     // 在这里可以使用传递进来的 refName 属性    return () => <div>Child Component</div>;  },});

在上述代码中,在父组件中创建了一个 ref 对象 childRef ,并将其与子组件关联,同时将字符串属性 refName 传递给子组件。在子组件的 setup 函数中,可以通过 attrs 获取到传递进来的属性。

曹疏珂
2024-06-26

不如在子组件访问父组件的props,不要强求

刘昌翰
2024-06-26

在 Vue 3 中,当使用 ref 作为属性(prop)和 DOM 引用同时存在于同一个组件上时,确实可能会产生混淆。但是,Vue 提供了明确的方式来区分这两者:ref 用于引用组件实例或 DOM 元素,而 props 用于传递数据到子组件。

在你的场景中,你不能直接将 ref 作为 prop 传递给子组件,因为这会覆盖掉用于获取组件实例的 ref。但是,你可以使用不同的 prop 名称来传递字符串 ref。

以下是如何在 Vue 3 的 tsx 中同时注册 ref 并传递一个名为 uuid(或其他你喜欢的名称)的字符串 prop 到子组件的示例:

import { ref, defineComponent } from 'vue'import ChildComp from './ChildComp.vue' // 假设 ChildComp 是一个 Vue 组件export default defineComponent({  setup() {    const nodeRef = ref(null) // 使用 ref 来获取子组件实例    const uuid = 'uuid_xxx' // 这是一个普通的 prop 值    // ... more code    return () => (      <ChildComp ref={nodeRef} uuid={uuid} {/* ...otherProps */} />    )  }})

ChildComp 组件中,你可以通过 props 来访问这个 uuid prop:

<!-- ChildComp.vue --><template>  <div :id="uuid"> <!-- 或者使用其他属性,比如 data-uuid,取决于你的用途 -->    <!-- 组件内容 -->  </div></template><script lang="ts">import { defineComponent, PropType } from 'vue'export default defineComponent({  props: {    uuid: {      type: String,      required: true    }    // ...otherProps  },  // ...组件逻辑})</script>

注意,在模板中,我们使用 :id 绑定来将 uuid prop 设置为元素的 id 属性。但你也可以选择其他属性名,比如 data-uuid,这取决于你的具体需求。

另外,如果你想在 tsx 中直接操作 DOM 属性(例如,通过 ref 访问 DOM 元素并设置属性),你应该使用 DOM 引用而不是组件引用。但是,由于你已经有一个字符串 prop 用于标识,你可能不需要直接操作 DOM,除非有特定的理由。

 类似资料:
  • 问题内容: 我正在使用ref为组件编写测试。我想模拟ref元素并更改一些属性,但不知道如何做。有什么建议? 问题答案: 根据https://github.com/airbnb/enzyme/issues/1937中的讨论,这就是解决方案 可以使用非箭头函数对类进行猴子修补,其中“ this”关键字将传递到正确的作用域。

  • 我正在VSCode中使用OpenAPI 3编写一个API文档,扩展为OpenAPI(Swagger)Editor v4.9.1。直到今天它都运行良好-突然我的文档在所有模式声明中充满了“属性”错误。错误是:

  • 父组件动态传递ref给子组件应该怎么写? 父组件调用 子组件 这里我想把父组件传递的ccc动态给子组件,然后操作子组件?

  • 父组件用ref声明一数组 然后循环子组件并把数据传递给子组件 当父组件的数据发生变化时 希望子组件能监听到并响应 目前不知道为何没响应.请教哪里出了问题? 是不是这种业务场景最正规的是不是应该用reactive? 我试了一下 加immediate就可以了 但是我并不想第一次就触发

  • 问题内容: 是否存在通过查询字符串传递数组的标准方法? 需要明确的是,我有一个带有多个值的查询字符串,其中一个是数组值。我希望将该查询字符串值视为一个数组-我不希望该数组爆炸,以使其与其他查询字符串变量没有区别。 编辑: 根据@Alex的答案,没有标准的方法可以执行此操作,因此我的后续工作是什么才是 识别 我正在读取的参数同时是 PHP 和 Javascript 数组的简单方法? 用相同的名称命名

  • ref

    描述 (Description) 如果EXPR或$ _(如果未提供EXPR)是引用,则此函数返回true值。 返回的实际值还定义了引用引用的实体类型。 内置类型是 - REF SCALAR ARRAY HASH CODE GLOB LVALUE IO::Handle 如果变量被bless()函数祝福,那么将返回新的数据类型。 新数据类型通常是类名。 语法 (Syntax) 以下是此函数的简单语法

  • ref

    这用于创建参考值。 创建参考值时,可以选择提供验证器功能,该功能将验证创建的值。 语法 (Syntax) 以下是语法。 (ref x options) Parameters - 'x'是需要提供给参考的值。 “选项”是一组可以提供的选项,例如validate命令。 Return Value - 引用及其对应值。 例子 (Example) 以下程序显示了如何使用它的示例。 (ns clojure.

  • 问题内容: 好的,所以我想将一个非常基本的数组传递到jquery数据attrubute服务器端,如下所示: 然后像这样回撤: 为什么这似乎会警告’[‘而不是’a’(请参阅JSfiddle链接) JSFiddle链接: http : //jsfiddle.net/ktw4v/3/ 问题答案: 它将变量视为字符串,其第零个元素为。 发生这种情况是因为您的字符串不是有效的JSON,它应使用双引号而不是单