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

javascript - 问一个VUE3中的useAttrs问题?

袁运良
2023-09-02

定义一个组件:

<template>    <div :title="title" class="box" :="$atts">atts</div></template><script lang="ts" setup>import { useAttrs } from "vue"const props = defineProps(['class','title']);let $atts = useAttrs();console.log($atts);</script><style lang="scss" scoped></style>

来调用这个组件的页面:

<template>    <atts class="main" @click="handler" title="222"></atts></template><script lang="ts" setup>import atts from '../components/atts.vue'const handler = ()=>{    alert('222');}</script>

运行之后点击页面中的文字atts,你会发现alert弹出了一次。按理说不是应该弹出两次才对的吗?

然后我略微的修改下组件:

<template><div :title="title">    <div  class="box" :="$atts">atts</div></div></template><script lang="ts" setup>import { useAttrs } from "vue"const props = defineProps(['class','title']);let $atts = useAttrs();console.log($atts);</script><style lang="scss" scoped></style>

这次再来点击中的文字atts,你会发现alert弹出了两次。
啥原因啊?

共有1个答案

陶胤
2023-09-02

vue3里,在父组件中给子组件绑定事件会绑在子组件的根元素上(多个根则不会)即如:
<atts class="main" @click="handler" title="222"></atts>会给atts组件的根元素绑定click事件,如果atts组件内部也绑定click,则两者互不影响,因为两个事件并不是同一个事件句柄,但是如果你用useAttrs,这个API获取的是父组件中除props外的其他属性,那么这时候atts组件获取到的onClick事件回调就和父组件中的一样都是handler这个函数引用,那么在创建DOM时由于两个事件引用一致视为一个,而在例子二中弹两次是因为父组件里的click实际上是绑在了子组件根元素上也就是相当于

<div :title="title" @click="handler">    <div  class="box" @click="handler">atts</div></div>
 类似资料:
  • 不是应该为['xiaomings',300]吗?

  • 在vue3框架中,我使用ref定义了一个变量,但是发现在更新其数据之后,页面上并不会有响应式变化,具体表现是在更新数据之后不会出现表格最前面的选择框 数据定义 数据初始化,其中list是一个数组,具有唯一的id属性 组件A中定义了计算属性rowSelection 当点击一个按钮之后,触发BatchEdit函数,通过emit抛出新的rowSelection 在父组件中进行事件定义并更新内容 rowS

  • 我想匹配一段字符串中所有的input 并使用replace进行替换,如果input里面有类似data-* 这种自定义属性的就跳过 不知道这种正则该怎么写,我也阅读了文档并使用google。都没找到 比如 <input type='text' /> 这种Input就匹配,<input data-xxx /> 带有自定义属性的input 正则则不匹配

  • 请问这种 space-between 两端对齐的,最后一行 怎样靠左和上面的一样正常显示,而不是最后一个跑到最右边去了, 网上找了很多,加伪类之类的方法都不行,请问如何去做合适?

  • 不知道为什么 这个表单提交 不按照我写的顺序去提交,他是先提醒手机号码不符合规范再提醒请输入地址 最后才提醒请输入联系人姓名 最后才是提醒请输入联系人 不知道为什么会是这样的顺序的

  • 为什么同样是对Props的类型声明,当组件缺少应有的props的时候,vue不会提示,但react会呢?请问是我哪里设置有误还是本身就是这样? Vue 父组件: 子组件: React 问题已解决。见 https://github.com/vuejs/core/issues/8524 vue3.3.4,切换vscode的volar插件为预发布版本(1.7.13)即可