vue 表格和表单绑定

这篇博客探讨了如何在Vue项目中实现表格与表单的双向绑定,特别是动态表单的创建。作者利用Element-Ui库创建表格和表单,并通过Vuex管理状态,确保数据同步。当点击表格行时,会弹出对应表单并预填数据。表单修改后,点击保存可即时更新表格内容。博客内容包括表格组件的配置、Dialog组件的使用,以及如何通过props传递数据以实现功能。

Demo需要是 

1.点击表格的每一行,弹出响应的表单

2.表单是动态的。(后期要做自动生成表单功能)

3.表单上填充数据对应这一行

4. 在表单修改后,点击保存能将数据实时反应在表格上。


我的思路: 因为表单后期需要做自动生成,所以这一块单独做一个template, 表格的展示数据和表单数据是双向绑定,为了后期能更好调用,分离数据出来使用了vuex的store来储存数据和各种状态

UI库 用了 Element-Ui...

表格直接使用了组件,注意的是表格上的属性是data, props,row-dblclick,弹出框我用到了组件Dialog,有嵌套表单Dialog.,表单中要注意的属性是 :model="form"  已经各个字段对应的model属性。。

第一次表格加载的适合,需要从store 里调用 数据

mounted:function(){
this.initData()
},
methods: {
initData(){
var len = this.$store.state.datas.length;
var i=0;
for(;i<len;i++){
this.tableData.push(this.$store.state.datas[i]);
}
},
}

 Dialog中定义了一个父组件,对应的表单页面中需要定义 props,方便父组件传值,当双击表格某一行时,将id传给vuex从而获取响应的某一行的信息。。

<el-dialog title="表单1" :visible.sync="dialogFormVisible">
<component :dgForm="msg" :is="isTmForm"></component>
</el-dialog>
methods: {
editorTable(row){
this.$store.commit('openForm'),
this.msg=this.$store.state.datas[row.id]
},
initData(){
var len = this.$store.state.datas.length;
var i=0;
for(;i<len;i++){
this.tableData.push(this.$store.state.datas[i]);
}
},
}

表单

<template>
<div style="border:1px solid green;">
<el-form ref="Forms" :model="dgForm" label-width="100px" :id="id">
<el-form-item label="顺序号">
<el-input-number v-model="dgForm.no" :min="1" :max="1000"></el-input-number>
</el-form-item>
<el-form-item label="归档案卷号">
<el-input v-model="dgForm.code"></el-input>
</el-form-item>
<el-form-item label="地址">
<el-input v-model="dgForm.address"></el-input>
</el-form-item>
<el-form-item label="年代号">
<el-input v-model="dgForm.year"></el-input>
</el-form-item>
<el-form-item label="保管时间">
<el-select v-model="dgForm.keepTime" :placeholder="dgForm.keepTime">
<el-option label="永久" value="永久"></el-option>
<el-option label="暂时" value="暂时"></el-option>
</el-select>
</el-form-item>
<el-form-item label="页数">
<el-input v-model="dgForm.count"></el-input>
</el-form-item>
<el-form-item label="归档开始时间">
<el-col :span="11">
<el-date-picker type="date" placeholder="选择日期" v-model="dgForm.startDay" style="width: 100%;"></el-date-picker>
</el-col>
</el-form-item>
<el-form-item label="归档结束时间">
<el-col :span="11">
<el-date-picker type="date" placeholder="选择日期" v-model="dgForm.endDay" style="width: 100%;"></el-date-picker>
</el-col>
</el-form-item>

<el-form-item>
<el-button type="primary" @click="onSubmit">立即创建</el-button>
<el-button @click="onCancel">取消</el-button>
</el-form-item>
</el-form>

</div>
</template>
<script>
export default {
props:['dgForm'],
data() {
return {
id:1
}
},
methods: {
onSubmit() {
this.$store.commit('closeForm');
},
onCancel(){
this.$store.commit('closeForm');
}
}
}
</script>



Vue 框架中,封装一个可复用的表格组件搜索表单,是提升开发效率、增强组件复用性的重要手段。通过合理的组件设计数据流管理,可以实现一个高度可配置、结构清晰的组件体系。 ### 封装可复用的表格组件 封装表格组件的核心在于提供灵活的配置项统一的接口,使得组件可以在不同场景下复用。通常,可以通过以下方式实现: 1. **定义 props**:通过定义 `props` 来接收外部传入的配置信息,例如表格列定义(`tableLabel`)、表格数据(`data`)、加载状态(`loading`)等[^2]。 2. **插槽机制**:使用 Vue 的插槽机制,允许用户自定义表格行内容或操作列,如 `expand` 插槽用于展示扩展行内容[^2]。 3. **事件绑定**:通过 `$emit` 触发自定义事件,如 `@operation` 用于处理操作列的点击事件,`@handle-selection-change` 用于处理多选变化事件。 ### 封装配套的搜索表单 搜索表单通常与表格组件配合使用,用于筛选数据。封装搜索表单时,可以通过以下方式实现: 1. **动态表单配置**:将表单字段配置化,通过 `props` 接收字段定义,如字段名称、类型、默认值等。 2. **表单验证与提交**:集成 Vue 表单验证机制,如 `v-model` `rules`,并在用户提交时触发数据请求。 3. **与表格联动**:搜索表单提交后,将筛选条件传递给表格组件,表格组件根据条件重新加载数据。 ### 示例代码 以下是一个简单的表格组件封装示例: ```vue <template> <el-table :data="data" :max-height="maxHeight" :row-class-name="rowClassName" :loading="loading" > <el-table-column v-if="showCheckBox" type="selection" /> <el-table-column v-if="showIndex" label="序号" type="index" /> <el-table-column v-for="item in tableLabel" :key="item.prop" :prop="item.prop" :label="item.label" :width="item.width" > <template slot-scope="{ row }"> <span v-if="!item.slot">{{ row[item.prop] }}</span> <slot v-else :name="item.slot" :row="row" /> </template> </el-table-column> <el-table-column label="操作"> <template slot-scope="{ row }"> <el-button @click="$emit(&#39;operation&#39;, row)">操作</el-button> </template> </el-table-column> </el-table> </template> <script> export default { props: { data: { type: Array, required: true }, tableLabel: { type: Array, required: true }, maxHeight: { type: Number, default: null }, rowClassName: { type: Function, default: () => &#39;&#39; }, loading: { type: Boolean, default: false }, showCheckBox: { type: Boolean, default: false }, showIndex: { type: Boolean, default: false } } } </script> ``` ### 数据流与状态管理 为了实现表格组件与搜索表单之间的数据联动,可以使用 Vuex 或者简单的 `props` `$emit` 进行状态管理。对于复杂的应用场景,推荐使用 Vuex 来集中管理状态,避免组件间通信的复杂性。 ### 性能优化 1. **虚拟滚动**:对于大数据量的表格,可以使用虚拟滚动技术,仅渲染可视区域内的行,提升性能。 2. **防抖筛选**:在搜索表单中,对输入框使用防抖函数,避免频繁触发筛选请求[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值