如何在Vue的v-for新增元素时调用CalculateSubtotal函数?
解决Vue v-for新增元素时调用函数的问题
问题原因分析
原来的写法存在两个核心问题:
<tr>和<td>不是表单控件,不会触发@change事件,该事件仅针对输入类元素(如input、select)生效。th:onload是Thymeleaf的服务端渲染指令,Vue动态生成的DOM元素不会触发onload事件(该事件仅在页面初始加载时执行)。
可行解决方案
方案1:在添加元素的逻辑中直接调用(推荐)
既然你通过外部按钮向choosen_products中添加元素,直接在添加完成后针对新增元素调用函数即可,这是最直接高效的方式:
// 示例:添加新商品的逻辑 const newProduct = { /* 新商品数据 */ }; this.choosen_products.push(newProduct); // 调用函数,新增元素的索引为数组长度-1 this.CalculateSubtotal(this.choosen_products.length - 1);
方案2:监听choosen_products数组的变化
如果无法直接修改添加元素的逻辑,可以通过Vue的watch监听数组变化,触发函数:
export default { // ...其他配置 watch: { // 监听数组长度变化,仅处理新增元素 'choosen_products.length'(newLen, oldLen) { if (newLen > oldLen) { // 遍历新增的元素索引,逐个调用函数 for (let i = oldLen; i < newLen; i++) { this.CalculateSubtotal(i); } } } } }
如果需要监听数组内部元素的修改,可开启deep: true深度监听,但仅新增元素的场景下监听长度足够。
方案3:自定义指令监听DOM插入时机
通过自定义指令,在v-for渲染的<tr>插入DOM时自动调用函数:
<template> <tr v-for="p, i in choosen_products" v-call-on-insert="CalculateSubtotal(i)"> <td> {{ p.p_fullname }} </td> <td> {{ p.p_code }} </td> <td> {{ p.p_category }} </td> <td> {{ p.p_cost }} </td> <td> {{ p.p_margin }} </td> <td :ref="'add_all_sell'+i" :id="'add_all_sell'+i"> {{ p.p_sell }} </td> </tr> </template> <script> export default { directives: { callOnInsert: { inserted(el, binding) { // 元素插入DOM时执行绑定的函数 binding.value(); } } }, // ...其他配置 } </script>
内容的提问来源于stack exchange,提问作者ZION WONG
相关产品推荐
相关产品推荐

