小程序form绑定监听事件,我才知道

719 阅读4分钟

image.png

作为一个断断续续学习小程序的菜鸟
当我还在用bindChange单独监听form中各组件数据的变化再提交显示时~
别人已经学会了使用form绑定监听事件bindsubmitbindreset一次性提交表单数据了。

所以我拿我的实验过程来输出我今天学到的:如何绑定<form>监听事件,实现一次性获得表单数据!

186DE63A.jpg

一、提出问题

学校上的小程序的实验课,让我写一个问卷调查的小程序:

image.png

并且包含如下输出内容:

image.png

一开始我觉得,很简单呀~就是在<form>表单内部添加几个组件,再用bindchange监听一下每个组件的数据变化在data中更新,并点击提交按钮后在控制台输出。

<!--index.wxml-->
<view class="container">
  <form bindsubmit="onSubmit" bindreset="onReset">
    <view class="ridio">
      <view>
        1.你现在大几?
      </view>
      <radio-group  bindchange="radioChange">
        <block wx:for="{{radioItems}}" wx:key="item{{index}}">
          <radio  value="{{item.value}}"/>{{item.name}}
        </block>
      </radio-group>
    </view>
    <view class="checkBox">
      <view>2.你使用手机最大的用途是什么?</view>
      <checkbox-group  bindchange="checkBoxChange">
        <block wx:for="{{checkBoxItems}}">
          <label>
            <checkbox value="{{item.value}}"/>{{item.value}}
          </label>
        </block>
      </checkbox-group>
    </view>
    <view class="slider">
      <view>
        3.平时每天使用手机多少小时?
      </view>
      <slider min="0" max="24" show-value="true" bindchange="sliderChange"/>
    </view>
    <view class="radio">
      <view>
        4.你之前有使用过微信小程序吗?
      </view>
      <radio-group  bindchange="useChange">
        <radio value="无"/><radio value="有"/></radio-group>
    </view>
    <view class="Input">
      <view>
        5.谈谈你对微信小程序未来发展的看法
      </view>
      <input bindchange="textChange" placeholder="请输入你的看法" />
    </view>
    <view class="btn">
      <button size="mini" form-type="submit">提交</button>
      <button size="mini" form-type="reset">重置</button>
    </view>
  </form>
</view>

image.png

就像上面我写的代码一样:一开始我也是和大多数小白一样,在没有进行深入了解form组件的其他基本属性时,直接繁琐的写各种函数来获取每个组件的数据更新。

image.png

如上图所示,所有监听组件的函数是不是有点类似!!!这样写就显得代码太冗余了。
在我写完页面的函数的时候,我突然发现:
  ① 在<form>组件上的bindsubmitbindreset是干啥用的?我默认写上去属性却没有用到,我为什么要写?
  ② 组件的数据单独获取也太麻烦了, submit可以和数据变化结合在一起嘛?这样点击按钮触发submit函数后,可以一次性获得数据后再进行打印嘛?

随着这个问题的产生,我开始百度小程序文档。最后发现,原来可以一次性获得表单数据的呀!一直是我在使用繁琐的方式。

二、解决问题:使用bindsubmit获取数据

在绑定bindsubmit监听事件时,我写js函数使用了e.detail.value获取表单数据。js文件部分代码如下:

data: {
    radioCheck:'',
    checkItem:[],
    time:'',
    use:"",
    views:""
  },
  onSubmit:function(e){
    console.log(e.detail.value)
 }

我在点击提交按钮时,获取的竟然是一个空对象?!
image.png

这是为什么呢?这就是接下来我所要提到的重要一点!!!

三、组件内部添加name属性值

原来,我忽略了重要的一步。要想获取到<form>组件内的数据,我们是需要给form内部的每个组件添加name属性值!

image.png

如上图所示,我给每个需要获取数据的组件添加了name属性。
这个属性就相当于给你的组件的数据取一个名字,有了这个名字,在数据变化提交后,能够筛选出你所需要的数据。

image.png

从上面的打印结果就可以看出,当我添加了每个组件的name值后,打印结果不再是一个空对象,而是对应的name:value的形式输出数据,这就达到了我们想要一次性获取表单数据的目的。

186C2502.gif

onSubmit:function(e){
        console.log(e.detail.value)
        let{radioCheck,checkItem,time,use,views} = e.detail.value
        console.log(checkItem)
        this.setData({
          radioCheck:radioCheck,
          checkItem:checkItem,
          time:time,
          use:use,
          views:views
        })
        console.log("你选择的现在大几:" + radioCheck)
        console.log("你选择使用手机的最大用途是:" + this.data.checkItem)
        console.log("你选择的每天使用手机的时间是:" +this.data.time+"小时")
        console.log("你选择的是否使用过微信小程序:"+ this.data.use)
        console.log("你输入的对小程序发展前途的看法是" +this.data.views)
     }

上面代码中我们使用了结构语法 let{radioCheck,checkItem,time,use,views} = e.detail.value,实现了对应的数据被赋值给相应的变量中,再用wx.setData这个API更新data中的数据,最后打印结果,就完成了实验。

四、两个小tips

1、在实验中,直接使用了input作为输入内容,不能自动增高,只能一行显示。

image.png

而老师给的实验截图中,文本框是会自动增高多行显示的。我想起来我学了textarea,应该会不一样,但是也没有自动增高,后来百度才知道它可以添加一个auto-height属性,实现自动增高。

image.png

2、在实验中遇到了数组打印输出,变成了字符串!!!结果我一看是我习惯了用“+”进行打印的拼接,导致数组直接字符串化输出了。

onSubmit:function(e){
    console.log(e.detail.value)
    let{radioCheck,checkItem,time,use,views} = e.detail.value
    console.log(checkItem)
    this.setData({
      radioCheck:radioCheck,
      checkItem:checkItem,
      time:time,
      use:use,
      views:views
    })
    console.log("你选择的现在大几:" + radioCheck)
    console.log("你选择使用手机的最大用途是:" + this.data.checkItem)
    console.log("你选择的每天使用手机的时间是:" +this.data.time+"小时")
    console.log("你选择的是否使用过微信小程序:"+ this.data.use)
    console.log("你输入的对小程序发展前途的看法是" +this.data.views)
 }

image.png

后来我改成了“,”,就可以直接输出数组啦!

image.png

这就是我的一次实验分享,我在实验过程中把错误记下并寻找解决方法,不仅可以巩固我学到的知识点,还增强了我独立思考的能力。虽然我分享的观点可能很小、很简单,但是我觉得很有意义,每天提升一点点就很不错呢!

喜欢的话,就给我点个赞吧~❥(^_-)

186F59CF.jpg