wepy开发小程序

以input为例,微信小程序没有数据双向绑定,input要显示绑定的数据即value等于一个绑定的量

<input type="text" value="{{inputdata}}"/>
data = {
  inputdata: '数据'
}

当在input中改变内容后,inputdata并不会变化,需要绑定事件,通过编写程序来改变inputdata。

但开发过程中如果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中属性赋值前,可以令程序执行其他功能
self.
moreinfo.item[key].value = value
    return Reflect.set(target, key, value, receiver)
}
})

项目中input是遍历出来的,遍历moreinfo.item

<input type="text"  wx:if="{{item.type === '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)

具体行为可以查看我写的小程序:约会宝的个人信息填写页面

微信小程序实现部分双向数据绑定(为input、picker、textarea编写统一的更新数据逻辑)的更多相关文章

  1. 微信小程序学习笔记二 数据绑定 + 事件绑定

    微信小程序学习笔记二 1. 小程序特点概述 没有DOM 组件化开发: 具备特定功能效果的代码集合 体积小, 单个压缩包体积不能大于2M, 否则无法上线 小程序的四个重要的文件 *js *.wxml - ...

  2. 微信小程序开发之页面数据绑定

    js:Page( { data:{ parmer:"",             //字符串参数 userinfo:{      userphone:"",   ...

  3. 微信小程序--问题汇总及详解之picker 增、删

    <block wx:for="{{salesList}}" wx:for-index="index" wx:key="id" wx:f ...

  4. 解决微信小程序开发者工具输入框焦点问题

    Windows10笔记本上运行微信小程序开发者工具,输入框(input,textarea)没有焦点,只能在真机调试,效率太低.后来发现是Window10对笔记本高分屏支持不好,要DPI缩放,导致兼容性 ...

  5. 微信小程序踩坑集合

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

  6. 微信小程序 教程及示例

    作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有,转载请联系作者获得授权.微信小程序正式公测, ...

  7. 微信小程序资料集合

    一:官方地址集合: 1:官方工具:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=1476434678461 2: ...

  8. 微信小程序源码推荐

    wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...

  9. (二)校园信息通微信小程序从后台获取首页的数据笔记

    在从后台获取数据之前,需要先搭建好本地服务器的环境. 确保Apache,MySql处于开启状态.下图为Apache,MySql处于开启时状态 然后进入后台管理平台进行字段和列表的定义 然后在后台添加数 ...

随机推荐

  1. 方程式ETERNALBLUE 之fb.py的复现

    原文链接:https://www.t00ls.net/viewthread.php?tid=39343

  2. PHP(数据类型、水仙花数(重点)运算符)

    <!--三个弹窗 alert():打开页面只是提示一下,告警框 仅仅提示,关了就关了 confirm():选择框 有返回值 prompt():输入框 控制台输出console.log() 字符串 ...

  3. inner_product

    版本1: template < class InputIterator1, class InputIterator2, class T> T inner_product(InputIter ...

  4. pytorch入门与实践-2.2

    Tensor 1--本质上可以理解为具有不同维度的数组 2--支持的基本运算 |---创建Tensor:  x=t.tensor(x,y) x,y 表示数组的大小 , x=t.rand(x,y), x ...

  5. css学习_css用户界面样式

    1.css用户界面样式 a.鼠标样式(记住几个兼容性好的) cursor:default/pointer/move/text; b.轮廓 outline outline:2px solid red: ...

  6. C和C指针小记(十四)-字符串、字符和字节

    1.字符串 C语言没有字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中. 字符串常量和适用于那些程序不会对他们进行修改的字符串. 所有其他字符串都必须存储于字符串数组或动态分配的内存 ...

  7. WebService,ESB笔记

    一.WebService是什么? WebService,是RPC的一样实现方式. RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算 ...

  8. 实现mybash

    任务内容 1.使用fork,exec,wait实现mybash 查找资料: fork函数 通过fork()系统调用我们可以创建一个和当前进程印象一样的新进程.我们通常将新进程称为子进程,而当前进程称为 ...

  9. MySQL数据库基础备份

    1.备份命令 格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 > 文件名.sql mysqldump -h -uroot -ppasswor ...

  10. javaweb(1)之tomcat使用

    安装 1.点击下载. 2.解压到一个目录. 3.进入解压后的 bin 目录,双击该文件夹下的 startup.bat 即可运行. 4.若运行成功,会有一个窗口悬停如下: 访问地址: localhost ...