【发布时间】:2019-03-21 13:56:05
【问题描述】:
我有一个元素列表,呈现在服务器端。
每个项目都有一个改变其状态的按钮。
<div class="list">
<div class="list-item" data-is-published="1" data-item-id="11">
<div class="item-link">Item 1</div>
<form method="post" class="list-item-form">
<div class="vue-mount">
<input type="submit" name="changeStatus" class="button-unpublish" value="Unpublish">
<!-- some hidden fields -->
</div>
</form>
</div>
<div class="list-item" data-is-published="1" data-item-id="12">
<div class="item-link">Item 2</div>
<form method="post" class="list-item-form">
<div class="vue-mount">
<input type="submit" name="changeStatus" class="button-unpublish" value="Unpublish">
<!-- some hidden fields -->
</div>
</form>
</div>
</div>
我正在使用以下代码将每个项目替换为vue组件
var ms = document.querySelectorAll('.vue-mount')
for (var i = 0; i < ms.length; i++) {
new Vue({
render: h => h(SubscriptionButton)
}).$mount(ms[i])
}
在组件上我得到data-is-published 和data-item-id 的值并将它们设置在组件上
<template>
<input
type="submit"
@click.prevent="changeStatus()"
:value="isPublished === 1 ? 'Unpublish' : 'Publish'">
</template>
<script>
export default {
....
created: function () {
const el = this.$root.$el.parentNode.parentNode
const status = el.dataset.isPublished
this.isPublished = parseInt(status)
this.itemID = el.dataset.itemID
}
}
我这样做是为了确保即使禁用 javascript 也能正常工作,但 this.$root.$el.parentNode.parentNode 部分感觉不对。
我的做法好吗?有没有更好的方法来达到同样的效果?
编辑
我可以将数据属性放在 vue 将要挂载到的元素上,并使用 this.$root.$el.dataset 访问它们。
我不确定this.$root.$el 的使用是否符合最佳实践。
【问题讨论】:
标签: vue.js vuejs2 vue-component