vue双向绑定一般是用在向数据库写数据,或修改数据的时候,使用vue的数据双向绑定可以大大简化前端代码量,让页面看起来更加简洁,更容易维护。下面就用实际开发中的一个实例来讲解一下vue的双向绑定:
实例是新增一个保险方案,其中包含一个客户信息和多个被保险人信息,被保险人信息要实现动态的 增 、删、 改,这样看来使用vue的动态双向绑定是最合适不过的了。
其中html代码如下:
<div class="formwrapper" style="padding-top: 0">
<p class="midtitle">方案信息</p>
<div class="formbox nomarginbot">
<dl>
<dt>方案名称</dt>
<dd><input type="text" placeholder="方案名称" v-model="proname" id="ProgramName"></dd>
</dl>
</div>
<p class="midtitle">客户信息</p>
<div class="formbox nomarginbot">
<dl>
<dt>客户称呼</dt>
<dd><input type="text" placeholder="请输入客户称呼" v-model="customername" id="Name"></dd>
</dl>
<dl>
<dt>出生日期</dt>
<dd><input type="date" placeholder="请选择出生日期" v-model="customerbirthday" id="Birthday"></dd>
</dl>
<dl>
<dt>性别</dt>
<dd>
<select name="Sex" id="Sex" v-model="customersex" class="{c999: customersex==-1}">
<option value="-1" disabled style="display: none;">请选择性别</option>
<option value="0">男</option>
<option value="1">女</option>
</select>
</dd>
</dl>
</div>
<p class="midtitle">被保险人信息</p>
<div class="insuredinfo" v-for="(item,index) in insuredinfo">
<div class="formbox nomarginbot">
<dl v-if="item.relationship != 7">
<dt>是客户的</dt>
<dd>
<select name="relationship" id="relationship" value="-1" v-model="item.relationship" class="{c999: item.relationship==-1}">
<option value="-1" disabled style="display: none;">请选择与客户关系</option>
<option value="0">自己</option>
<option value="1">丈夫</option>
<option value="2">妻子</option>
<option value="3">父亲</option>
<option value="4">母亲</option>
<option value="5">儿子</option>
<option value="6">女儿</option>
<option value="7">自定义称呼</option>
</select>
</dd>
</dl>
<dl v-if="item.relationship == 7">
<dt>被保险人称呼</dt>
<dd><input type="text" placeholder="请输入被保险人称呼" v-model="item.name" id="InsuredName"></dd>
</dl>
<dl v-if="item.relationship != -1 && item.relationship != 0">
<dt>出生日期</dt>
<dd><input type="date" placeholder="请选择出生日期" v-model="item.birthday" id="InsuredBirth"></dd>
</dl>
<dl v-if="item.relationship == 7">
<dt>性别</dt>
<dd>
<select name="InsuredSex" id="InsuredSex" v-model="item.sex" class="{c999: item.sex==-1}">
<option value="-1" disabled style="display: none;">请选择性别</option>
<option value="0">男</option>
<option value="1">女</option>
</select>
</dd>
</dl>
</div>
<p v-if="index != 0" class="deleteinsbtn" v-on:click="deleteinsured(index)"><span>删除被保险人</span></p>
</div>
<div class="addinsured" v-on:click="addinsured">
<i class="iconfont icon-tianjiabeibaoxianren"></i>新增被保险人
</div>
</div>
<div class="blockbtnwrap">
<a href="javascript:;" onclick="addProgram()" class="btn btn-block btn-org">确定</a>
</div>
js代码如下:
<script type="text/javascript">
var fadata = new Vue({
el: "#fainfo",
data: {
proname: '',
customername: '',
customerbirthday: '',
customersex: '-1',
insuredinfo: [{
relationship: -1,
birthday: '',
name: '',
sex: -1,
}]
},
methods: {
deleteinsured: function (index) {
this.insuredinfo.splice(index, 1);
},
addinsured: function () {
var obj = {
relationship: -1,
birthday: '',
name: '',
sex: -1
};
this.insuredinfo.push(obj);
}
}
})
function addProgram() {
var ProgramName = $('#ProgramName').val().trim();
if (ProgramName == "") {
layer.msg("方案名称不能为空");
return;
}
var Name = $('#Name').val().trim();
if (Name == "") {
layer.msg("客户称呼不能为空");
return;
}
var Birthday = $('#Birthday').val().trim();
if (Birthday == "") {
layer.msg("请选择出生日期");
return;
}
var Sex = $('#Sex').val();
if (Sex == null || Sex == "-1") {
layer.msg("请选择性别");
return;
}
$('.insuredinfo').each(function (i) {
var that = this;
var relationship = $(that).find('#relationship').val();
var InsuredName = $(that).find('#InsuredName').val();
var InsuredBirth = $(that).find('#InsuredBirth').val();
var InsuredSex = $(that).find('#InsuredSex').val();
if (relationship === null || relationship == "-1") {
layer.msg("请选择客户关系");
return;
} else if (relationship == "7" || relationship == undefined) {
if (InsuredName == "") {
layer.msg("请输入被保险人称呼");
return;
}
if (InsuredBirth == "") {
layer.msg("请选择被保人出生日期");
return;
}
if (InsuredSex == null || InsuredSex == "-1") {
layer.msg("请选择被保人性别");
return;
}
} else if (relationship != "0") {
if (InsuredBirth == "") {
layer.msg("请选择被保人出生日期");
return;
}
}
})
var insuredinfo = JSON.stringify(fadata.insuredinfo)
$.ajax({
url: '/HKBProgram/AddProgramList',
beforeSend: function () {
var index = layer.load(1, {
shade: [0.1, '#000'] //0.1透明度的白色背景
});
},
data: {
ProgramName: ProgramName,
Name: Name,
Birthday: Birthday,
Sex: parseInt(Sex),
InsuredInfo: fadata.insuredinfo,
},
cache: false,
type: 'Post',
dataType: 'json',
success: function (response) {
layer.closeAll();
if (response == "1") {
layer.msg('添加成功!');
} else {
layer.msg('添加失败!');
}
},
error: function () {
layer.closeAll();
layer.msg('系统异常');
}
});
}
</script>
代码很简单,vue初始化,默认数据data,新增被保险人的时候只需要向insuredinfo数组新增一个对象:
var obj = {
relationship: -1,
birthday: '',
name: '',
sex: -1
};
this.insuredinfo.push(obj);
删除一个被保险人信息只需要删除insuredinfo数组的当前的对象:
deleteinsured: function (index) {
this.insuredinfo.splice(index, 1);
},
html代码会自动更新。
当信息输入完成点击确认存入数据库的时候,只需要获取vue里面的data数据就可以了,因为是双向绑定,data里面的数据就是input输入框对应的值,这样一来就免去单独获取每个input输入框的值。
我们也可以在浏览器下查看是否是双向绑定:
可以看到,当只有一个被保险人信息的时候insuredinfo数组也只对应当前一个对象
当新增一个被保险人信息以后,insuredinfo数组也对应新增了一个对象
同样,删除一个被保险人信息,insuredinfo数组也会同事删除当前对象