【问题标题】:@click from vuex does not work on the vue component来自 vuex 的 @click 不适用于 vue 组件
【发布时间】:2020-02-20 10:47:57
【问题描述】:

这是我店里的。

getters: {
  getFormattedUsers (state) {
    state.users.forEach(v => {
      v.fullname = `${capitalize(v.fname)} ${capitalize(v.lname)}`
      v.created_from_now = moment(v.created_at).fromNow()
      v.approve_button = `<button @click="openApproveModal" class="btn btn-primary">Approve</button>`     
    })

    return state.users
  }
}

现在在我的组件中(挂载的属性),

async mounted () {
  await this.initializeUsers()

  $('#dataTable').DataTable({
    data: this.getFormattedUsers(),
    columns: [
      {data: 'fullname'},
      {data: 'username'},
      {data: 'is_approved'},
      {data: 'created_from_now'},
      {data: 'approve_button'}
    ]
  })
}

假设当您点击批准按钮

methods: {
  openApproveModal (id) {
    console.log('Approved!')
  }
}

但事实证明,它什么也没记录。该函数根本没有被调用。

此外,这就是我的组件表的样子:

 <table class="table table-bordered" id="dataTable">
   <thead>
     <tr>
       <th>Name</th>
       <th>Username</th>
       <th>Status</th>
       <th>Registration Date</th>
       <th width="5">Action</th>
     </tr>
   </thead>
 </table>

【问题讨论】:

  • 所以您说的是在调用 getter 时您正在单击 vuex getter 中的按钮。对吗?
  • 是的,@Yahiya

标签: javascript vue.js datatable vuex


【解决方案1】:

首先,您不应该在 getter 中修改反应状态。这可能会导致无限循环,通常是个坏主意。

这是一个危险信号:

v.approve_button = `<button @click="openApproveModal" class="btn btn-primary">Approve</button>`

我想你是用v-html 将它注入到 DOM 中?那是行不通的。 v-html 仅适用于 HTML,但您拥有的是 Vue 模板。

我不知道完整的模板是什么,所以我无法提出解决方案,但您应该不惜一切代价始终避免使用v-html(不仅出于 XSS 问题,而且通常表明您正在做某事反对“Vue方式”)。


这是您尝试做的简化演示:

// Try to create a Vue button

function handleClick() {
  alert('You will not see this')
}

const app = document.querySelector('#app')
app.innerHTML = '<button @click="handleClick">Not Working</button>'

// Do it properly

const componentInstance = new Vue({
  template: '<button @click="handleClick">Working</button>',
  methods: {
    handleClick() {
      alert('Works!')
    }
  }
})

componentInstance.$mount()
app.appendChild(componentInstance.$el)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app"></div>

【讨论】:

  • 我没有使用 v-html 先生,但是我使用的是使用 ajax 属性的数据表。该属性具有 getter getFormattedUsers() 的值
  • ` 用户名 tbody>
    名称状态 注册日期 操作
    `
  • 不管怎样,它仍然会通过innerHTML 注入到 DOM 中。您不能只将 Vue 模板注入 DOM 并期望它工作;在某些时候,需要使用new Vue() 构造元素。我不熟悉 Datatables,但是 Datatables 需要提供一些机制来呈现自定义表格单元格。您可以实例化组件,然后将组件安装到表格单元格中。
  • 好的,我知道你不使用 v-html 或其他什么,但为什么按钮不能工作?为什么渲染后不能调用组件的方法。
  • @click 语法是 Vue 功能,不是标准 HTML。 Datatables 采用 Vue 模板字符串并将其视为纯 HTML。要使其实际工作,您需要使用给定的模板字符串构造一个 Vue 组件实例。查看我的编辑。
猜你喜欢
  • 2020-12-07
  • 2019-09-20
  • 2019-12-08
  • 2017-05-26
  • 2019-03-24
  • 2017-11-08
  • 2020-07-29
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多