【问题标题】:VueJS jQuery: computed value of parent data attribute undefinedVueJS jQuery:父数据属性的计算值未定义
【发布时间】:2020-06-20 19:57:06
【问题描述】:

当用户单击<td> 时,我正在尝试从父级<tr> 中提取data-reportid 属性。

HTML

<tr :data-reportid="modifiedRows[index]['id']" v-for="(row,index) in modifiedRows" :key="index">
  <td v-html="value" v-for="(value, ind) in row" @click="modalRequest(index, ind, value, rowReportID)" :key="ind">
    {{ row[ind] }}    <---- i know i can just use 'value', i was experimenting.
  </td>
</tr>

VueJS - 计算

rowReportID() {
  return $(this).parent().data('reportid');
},

当用户单击时,控制台会报告“未定义”作为结果。 DOM 正确呈现了 data-reportid 属性并且它包含正确的值,所以这不是一个因素。

我在这里缺少什么?请耐心等待。主要是 PHP 背景。

【问题讨论】:

  • 你们能提供复制吗?
  • 要添加什么?而已。 modal request() 只是 console.log() 的参数。将一个数字或字符串放入data-reportid 并继续。

标签: jquery vue.js vuejs2 custom-data-attribute


【解决方案1】:

每个 Vue 实例的计算属性只能有一个缓存值。在这种情况下,您似乎试图根据当前元素计算一个值。计算属性没有该上下文。

一般来说,计算属性不应该尝试访问 DOM。 DOM 不是反应式的,不会触发属性更新。此外,在第一次评估属性时,DOM 可能不存在。

我相信在这种情况下,具体问题是 this 将是 Vue 实例,而不是 DOM 元素,因此 $(this) 不会匹配任何内容。您可以尝试在rowReportID 中添加一些控制台日志来确认。

您可以使用方法来代替使用计算属性。要访问 DOM 节点,您需要从本机浏览器事件对象中获取它,Vue 将其公开为 $event

@click="modalRequest(index, ind, value, rowReportID($event))"

与:

methods: {
  rowReportID(event) {
    return $(event.target).parent().data('reportid');
  }
}

这里实际上不需要使用 jQuery,您可以使用本机 DOM API 轻松做到这一点。使用 Vue 时一般不需要 jQuery。

此外,除非有充分的理由从 DOM 中获取此属性,否则您应该完全避免该阶段。相反,您可以这样做:

@click="modalRequest(index, ind, value, modifiedRows[index].id)"

【讨论】:

  • 好的。我明白!惊人的!顺便说一句,event.targetEL 应该只是 event.target。至于最后一个......让我把头绕过去,然后回复你......或根据需要编辑它。一样。 :)
  • 是的。有点想通了。我发现如果我的表格顺序通过排序或过滤器更改而后者没有这个问题,那么它确实不能按预期工作。仍然不确定为什么,但在这一点上,我会赢得胜利,稍后再考虑。谢谢你这么清楚。 :)
  • @WhiteRau 不确定我在哪里梦到了targetEl,但我已经更新了对不那么虚构的target 的回答。至于最后一部分,当您对像这样的侦听器使用内联代码时,Vue 会将其包装在一个函数中,该函数的作用域是模板执行时的那个点。结果是任何局部模板变量都被函数的闭包捕获。这通常避免了将数据存储在属性中的任何需要。很少使用属性来让所有元素共享一个函数很有用,但通常不值得付出额外的努力。
  • 好的。我明白。而且,是的,虽然我可以看到您 WOULD 共享一个通用功能的场景,但事实并非如此。再次感谢您抽出宝贵的时间。非常感谢! :)
猜你喜欢
  • 2016-02-04
  • 2018-07-19
  • 2018-02-14
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多