关于微信小程序中的数据双向绑定如何实现

前言

官方文档:微信小程序双向绑定语法
在 WXML 中,普通的属性的绑定是单向的。例如:

<input value="{{value}}" />

如果使用 this.setData({ value: ‘leaf’ }) 来更新 value ,this.data.value 和输入框的中显示的值都会被更新为 leaf ;但如果用户修改了输入框里的值,却不会同时改变 this.data.value 。

如果需要在用户输入的同时改变 this.data.value ,需要借助简易双向绑定机制。此时,可以在对应项目之前加入 model: 前缀:

<input model:value="{{value}}" />

这样,如果输入框的值被改变了, this.data.value 也会同时改变。同时, WXML 中所有绑定了 value 的位置也会被一同更新, 数据监听器 也会被正常触发。

一、通过 input 的 bindinput 事件实现

这里建议吧 bindinput 换成 bindblur 在输入框失去光标时再去赋值。
官方解释:setData 都会触发逻辑层虚拟 DOM 树的遍历和更新,也可能会导致触发一次完整的页面渲染流程。
合理使用 setData 官方文档
WXML 代码

<view class="my-page">
  <form catchsubmit="formSubmit">
    <view class="form-item">
      <view class="form-label">昵称</view>
      <view class="form-input">
        <input type="text" value="{{ form.nickName }}" data-prop="form.nickName" bindinput="BindInput" placeholder="请输入昵称" />
      </view>
    </view>
    <view class="form-item">
      <view class="form-label">简介</view>
      <view class="form-input">
        <input type="text" value="{{ form.introduce }}" data-prop="form.introduce" bindinput="BindInput" placeholder="请输入简介" />
      </view>
    </view>
    <view class="btn-area">
      <button style="margin: 30rpx auto" type="primary" formType="submit">Submit</button>
    </view>
  </form>
</view>

TS 代码

Page({
  data: {
    form: {
      nickName: ''
    }
  },
  onLoad() { },
  onReady() { },
  formSubmit() {
    console.log(this.data.form)
  },
  BindInput(e: any) {
    this.setData({
      [`${e.currentTarget.dataset.prop}`]: e.detail.value
    })
  }
})

输出结果
在这里插入图片描述

二、通过 model:value 实现

WXML 代码

<view class="my-page">
  <form catchsubmit="formSubmit">
    <view class="form-item">
      <view class="form-label">昵称</view>
      <view class="form-input">
        <input name="nickName" type="text" model:value="{{ form.nickName }}" placeholder="请输入昵称" />
      </view>
    </view>
    <view class="form-item">
      <view class="form-label">简介</view>
      <view class="form-input">
        <input name="introduce" type="text" model:value="{{ form.introduce }}" placeholder="请输入简介" />
      </view>
    </view>
    <view class="btn-area">
      <button style="margin: 30rpx auto" type="primary" formType="submit">Submit</button>
    </view>
  </form>
</view>

TS 代码

Page({
  data: {
    form: {
      nickName: '',
      introduce: '',
    },
  },
  onLoad() { },
  onReady() { },
  formSubmit(e: any) {
    this.setData({
      form: e.detail.value
    })
    console.log(this.data.form);
  },
})

输出结果
在这里插入图片描述
WXSS 代码

.my-page {
  padding: 30rpx;
}

.form-item {
  display: flex;
  align-items: center;
  height: 80rpx;
  line-height: 80rpx;
  border-bottom: 1rpx solid #eee;
}

.form-item .form-label {
  height: 100%;
  width: 180rpx;
  text-align: center;
}

.form-item .form-input {
  width: calc(100% - 180rpx);
}

.form-item .form-input input {
  width: 100%;
  height: 80rpx;
}
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序云商城源码 带php后端 技术栈Codeigniter LeanCloud Bootstrap Admin-LTE jQuery fex-webuploader Codeigniter是一个老牌的php框架,零配置,文档极其丰富,国内的流利程度上看github的start数,让人觉得不可思议,是国外流行比较流行吧。它没有ORM,没有模板引擎,用它,只是因为够用了,LeanCloud自身就是ORM,而PHP天生就是模板语言,所以CI有没有ORM与模板引擎也无所谓。 使用LeanCloud后端云帮我省去了90%以上的后端接口,没有比小程序端用JS直接操作数据库更方便的了,所以直到小程序写完,再来写后台也完全来得及。后台只为了发布商品以及订单发货状态而已。当然Bmob也是一个不错的选择,现在也推出了小程序端sdk了。 后台界面,使用了Admin-LTE,它是基于Bootstrap的一套UI,打包了太多现成的组件,菜单目录树,表格,下拉框,颜色选择器,编辑器,日历,报表,聊天窗口,具体可以下载它的demo来看。基本一套后台能想到能使用到的,都在这里了。 在登录与修改页面,其实还用到零星的vue+element-ui,取dom的最高境界就是不用取dom,数据双向绑定确实方便实惠;还有就是bootstrap没有自带MessageBox很让人抓狂,于是就上了element-ui。说不准以后就让admin-lte与jQuery下岗了,让vue+ele全职来做吧。 最后就是2个工具,composer与bower,分别用来安装php与js库,有了这些包管理工具,安装第三方依赖库,直接敲上bower install bootstrap就达目的了,日后update还是那么的方便,再也不用搜索官网,下载解压,复制到项目等一切繁琐步骤;就跟git一样,一旦用上,就再也回不去了,严重推荐。 下载部署投入使用,无二次收费。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值