⼩程序实现部分双向数据绑定(为input、picker、textarea
编写统⼀的更新。。。
wepy开发⼩程序
以input为例,⼩程序没有数据双向绑定,input要显⽰绑定的数据即value等于⼀个绑定的量
<input type="text" value="{{inputdata}}"/>
data = {
  inputdata: '数据'
}
当在input中改变内容后,inputdata并不会变化,需要绑定事件,通过编写程序来改变inputdata。
但开发过程中如果input等表单控件很多的话,这些事件⼀个⼀个写就会感到很⿇烦,所以编写⼀个程序来实现数据的绑定是⼤家都想实现的。
我实现的⽅法如下:html获取input输入的数据
<input type="text" bindinput="inputeidt" data-obj="obj" data-item="item" value="{{obj.item}}"/>
inputeidt: function (e) {
let dataset = e.currentTarget.dataset
this[dataset.obj][dataset.item] = e.detail.value
}
这样当input中输⼊内容时,数据也会发⽣改变。
这时虽然能实现数据随着视图变化,但对于数据的结构过于局限,只能是obj:{item: ‘’} 这样的,如果是这样的:
moreinfo: {
title: '详细信息',
get: 'findDetailsByUserId',
save: 'saveDetails',
item: {
name: {
name: 'name',
title: '姓名',
type: 'input',
value: '',
placeholder: '请填写',
required: true
},
sex: {
name: 'sex',
title: '性别',
type: 'picker',
value: '',
placeholder: '请选择',
required: true,
range: [
{
id: 1,
name: '男'
},
{
id: 2,
name: '⼥'
}
]
}
}
}
绑定moreinfo.item.name.value就不⾏了,
我在解决时⽤了ES6的代理(写在onLoad中)
let self = this
self.saveinfo = new Proxy({}, {
set: function (target, key, value, receiver) {
// 给saveinfo中属性赋值前,可以令程序执⾏其他功能
return Reflect.set(target, key, value, receiver)
}
})
项⽬中input是遍历出来的,遍历moreinfo.item
<input type="text"  wx:if="{{pe === 'input'}}" bindinput="inputeidt" data-obj="saveinfo" data-item="{{item.name}}" value="{{item.value}}"/>
这样就实现了。上⾯的js要写在onLoad中,如果在data中写的话,会发⽣问题,当页⾯第⼆次打开时,saveinfo便不再是代理,⽽变成了{},结果便不能正常改变数据的值。
使⽤bindinput⽽不⽤bindblur是因为点击其他元素后,input失去焦点,是会先触发点击事件,才触发失
去焦点事件。这样点击保存按钮,就会先保存,后更改数据,使得数据没有更改,所以使⽤bindinput,但使⽤bindinput可能性能不好。
使⽤bindblur的话,点击保存按钮保存数据的事件中⼀定要写⼀个延时来解决,setTimeout(() => {//上传保存逻辑}, 100)
具体⾏为可以查看我写的⼩程序:约会宝的个⼈信息填写页⾯