在发出时返回 PointerEvent 对象而不是子数据

Posted

技术标签:

【中文标题】在发出时返回 PointerEvent 对象而不是子数据【英文标题】:PointerEvent object being returned instead of child data on emit 【发布时间】:2021-11-07 03:38:50 【问题描述】:

我正在创建一个 vue 组件库。我已经构建了一个按钮组件,其中包含其宽度和左侧位置的数据。我试图在单击时将该数据发送到父级(选项卡组件)。我已经解决了很多问题,并且已经缩小了大部分问题的范围。我的子组件(按钮)正在发出正确的东西,但看起来父组件(选项卡)正在接收 click/pointerevent 对象的值,而不是在发出时传递的数据。我确定这是我的父点击句柄方法中的一些问题,但无法确定到底是什么。我已经为组件及其点击处理程序方法包含了代码 sn-ps。

这已被缩减,但本质上,我想在单击子/按钮时将子按钮的宽度(以及最终的左侧位置)发送到父选项卡。我想将发射的宽度/左侧位置分配给滑块,以便在单击选项卡中的按钮时移动一些反应性下划线。我在 click 事件上构建了一个控制台日志语句,该语句返回子级发出的值,然后返回父级接收到的值。现在,当单击按钮时,子级正在发出正确的值,但父级正在接收并尝试分配一个 PointerEvent 对象。感谢您的任何反馈!

子(按钮)模板和相关脚本:

<template>
  <div class="button @click="click" ref="button"> 
    <slot />
  </div>
</template>

<script>
import  ref  from 'vue'
  export default 
    name: 'Button',
    emits: [
      'click'
    ],
    data () 
      return 
        width: '',
        left: ''
      
    ,
    setup() 
      const button = ref(null)

      return 
        button
      
    ,
    mounted () 
      this.$nextTick(() => 
        this.left = Math.ceil(this.button.getBoundingClientRect().left)
        this.width = Math.ceil(this.button.getBoundingClientRect().width)
      )
    ,
    methods: 
      click () 
        this.$emit('click', this.width)
        console.log(`$this.width has been emitted to the tabs component`)
      
    
  
</script>

父(标签)模板和相关脚本:

<template>
  <div class="tabs" @click="updateSliderWidth">
    slot
  </div>
  <div class="slider" :style="sliderWidth">
</template>

<script>
import Button from './Button.vue'

export default 
  name: 'Tabs',
  components: 
   Button
  ,
  methods: 
    updateSliderWidth (value) 
      this.sliderWidth = value
      console.log(`$value has been received and assigned by parent`)
    
  ,
  data () 
    return 
      sliderWidth: ''
    
  

</script>

【问题讨论】:

【参考方案1】:

我看不出你的代码有任何问题,只是你没有在父组件中使用Button 组件。相反,您使用的是div。这可以解释为什么您会收到PointerEvent。如果您没有明确传递任何内容,则此事件将作为第一个参数传递给事件。

这里有一个演示:https://stackblitz.com/edit/vue-opruyd?file=src%2FApp.vue

【讨论】:

哦,它是默认值是有道理的。在使用中,我将 我不确定我是否正确理解了这个问题。我已经更新了堆栈闪电战。你不能这样吗? 是的,这就是我希望它工作的方式(正如您在 stackblitz 中所说明的那样)。但是,在我的实现中,我的 App.vue 被设置为另一个组件 包裹在我的 &lt;Tabs&gt; &lt;Button&gt; &lt;Button&gt; &lt;/Tabs&gt;

以上是关于在发出时返回 PointerEvent 对象而不是子数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将信号参数作为 int 而不是字符串发出?

为啥 pandas 在调用 pd.to_datetime() 时返回时间戳而不是 datetime 对象?

在尝试为 neo4j db 仅返回单个对象而不是 graphql 中的数组时获取 null

Swagger必需的参数在缺少时返回500,而不是404

Mailchimp API 在使用 node-fetch 而不是 json 时返回一个大的 gzip 对象

如何只返回 typeorm 关系的一个属性?