【ウィジェット】ログイン、登録、パスワードインタフェースの復元の3つの統合、シームレスな切り替え

48788 ワード

概要
ログイン、登録、パスワードの復元などの機能を1つのインタフェースに統合すると、重複入力やインタフェースの重複切替を減らすことができ、切り替えたアニメーション効果はcssのtransition属性で実現される
ウィジェットコードクリップを直接インポートできます.https://developers.weixin.qq.com/s/LMsBNWm47ofR
効果
インプリメンテーション
jsコード
// account.js
Page({
  data: {
    action: "login", //       ,    :login:  , register:  ,reset:    ,  
    code_button_text: "     ", //         
    pos: { login: 1, register: 2, reset: 3 }, //               
    action_text: { login: "  ", register: "  ", reset: "    " },
  },
  login(value) {
    let {login, password} = value;
  	/**
  	          ,       
  	login:    , password:  
    */
  },
  register(value) {
    let {login, password, code} = value;
  	/**
  	          ,       
  	login:    , password:  , code:   
  	*/
  },
  reset(value) {
    let {login, password, password_confirmation, code} = value;
    /**
                ,       
  login:    , password:  , password_confirmation:          ,code:   
  */
  },
  getCode(value) {
    let {login} = value;
    let { action } = this.data
    this.setData({code_status:1}) //          ;
    this.countDown();
    /**
                 
    !!           this.countDown()              
  	login:    , action:     ,   login, register, reset(    )
  	*/
  },
  countDown() {
    //         
    var count = 60; //     ,        
    this.setData({ code_status: 2, code_button_text: count-- + "    " });
    var id = setInterval(() => {
      if (count <= 0)
        return this.clearCount(id);
      this.setData({ code_button_text: count-- + "    " })
    }, 1000);
    return id;
  },
  clearCount(id) {
    //         
    clearInterval(id);
    this.setData({ code_status: 0, code_button_text: "     " });
  },
  onSubmit({ detail: { value, target } }) {
    //            
    if (!this.checkInput({ value, action: target.id })) //         
      return;
    if (target.id == "code")
      return this.getCode(value);
    if (target.id != this.data.action)
      return this.setAction(target.id);
    this[target.id](value);
    console.log("    " + target.id, "  value    login,password, password_confirmation, save_password, no_login_after_reset ,       ",value);
  },
  checkInput({ value, action }) {
    /**        ,         ,        
     * value: Object  
     * value.login:    
     * value.passwork:   
     * ...
     **/
    if (action != this.data.action && action != "code")
      return true;
    if (!value.login)
      return wx.showToast({ title: '         ', icon: "none" }) && false;
    if (action == "code")
      return true;
    if (!value.password)
      return wx.showToast({ title: '     ', icon: "none" }) && false;
    if (action == "login")
      return true;
    if (!value.code)
      return wx.showToast({ title: '      ', icon: "none" }) && false;
    if (action == "register")
      return true;
    if (!value.password_confirmation)
      return wx.showToast({ title: '       ', icon: "none" }) && false;
    return true;
  },
  setAction(action) {
    //         action
    let { pos } = this.data;
    if (!(action in pos))
      return;
    let tmp = pos[action];
    pos[action] = pos[this.data.action];
    pos[this.data.action] = tmp;
    this.setData({ pos, action });
  },
  onLoad: function (options) {
  	//          action          (  、  、    )
    let {action="login"} = options;
    this.setAction(action);
  }
})

wxmlコード

<page-meta>
  <navigation-bar title="{{action_text[action]}}" /> 
page-meta>

<view>
  <form class="account-form" bindsubmit="onSubmit">
    <view class="inputs">
      <view class="input-wrap">
        <input name="login"  placeholder="      "/>
      view>
      <view class="input-wrap {{action!='login'?'':'hidden'}}">
        <input name="code" placeholder="   "/>
        <button id="code" type="primary" size="mini" form-type="submit" loading="{{code_status==1}}" disabled="{{code_status}}" class="obtain-code">
          {{code_button_text}}
        button>
      view>
      <view class="input-wrap">
        <input password name="password" value="{{password}}" placeholder="     "/>
      view>
      <view class="input-wrap {{action=='reset'?'':'hidden'}}">
        <input password name="password_confirmation" placeholder="       "/>
      view>
      <view class="checkbox-wrap">
        <switch type="checkbox" name="save_password" color="#00b0f0" checked="{{save_password}}">    switch>
        <switch type="checkbox" class="no-login {{action=='reset'?'':'hidden'}}" name="no_login_after_reset" color="#00b0f0">      switch>
      view>
    view>
    <view class="actions">
      <view class="pos{{pos.login}}">
        <button id="login" form-type="submit">  button>
      view>
      <view class="pos{{pos.register}}">
        <button id="register" form-type="submit">  button>
      view>
      <view class="pos{{pos.reset}}">
        <button id="reset"  form-type="submit">{{pos.reset==1?'    ':'    ?'}}button>
      view>
    view>
  form>
view>

wxssコード
/**account.wxss*/
.checkbox-wrap,.input-wrap{
  transition: 1s all ease;
  max-height: 50px;
  display: flex;
  margin: 5px 26px;
  overflow: hidden;
}
.checkbox-wrap{
  font-size: 14px;
  margin: 0px 20px;
  display: flex;
  justify-content: space-between;
}
.checkbox-wrap switch{
  transform: scale(0.82);
}
.input-wrap>input{
  padding: 8px 10px;
  border-radius: 4px;
  border: 1px #00b0f0 solid; 
  flex:auto;
}
.obtain-code{
  margin-left: 12px!important;
  white-space: nowrap;
  display: flex!important;
  justify-content: center;
  align-items: center;
  flex: none;
  background: #00b0f0!important;
}
.obtain-code[disabled]{
  color: white!important; /*          */
}
.input-wrap.hidden{
  max-height: 0px;
}
switch.no-login.hidden{
  opacity: 0;
}
switch.no-login{
  float: left;
  transition: 1s all ease;
}
.actions{
  position: relative;
  margin: 0 26px
}
.actions button{
  transition: 1s all ease;
}
.actions>view{
  width: 100%;
  position: absolute;
  transition: 1s all ease;
}
.actions>.pos1{
  top: 18px;
}
.pos1>button{
  background: #00b0f0;
  color:white;
}
.actions>.pos2{
  top:66px;
}
.pos2>button{
  color: #00b0f0;
  border:#00b0f0 1px solid;
}
.actions>.pos3{
  top: 0px;
}
.pos3>button{
  font-size: 14px;
  color: #00b0f0;
  background: transparent;
  transform: translateX(240rpx);
  padding: 0px!important;
  border-style: none!important;
  line-height: 1;
}
.pos3>button::after{
  content: none!important;
}


tip
  • サンプルコードで使用される微信ウィジェットは、新しいコンポーネントスタイルstyle:v 2であり、古いバージョンのインタフェースは少し異なります.
  • コピーがおっくうな場合は、開発ツール、リンクをウィジェットコードクリップで直接インポートできます.https://developers.weixin.qq.com/s/LMsBNWm47ofR