最近项目中遇到的需求是要操作大量的表单,之前的项目中有做过这方的研究,只不过是用jquery来操作。

项目A
先简单说说以前项目A中的应用场景,可能有小伙伴儿也遇到相同的需求。A项目是公司的OA系统中有的项目,是用java的jsp渲染的页面,需求是要改成:嵌入APP中显示,前后端分离, 后端返回的内容,还不能修改, 只是后端同事做了下接口处理,返回给前端的是一大堆的表单数据。
每个表单都有多个字段表示它的属性:
项目B
现在遇到的项目,展示类型少很多,第一个想到的就是同样的方法,不过这次使用的是Vue的双向绑定。
以下是我在python后端项目中的经验,如果没有兴趣可以直接看最后的动态表单部分
1 python 后端项目中如何引入Vue
项目B用的是python的jinjia2的模板, 同样都是 {{}} 去解析数据,这种情况下怎么办呢?
{% raw %}
<script type="text/x-template" id="dialog-wrap">
<div class="ms-dialog-wrap" v-show="visible">
<div class="ms-dialog-inner">
<div class="ms-dialog-title">{{title}}</div>
<div class="ms-dialog-body">
<div class="ms-dialog-content">
<slot></slot>
</div>
<div class="ms-dialog-actions">
<a class="ms-button" @click="cancelAction">取消</a>
<a class="ms-button ms-success" @click="confirmSuccess">确定</a>
</div>
</div>
</div>
<div class="ms-overlayer" @click="cancelAction"></div>
</div>
</script>
{% endraw %}
jinjia2中使用 raw 可以阻止解析内部的代码,这样就可以引入我们的vue模板了,这里是我写的一个dialog弹框的组件
2 定义组件
这里以dialog弹窗组件为例子,直接上代码
// dialog弹框
Vue.component('ms-dialog', {
name: 'ms-dialog',
template: '#dialog-wrap',
data: function () {
return {
}
},
props: {
title: String,
value: {
type: Boolean,
required: false
}
},
computed: {
visible: function () {
return this.value
}
},
watch: {
visible: function (newVal) {
if (newVal) {
document.addEventListener('wheel', this.disabledScroll, false)
} else {
document.removeEventListener('wheel', this.disabledScroll, false)
}
}
},
methods: {
confirmSuccess: function () {
this.$emit('confirm-success')
},
cancelAction: function () {
this.$emit('input', false)
},
disabledScroll: function (e) {
e.preventDefault()
}
},
beforeDestroy: function () {
document.removeEventListener('scroll', this.disabledScroll, false)
}
})
动态表单组件
一般的需求是:
1 如何生成动态表单
<template v-for="item in lists">
<div class="list-item" v-if="list.type === 'input'">
<label>用户名</label>
<input type="text" v-model="item.value" :value="list.defaultValue" class="form-control">
</div>
<div class="list-item" v-if="list.type === 'input'">
<label>密码</label>
<input type="text" v-model="item.value" :value="list.defaultValue" class="form-control">
</div>
<div class="list-item" v-if="list.type === 'textarea'">
<label>说明</label>
<textarea rows="3" v-model="item.value" :value="list.defaultValue" class="form-control"></textarea>
</div>
<div class="list-item" v-if="list.type === 'select'">
<label>性别</label>
<select v-model="list.value" :value="list.defaultValue">
<option v-for="sub in list.source" :value="sub.value">{{sub.label}}</option>
</select>
</div>
</template>
我们的与后端商量好的数据格式可以是这样的;
lists: [{
type: 'input',
defaultValue: 'tom',
value: 'tom'
}, {
type: 'input',
defaultValue: '123456',
value: '123456'
}, {
type: 'textarea',
defaultValue: '123456',
value: '123456'
}, {
type: 'select',
defaultValue: '0',
value: '0',
source: [{
value: '1',
label: '男'
}, {
value: '1,
label: '女'
}]
}]
这样一个动态模板就生成了,其他更多类型都可以定义。这份模板数据,一般是需要缓存的。因为接下来的 添加操作也需要这份数据。
添加操作
上面的template只是其中一个动态列表。
<div v-for="book in books"> <template v-for="item in book.lists"> ...... </template> </div> <div class="actions"> <button @click="add"></button> </div>
add的方法一般是:
methods: {
add: function () {
this.books.push({
lists: [{
type: 'input',
defaultValue: 'tom',
value: 'tom'
}, {
type: 'input',
defaultValue: '123456',
value: '123456'
}, {
type: 'textarea',
defaultValue: '123456',
value: '123456'
}, {
type: 'select',
defaultValue: '0',
value: '0',
source: [{
value: '1',
label: '男'
}, {
value: '1,
label: '女'
}]
}]
})
},
这里需要注意的是,如果这份模板的数据,你是通过在data属性中定义的字段去缓存的,那有可能遇到的是你通过添加操作之后的表单的值会,会随着其中的某个表单的值一起联动。
具体原因,猜测是这里的数据已经是变成响应式的了, 又或者你 通过实例化后的值去缓存这份模板数据,可能结果还是这样。
具体代码可能是这样的:
var vm = new Vue({
data: {
books: [],
cacheTemplate: null
},
methods: {
getForms: function (argument) {
this.$http.post(url, paras).then(res => {
// 此处缓存了这份模板数据,cacheTemplate中的数据已经变成响应式的了
this.cacheTemplate = res.body.data
this.books.push(res.body.data) // 创建第一动态表单列表
// 或者你是这是定义的的, 此时data中没有cacheTemplate这个值,
// 这样定义按理说是非响应式的,但实际情况并非如此,在项目中发现它还是会影响其他表单
vm.cacheTemplate = res.body.data
this.books.push(res.body.data) // 创建第一动态表单列表
}, res => {
})
},
add: function () {
// 此处你会发现你新创建的表单的值会影响其他表单
// log出来this.cacheTemplate你会发现里面的值已经发生了变换
this.books.push(this.cacheTemplate)
}
}
})
这里this.cacheTemplate的值为什么会发生变换,没有搞明白, 猜测原因可能是变成响应式了,vue中会实时监控跟踪,对vue原理理解好的小伙伴可以评论告诉我原因。
下面说下我的解决方法: 我不管你是不是响应式的,因为是对象,你才能监控到变换,那我把你变成字符串不就好了。
直接上代码:
var vm = new Vue({
data: {
books: [],
cacheTemplate: null
},
methods: {
getForms: function (argument) {
this.$http.post(url, paras).then(res => {
// 此处同样缓存了这份模板数据,不同的是把它变成了字符串
this.cacheTemplate = JOSN.stringify(res.body)
this.books.push(res.body) // 创建第一动态表单列表
}, res => {
})
},
add: function () {
// 此处转化成json对象,你发现this.cacheTemplate中的值是没有变换的。
var cacheTemplate = JSON.parse(this.cacheTemplate)
this.books.push(cacheTemplate)
}
}
})
这样其他表单值变换的时候都不会影响到我这份模板的数据,问题解决了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# vue
# 动态表单
# 动态添加表单
# vue表单增删改查
# vue实现表单数据的增删改功能
# 表单
# 的是
# 这份
# 后端
# 你是
# 是这样
# 你会发现
# 都是
# 小伙伴
# 这是
# 都有
# 我在
# 好了
# 告诉我
# 还可以
# 第一个
# 多个
# 中有
# 到我
# 把它
相关文章:
如何用wdcp快速搭建高效网站?
制作网站的公司有哪些,做一个公司网站要多少钱?
常州自助建站工具推荐:低成本搭建与模板选择技巧
如何在阿里云通过域名搭建网站?
如何在阿里云部署织梦网站?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
XML的“混合内容”是什么 怎么用DTD或XSD定义
seo网站制作优化,网站SEO优化步骤有哪些?
建站上市公司网站建设方案与SEO优化服务定制指南
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
如何挑选最适合建站的高性能VPS主机?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
建站之星如何优化SEO以实现高效排名?
企业微网站怎么做,公司网站和公众号有什么区别?
建站之星如何实现五合一智能建站与营销推广?
网站制作免费,什么网站能看正片电影?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
南宁网站建设制作定制,南宁网站建设可以定制吗?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
建站VPS配置与SEO优化指南:关键词排名提升策略
网站制作难吗安全吗,做一个网站需要多久时间?
定制建站哪家更专业可靠?推荐榜单揭晓
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
Python lxml的etree和ElementTree有什么区别
如何用虚拟主机快速搭建网站?详细步骤解析
如何确认建站备案号应放置的具体位置?
如何挑选优质建站一级代理提升网站排名?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
已有域名能否直接搭建网站?
如何通过西部数码建站助手快速创建专业网站?
建站与域名管理如何高效结合?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
威客平台建站流程解析:高效搭建教程与设计优化方案
如何高效搭建专业期货交易平台网站?
网站制作公司,橙子建站是合法的吗?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何撰写建站申请书?关键要点有哪些?
如何快速辨别茅台真假?关键步骤解析
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何在阿里云完成域名注册与建站?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
七夕网站制作视频,七夕大促活动怎么报名?
如何在橙子建站上传落地页?操作指南详解
建站OpenVZ教程与优化策略:配置指南与性能提升
浅谈Javascript中的Label语句
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
*请认真填写需求信息,我们会在24小时内与您取得联系。