You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js动态添加发票条目时点击显隐按钮触发所有行变更问题求解

问题原因

你当前定义的addAciklama、addIndirim是根实例的全局状态,所有循环渲染的发票条目行共用这两个布尔值,任意行修改状态都会触发所有行的显隐逻辑,因此会出现点击单行所有行同时展示字段的问题。

修复方案

将两个字段的显隐状态下沉到每个发票条目对象中,由每条数据独立管理自身的显隐状态即可。

1. 修改JS逻辑

const app = new Vue({
    el: '#app',
    data: {
        // 移除全局的addAciklama、addIndirim属性
        faturasections: [
            {
                name: "",
                unit_price: 0,
                net_total: 0,
                description: '',
                discount_value: '',
                // 每个条目自带独立的显隐状态,默认关闭
                showDescription: false,
                showDiscount: false
            }
        ],
    },
    methods: {
        addNewFaturaSatiri() {
            this.faturasections.push({
                name: "",
                unit_price: 0,
                net_total: 0,
                description: '',
                discount_value: '',
                // 新增条目默认也关闭显隐状态
                showDescription: false,
                showDiscount: false
            });
        },
        removeFaturaSatiri(faturasectionIndex) {
            this.faturasections.splice(faturasectionIndex, 1);
        },
    }
});

2. 修改HTML模板的对应逻辑

把原来引用全局addAciklama、addIndirim的位置,全部替换为当前循环项fatura自身的显隐属性即可:

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.js"></script>
<div id="app">
<section>
    <div class="card-body border-bottom-light" v-for="(fatura, faturasectionIndex) in faturasections" :key="faturasectionIndex">
        <div class="row">
            <div class="col-sm-4 col-12 mb-1 mb-sm-0 hizmet">
                <div class="form-floating">
                    <input type="text" class="form-control" v-model="fatura.name" placeholder=" "/>
                    <label>HİZMET / ÜRÜN</label>
                </div>
            </div>
            <div class="col-sm-2 col-12 mb-1 mb-sm-0 brfiyati">
                <div class="form-floating">
                    <input type="number" class="form-control" v-model.number="fatura.unit_price" placeholder=" "/>
                    <label>BR.FİYAT</label>
                </div>
            </div>
            <div class="col-sm-1 col-12 mb-1 mb-sm-0 toplam">
                <div class="form-floating">
                    <input type="text" class="form-control" v-model="fatura.net_total" placeholder=" "/>
                    <label>TOPLAM</label>
                </div>
            </div>
            <div class="col-sm-1 col-12 mb-1 mb-sm-0">
                <div class="mb-1">
                    <div class="mb-1">
                        <!-- 改用当前条目自身的描述字段显隐状态 -->
                        <button v-if="!fatura.showDescription" @click="fatura.showDescription = !fatura.showDescription" class="dropdown-item">description</button>
                        <!-- 改用当前条目自身的折扣字段显隐状态 -->
                        <button v-if="!fatura.showDiscount" @click="fatura.showDiscount = !fatura.showDiscount" class="dropdown-item">discount_value</button>
                    </div>
                </div>
                <button class="btn btn-icon btn-secondary" @click="removeFaturaSatiri(faturasectionIndex)">DELETE</button>
            </div>
        </div>
        <div id="aciklamalar" class="row mt-1">
            <div class="col-12 d-flex">
                <div class="col-sm-6 fatura-aciklama">
                    <!-- 改用当前条目自身的描述字段显隐状态 -->
                    <div class="row" v-if="fatura.showDescription">
                        <div class="f-a">
                            <div class="input-group">
                                <span class="input-group-text kdv">AÇIKLAMA</span>
                                <input type="text" class="form-control" v-model="fatura.description"/>
                            </div>
                        </div>
                        <div class="f-b">
                            <button class="btn btn-icon btn-outline-secondary" @click="fatura.showDescription = !fatura.showDescription">DELETE</button>
                        </div>
                    </div>
                </div>
                <div class="col-sm-5">
                    <div class="d-flex flex-column">
                        <!-- 改用当前条目自身的折扣字段显隐状态 -->
                        <div class="row row mb-1" v-if="fatura.showDiscount">
                            <div class="i-i">
                                <div class="input-group">
                                    <span class="input-group-text kdv">İNDİRİM</span>
                                    <input type="text" class="form-control" v-model="fatura.discount_value"/>
                                </div>
                            </div>
                            <div class="i-s">
                                <button class="btn btn-icon btn-outline-secondary" @click="fatura.showDiscount = !fatura.showDiscount">DELETE</button>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <hr>
    </div>
    <div class="card-body">
        <div class="row">
            <div class="col-md-2">
                <button type="button" class="btn btn-outline-secondary btn-sm"
                        data-repeater-create @click="addNewFaturaSatiri()">
                    <span class="align-middle">NEW INVOICE</span>
                </button>
            </div>
        </div>
    </div>
</section>
</div>

内容的提问来源于stack exchange,提问作者Selaminko Elam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:00:00