微信小程序封装bindinput & 输入框出现清空图标 & wx:key对input的影响

Q:我以前写小程序每次获取输入内容,都要写一个方法,觉得十分麻烦,所以写了一个通用的方法。

A:我能想到的原理就是,不同的input所带的data不同,bindinput事件setData不同的data。

<input class="weui-input" data-inputName=‘name‘  placeholder="你的姓名" bindinput="bindKeyInput" value=‘{{item}}‘ bindfocus="bindKeyFocus" data-index="0" bindblur="bindKeyBlur"/>
  // 获取输入框的内容,封装起来,根据data-的值去渲染不同的data
  bindKeyInput: function (e) {
    let inputName = e.currentTarget.dataset.inputname;
    let fullInputName = `local.${inputName}`;

    this.setData({
       [fullInputName]: e.detail.value
    })
  }

Q:最近项目有一个需求,就是点击输入框时右边显示清空图标。

A:我的思路是:好好利用bindfocus和bindblur,聚焦函数和非聚焦函数。聚焦时显示清空图标,非聚焦时隐藏清空图标。

  // 清空输入框的内容
  // 聚焦函数:如果字符串长度为0,则不显示清空图标,否则显示清空图标。
  bindKeyFocus: function (e) {
    let index = e.currentTarget.dataset.index;
    let fullInputName = `local.is_clear_icon[${index}]`;
    let inputLength = e.detail.value.length;
    inputLength == 0 ? this.setData({ [fullInputName]: true }) : this.setData({ [fullInputName]: false })
  },
  // 非聚焦函数:隐藏清空图标
  bindKeyBlur: function (e) {
    let index = e.currentTarget.dataset.index;
    let inputName = e.currentTarget.dataset.inputname;
    let fullInputName = `local.is_clear_icon[${index}]`;
    let fullInputName2 = `local.${inputName}[0]`;
    let value = e.detail.value;
    if (this.data.local.test) {
      value = [""];
      this.setData({ "local.test": false });
      }
    this.setData({ [fullInputName]: true, [fullInputName2]: value });
  },
  // 点击图标清空
  clearInput: function (e) {
    let inputName = e.currentTarget.dataset.inputname;
    let fullInputName = `local.${inputName}`;
    console.log(e.currentTarget.dataset.inputname, fullInputName)
    let index = e.currentTarget.dataset.index;
    let clearIcon = `local.focus[${index}]`;

    this.setData({ [fullInputName]: [""], [clearIcon]: false, "local.test": true })
  },
//名字输入<block wx:for="{{name}}" wx:key="idx" wx:for-index="idx">
    <view class="weui-cell weui-cell_input">
        <view class="weui-cell__hd wh-card-list-item">
            <view class="weui-label wh-required" wx:if="{{idx == 0}}">姓名</view>
          </view>
          <view class="weui-cell__bd clear-input-father weui-flex" wx:if="{{idx == 0}}">
              <input class="weui-input" data-inputName=‘name‘  placeholder="你的姓名" bindinput="bindKeyInput" value=‘{{item}}‘ bindfocus="bindKeyFocus" data-index="0" bindblur="bindKeyBlur"/>
               <icon class=‘clear-input‘ type="clear" size="20" hidden=‘{{is_clear_icon[0]}}‘ data-inputName=‘name‘ data-index="0" catchtap=‘clearInput‘/>
            </view>
            <view class="weui-cell__bd clear-input-father weui-flex wh-white-space" wx:else>
               <view class=‘wh-white-space‘ data-index=‘{{idx}}‘ data-inputName=‘name‘ catchtap=‘chooseItem‘>{{item}}</view>
               <icon class=‘clear-input‘ type="clear" size="20" data-index=‘{{idx}}‘ data-inputName=‘name‘ catchtap=‘deteleItem‘/>
            </view>
      </view>
    </block>

//手机号输入
  <block wx:for="{{telephone}}" wx:key="*this" wx:for-index="idx">
    <view class="weui-cell weui-cell_input">
        <view class="weui-cell__hd wh-card-list-item">
            <view class="weui-label wh-required" wx:if="{{idx == 0}}">手机号</view>
          </view>
          <view class="weui-cell__bd clear-input-father weui-flex" wx:if="{{idx == 0}}">
              <input class="weui-input" type=‘number‘ placeholder="你的手机号" bindinput="bindKeyInput" data-inputName=‘telephone‘ value=‘{{item}}‘ bindfocus="bindKeyFocus" data-index="1" bindblur="bindKeyBlur" />
               <icon class=‘clear-input‘ type="clear" size="20" hidden=‘{{is_clear_icon[1]}}‘ data-inputName=‘telephone‘ data-index="1" catchtap=‘clearInput‘/>
            </view>
            <view class="weui-cell__bd clear-input-father weui-flex wh-white-space" wx:else>
               <view class=‘wh-white-space‘ data-index=‘{{idx}}‘ data-inputName=‘telephone‘ catchtap=‘chooseItem‘>{{item}}</view>
               <icon class=‘clear-input‘ type="clear" size="20" data-index=‘{{idx}}‘ data-inputName=‘telephone‘ catchtap=‘deteleItem‘/>
            </view>
      </view>
  </block>

Q:使用wx:for=“{{name}}”去渲染input输入框,而input输入框又修改了name的内容,这样会出现一种情况:用户一输入之后,input便失去聚焦。

A:个人观点:bindinput动态改变name的值,会重新渲染整个html代码。wx:key值设置值不对,改为wx:key="index"即可。

  <block wx:for="{{name}}" wx:key="idx" wx:for-index="idx">
    <view class="weui-cell weui-cell_input">
        <view class="weui-cell__hd wh-card-list-item">
            <view class="weui-label wh-required" wx:if="{{idx == 0}}">姓名</view>
          </view>
          <view class="weui-cell__bd clear-input-father weui-flex" wx:if="{{idx == 0}}">
              <input class="weui-input" data-inputName=‘name‘  placeholder="你的姓名" bindinput="bindKeyInput" value=‘{{item}}‘ bindfocus="bindKeyFocus" data-index="0" bindblur="bindKeyBlur"/>
               <icon class=‘clear-input‘ type="clear" size="20" hidden=‘{{is_clear_icon[0]}}‘ data-inputName=‘name‘ data-index="0" catchtap=‘clearInput‘/>
            </view>
            <view class="weui-cell__bd clear-input-father weui-flex wh-white-space" wx:else>
               <view class=‘wh-white-space‘ data-index=‘{{idx}}‘ data-inputName=‘name‘ catchtap=‘chooseItem‘>{{item}}</view>
               <icon class=‘clear-input‘ type="clear" size="20" data-index=‘{{idx}}‘ data-inputName=‘name‘ catchtap=‘deteleItem‘/>
            </view>
      </view>
    </block>

下面这种就会失去聚焦:

  <block wx:for="{{telephone}}" wx:key="*this" wx:for-index="idx">
    <view class="weui-cell weui-cell_input">
        <view class="weui-cell__hd wh-card-list-item">
            <view class="weui-label wh-required" wx:if="{{idx == 0}}">手机号</view>
          </view>
          <view class="weui-cell__bd clear-input-father weui-flex" wx:if="{{idx == 0}}">
              <input class="weui-input" type=‘number‘ placeholder="你的手机号" bindinput="bindKeyInput" data-inputName=‘telephone‘ value=‘{{item}}‘ bindfocus="bindKeyFocus" data-index="1" bindblur="bindKeyBlur" />
               <icon class=‘clear-input‘ type="clear" size="20" hidden=‘{{is_clear_icon[1]}}‘ data-inputName=‘telephone‘ data-index="1" catchtap=‘clearInput‘/>
            </view>
            <view class="weui-cell__bd clear-input-father weui-flex wh-white-space" wx:else>
               <view class=‘wh-white-space‘ data-index=‘{{idx}}‘ data-inputName=‘telephone‘ catchtap=‘chooseItem‘>{{item}}</view>
               <icon class=‘clear-input‘ type="clear" size="20" data-index=‘{{idx}}‘ data-inputName=‘telephone‘ catchtap=‘deteleItem‘/>
            </view>
      </view>
  </block>

这里主要是wx:key的应用:源于http://www.wxappclub.com/topic/536

wx:key 的值以两种形式提供

  1. 字符串,代表在 for 循环的 array 中 item 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变。
  2. 保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字,如:当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

1:有wx:key的情况(不重新创建,仅改变顺序)

添加元素或改变元素顺序导致数据改变时,
会校正带有Key的组件(可通过key识别各组件),
框架会根据“目前数据”,重新排序各组件,而不是重新创建,
使组件保持自身的状态,列表渲染效率高。

2:无wx:key的情况(重新创建)

添加元素或改变元素顺序导致数据改变时,
此时各组件没有key(无法识别各组件)
框架会被迫根据“目前数据”重新创建各组件,
使组件重置初始状态(原有状态自然被清空),列表渲染效率低。

B:两种情况的对比

wk:key 组件识别 渲染情况 状态情况 for效率
各组件可识别 渲染时仅改变组件顺序 保持组件之前原来状态 效率高
组件无法识别 渲染时重新创建各组件 重置组件的初始状态 效率低

原文地址:https://www.cnblogs.com/weihuan/p/8359326.html

时间: 2024-11-06 11:11:35

微信小程序封装bindinput & 输入框出现清空图标 & wx:key对input的影响的相关文章

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

Windows10笔记本上运行微信小程序开发者工具,输入框(input,textarea)没有焦点,只能在真机调试,效率太低.后来发现是Window10对笔记本高分屏支持不好,要DPI缩放,导致兼容性问题.解决方法: 显示设置.缩放与布局改为100%.这样就可以点击输入框了,但是字体变得很小,最好是外接显示器. 不修改DPI缩放,长按输入框即可! 原文地址:https://www.cnblogs.com/ycwu314/p/11258489.html

微信小程序setData的使用,通过[...]进行动态key赋值

首先先介绍一下微信小程序Page.prototype.setData(Object data, Function callback)的讲解: setData函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的this.data的值(同步) 微信小程序官网文档只对字符串,数字,数组和对象类型的数据通过对setData进行了修改,却没有对动态数据进行讲解,在这里我就针对静态数据以及动态数据的修改进行讲解. 这里关键是动态数据修改,通过使用[...]: "..."进行动态数据赋值,如下

微信小程序封装请求的js

1.配置访问服务器的地址config.js: const config = {//192.18.1.2:8083 https://www.so.com/ api_base_url: 'http://192.168.1.12:8083', // api_base_url:"https://www.baidu.com", img_base_url: '' } export { config } 2.封装http请求http.js: import { config } from './con

微信小程序封装自定义弹窗

最近在做小程序的登录,需要同时获取用户手机号和头像昵称等信息,但是小程序又不支持单个接口同时获取两种数据,因此想到自定义一个弹窗,通过弹窗按钮触发获取手机号事件.记录一下. 具体代码如下: 业务代码中: 在业务代码中引入dialog组件即可 <dialog visible="{{dialogVisible}}" showFooter="{{footerVisible}}" title="测试一下"> <view class='d

微信小程序之一:动态添加view(view包含picker,input)

<view wx:for="{{array}}" wx:key="this" class="borderContainer"> <view class="borderContainer1"> <view class="firstBorder"> <view class="firstBorderInput"> <input maxlen

微信小程序封装http请求

Q:网上很多封装http请求的方法,我就收藏了一种比较通俗易懂的方法. A:对封装的要求:一是在封装函数里设置header,发送token.二是在封装函数里对后台返回的参数作出统一处理,例如如果statusCode不返回200,统一做出异常处理,相当于过滤功能. var API_COMMON = 'http://192.168.2.105:8080/' var requestHandler = { params: {}, success: function (res) { // success

微信小程序封装请求接口

var rootDocment = 'https://123.com';//你的域名 function postData(url, data, cb) { wx.request({ url: rootDocment + url, data: data, method: 'post', success: function (res) { return typeof cb == "function" && cb(res) }, fail: function () { ret

微信小程序学习指南

作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 微信小程序正式公测, 张小龙全面阐述小程序,定档1月9日上线(附90分钟演讲全文) ... 前言:新人第一坑,跳坑指南:修改后,必须保存:ctrl+S: 1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教

微信小程序最新开发资源汇总,对学习微信小程序的新手有一定帮助

微信小程序最新开发资源汇总,希望给想学习或正在学习微信小程序开发的同学们带来一定帮助,汇总的小程序资源有点繁杂,各种类型的小程序demo都有,大家可以选择自己想要的demo进行下载学习.这些微信小程序资源大多是整理自github,如果可以,希望大家能够给github上的原作者一颗star,感谢原作者的无私奉献. 这里整理的是资源的原帖子,下载链接也在帖子里,当然本人也只体验了部分demo,有兴趣的同学可以都下载试试. 下载地址: 仿微信聊天,朋友圈小程序源码wepy框架开发的小程序商城源码,功能