小程序input提交後如何清空輸入框數據:小程序與Vue的數據綁定方式

前言

一直覺得,小程序與Vue有着神似之風。這一點在我第一天開始接觸小程序時就這麼認爲,或者說,任何前端相關的語言,不管是node.js、Vue、angular、小程序,都和js有着千絲萬縷的聯繫。
而最讓我“着迷”的,莫過於曾讓我夜夜輾轉反側的“ 數據傳遞(數據綁定) ”了。趁着一次偶然提起,將其記錄下來。

從一個案例看Vue的數據綁定方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue實例-全選</title>
    <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
    <script src="https://cdn.staticfile.org/vue-router/2.7.0/vue-router.min.js"></script>
</head>
<body>
<div id="app">
    <input type="checkbox" v-model="checkAll.check" @click="checkAllChange">
    <label>{{checkAll.name}}</label>
    <div v-show="id===true">全選啦 全選啦!!!</div>
    <ul>
        <li v-for="list in lists" @click="curCheck">
            <input type="checkbox" v-model="list.check">
            <label>{{list.name}}</label>
        </li>
    </ul>
</div>
<script>
    window.onload=function () {
        new Vue({
            el:"#app",
            data:{
                checkAll:{check:false,name:"全選"},
                lists:[
                    {check:true,name:'小米'},
                    {check:false,name:'華爲1'},
                    {check:false,name:'華爲2'},
                    {check:false,name:'華爲3'}
                ],
                id:false
            },
            methods:{
                checkAllChange:function () {
                    // for(var i=0;i<this.lists.length;i++){
                    //     this.lists[i].check=this.checkAll.check;
                    // }
                    this.lists.forEach((item)=>{
                        item.check=this.checkAll.check;
                        this.id=!this.id;
                    });
                },
                curCheck:function () {
                    var select=this.lists.filter(function (item) {   //filter函數篩選出符合要求(被選中)的複選框
                        return item.check===true;
                    });
                    select.length===this.lists.length?this.checkAll.check=true:this.checkAll.check=false;
                    // this.checkAll.check=this.lists.every(function (item) {
                    //     return item.check;
                    // });
                    select.length===this.lists.length?this.id=true:this.id=false;
                }
            }
        })
    }
</script>
</body>
</html>

第11行的v-model無疑是最耀眼的。v-前綴,是爲vue內置指令。v-model,雙向綁定數據,它的值對應於我們創建的vue實例中data選項中的某一字段 。這就是我們說的數據綁定。
綁定完,就要“插入到”頁面中了:

《Vue.js實戰》這本書中說:使用大括號(Mustache語法)“{{ }}”是最基本的文本插入方法,它會自動的將我們綁定的數據實時的顯示出來。當然,前提是你引入了vue文件(哈哈…)

不知道你發現沒有,在我的所有vue項目or插件中,從來沒發現過插值在標籤裏面的情況。它就很“粗魯”的將數據放在開發者想放到的“頁面上的位置”。
而小程序在第一天就打破了我這個“神奇的發現”:

從input提交的案例瞭解小程序的綁定機制

獲取輸入框數據,提交後到控制檯輸出,而且清空輸入框內數據。

---------- index.wxml -----------
<view class="title">用戶註冊</view>
<form bindsubmit="register">
  <view class="form-item">
    <text class="form-item-label">用戶名:</text>
    <input class="form-item-value" placeholder="請輸入用戶名" name="username" value="{{mxc}}" />
  </view>
  <view class="form-item">
    <text class="form-item-label">密碼:</text>
    <input class="form-item-value" placeholder="請輸入密碼" name="password" type="password" value="{{mmxc}}" />
  </view>
  <view class="form-item">
    <text class="form-item-label">確認密碼:</text>
    <input class="form-item-value" placeholder="請確認密碼" name="confirmPassword" type="password" value="{{mmmxc}}" />
  </view>
  <view class="form-item">
    <button form-type="submit">註冊</button>
    <button form-type="reset">重置</button>
  </view>
</form>

----------- index.js -----------
  register(e) {
    const { username, password, confirmPassword } = e.detail.value   //獲取數據,在這裏,e就指代了input,e.detail.value即獲取輸入框中的數據,因爲有三個框,所以用三個const(es6語法)變量來接收
    console.log('表單信息: ', username, password, confirmPassword)
    this.setData({
      mxc:"",
      mmxc:"",
      mmmxc:""
    })
  }

首先,由於小程序強大的模塊機制,小程序並不需要同一文件夾下的文件之間相互導入(當然,在必要引入的地方(如:子模塊,用引入父wxml中,其css樣式也通過@import “”;引入父模塊wxss文件)此句作廢)。而且,小程序中只要涉及動態數據(數據綁定)的,一律要用{{}}包住 。這大概也是一種進化的安全機制吧。
就比如value="{{...}}"這句,我開始就寫成了不加大括號的,再加上當時對setData函數的不理解,就直接將數據寫在了data中並初始化了一下(對,沒錯,就是模仿vue寫的!),然後,,,就幾天找不到錯誤了。

哦,還有reset,網上有方法說把“提交”按鈕綁定事件也設爲reset,然後在form中把bindsubmit換成其他方法,在其中做手腳,但是我試遍了幾乎所有的reset,但是小程序在提交前都會將數據清空,,,
在這裏插入圖片描述
第23行還有一個容易犯的錯誤:const定義的變量的作用只是接收e.detail.value返回的數據,但萬不可以此置空來解決“清空輸入框”的要求。(說白了,他們三個只是替身)
爲什麼一定要寫在setData裏?
小程序雖然和vue相比有很大改動,但是其本質不變:綁定的是data中的數據變量!而setData的作用就是將其中的屬性和值寫入data中。

說白了,vue是雙向數據綁定,而小程序時單向數據綁定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章