天天看點

ant-design vue input通過那個事件可以獲得輸入框變化的值_Vue項目和微信小程式項目的差別與比較 - 較瘦

對于一些剛開始學 Vue 和微信小程式的人來說,二者有很多相似之處,非常容易記混,在此簡單記錄一些二者的共同點和差別。

一、生命周期

先貼兩張圖:

Vue 生命周期

ant-design vue input通過那個事件可以獲得輸入框變化的值_Vue項目和微信小程式項目的差別與比較 - 較瘦

小程式生命周期

ant-design vue input通過那個事件可以獲得輸入框變化的值_Vue項目和微信小程式項目的差別與比較 - 較瘦

相比之下,小程式的鈎子函數要簡單的多。

vue 的鈎子函數在跳轉新頁面時,鈎子函數都會觸發,但是小程式的鈎子函數,頁面不同的跳轉方式,觸發的鈎子并不一樣。

  • onLoad: 頁面加載

    一個頁面隻會調用一次,可以在 onLoad 中擷取打開目前頁面所調用的 query 參數。

  • onShow: 頁面顯示

    每次打開頁面都會調用一次。

  • onReady: 頁面初次渲染完成

    一個頁面隻會調用一次,代表頁面已經準備妥當,可以和視圖層進行互動。

    對界面的設定如 請在 onReady 之後設定。詳見生命周期

  • onHide: 頁面隐藏

    當 navigateTo 或底部 tab 切換時調用。

  • onUnload: 頁面解除安裝

    當 redirectTo 或 navigateBack 的時候調用。

資料請求

在頁面加載請求資料時,兩者鈎子的使用有些類似,vue 一般會在 created 或者 mounted 中請求資料,而在小程式,會在 onLoad 或者 onShow 中請求資料。

二、資料定義

VUE: vue項目資料需要寫在

data

方法裡面

return

傳回,取值方式是

,修改指派是

= xxxx

export default {
  data() {
    return {
      itemId: null, //題目ID
      choosedNum: null, //選中答案索引
      choosedId: null, //選中答案id
    };
  },
  methods: {
    //點選下一題
    nextItem() {
      if ( !== null) {
         = null;
        //儲存答案, 題目索引加一,跳到下一題
        ();
      } else {
        alert("您還沒有選擇答案哦");
      }
    },
  }
}

           

小程式:小程式資料需要寫在

data

對象裡面就可以,取值方式是

,修改指派是

({ catesList: });

Page({
  data: {
    // 輪播圖數組
    swiperList: [],
    // 導航數組
    catesList: [],
    // 樓層資料
    floorList: [],
  },
  // 擷取 分類導航資料
  getCatesList() {
    request({
      url: "/home/catitems",
    }).then((resuult) => {
      ({ catesList:  });
    });
  },
           

三、資料綁定

VUE:vue 動态綁定一個變量的值為元素的某個屬性的時候,會在屬性前面加上冒号

:

,而等号右側的變量(imgSrc)直接放在引号裡面,不需要加雙引号,例:

<img :src="imgSrc"/>
           

小程式:綁定某個變量的值為元素屬性時,會用兩個大括号括起來,如果不加括号,為被認為是字元串。例:

<image src="{{imgSrc}}"></image>
           

VUE:綁定一個字元串的時候,不用在屬性前面加

:

<img data-type="主題"/>
           

小程式:綁定一個字元串的時候。同樣不需要加大括号

<image src="imgSrc"></image>
           

四、清單渲染

直接貼代碼,兩者還是有些相似

vue:

<ul>
  <li v-for="(item, index) in items" :key="index">
    {{  }}
  </li>
</ul>

var example1 = new Vue({
  el: '#example-1',
  data: {
    items: [
      { message: 'Foo' },
      { message: 'Bar' }
    ]
  }
})
           

小程式:

Page({
  data: {
    items: [
      { message: 'Foo' },
      { message: 'Bar' }
    ]
  }
})

<text wx:for="{{items}}" wx:key="">{{item}}</text>
           

五、顯示與隐藏元素

vue 中,使用

v-if

v-show

控制元素的顯示和隐藏

小程式中,使用

wx-if

hidden

控制元素的顯示和隐藏

六、路由跳轉

vue: vue-router使用

to

,寫路徑或者路由名等多種方式

<router-link to="item" class="start button_style"></router-link>
           

小程式:使用

url

屬性跳轉,并且必須寫全路徑,如果要有特殊需求要加

open-type

跳轉的方式

<navigator url="/pages/item/item" class="start button_style"></navigator>
           

七、事件處理

vue:使用

v-on:event

綁定事件,或者使用

@event

綁定事件,例如:

<button v-on:click="counter += 1">Add 1</button>
<button v-on:"counter+=1">Add1</button>  //阻止事件冒泡
           

小程式中,全用

bindtap(bind+event)

,或者

catchtap(catch+event)

綁定事件,例如:

<button bindtap="noWork">明天不上班</button>
<button catchtap="noWork">明天不上班</button>  //阻止事件冒泡
           

八、資料雙向綁定

1.設定值

在 vue 中,隻需要再表單元素上加上

v-model

,然後再綁定 data 中對應的一個值,當表單元素内容發生變化時,data 中對應的值也會相應改變,這是 vue 非常 nice 的一點。

<div>
    <input v-model="reason" placeholder="填寫理由" class='reason'/>
</div>

new Vue({
  el: '#app',
  data: {
   reason:''
  }
})
           

但是在小程式中,卻沒有這個功能。那怎麼辦呢?

當表單内容發生變化時,會觸發表單元素上綁定的方法,然後在該方法中,通過

({key:value})

來将表單上的值指派給 data 中的對應值。

下面是代碼,可以感受一下:

<input bindinput="bindReason" placeholder="填寫理由" class='reason' value='{{reason}}' name="reason" />

Page({
data:{
    reason:''
},
bindReason(e) {
    ({
      reason: 
    })
  }
})
           

當頁面表單元素很多的時候,更改值就是一件體力活了。和小程式一比較,vue 的 v-model 簡直爽的不要不要的。

注意:在小程式基礎庫 開始,已經支援簡易雙向綁定寫法了!!!在對應項目之前加入

model:

字首。

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

這時候 input 的值修改的時候,

一樣會修改了

2.取值

vue 中,通過

取值

小程式中,通過

取值

九、定義事件

VUE: 不管是元件模闆、頁面模闆,事件都必須定義在

methods

裡面

<script>
export default {
  name: 'score',
  data(){
    return {
    }
  },
  methods: {
    //根據分數顯示提示
    getScoreTip: function (){
      let index = ()-1;
      this.scoreTips = this.scoreTipsArr[index];
    },
    // 統計正确答案
    getRightAnswer(){
      this.$((item)=>{
        ((obj)=>{
          if(){
            ();
          }
        });
      });
    }
  },
}

</script>

           

小程式:

頁面模闆(pages目錄下面的)沒有

methods

屬性,需要定義在

data

屬性同級

// pages/item/item.js
import { request } from "../../request/index";
Page({
  data: {
    // 輪播圖數組
    swiperList: [],
    // 導航數組
    catesList: [],
    // 樓層資料
    floorList: [],
  },
  // 頁面開始加載  就會觸發
  onLoad: function (options) {

    ();
    ();
    ();
  },
  // 擷取 輪播圖資料
  getSwiperList() {
    request({
      url: "/home/swiperdata",
    }).then((resuult) => {
      let list = ;
      list.forEach((element) => {
        element.navigator_url = element.navigator_url.replace(
          /\/main/g,
          "/index"
        );
      });
      ({
        swiperList: list,
      });
    });
  },
  // 擷取 分類導航資料
  getCatesList() {
    request({
      url: "/home/catitems",
    }).then((resuult) => {
      ({ catesList:  });
    });
  },
  // 擷取 樓層資料
  getFloorList() {
    request({
      url: "/home/floordata",
    }).then((resuult) => {
      let list = ;
      list.forEach((element) => {
        ((v) => {
          v.navigator_url = v.navigator_url.replace(
            /goods_list\?/g,
            "goods_list/index?"
          );
        });
      });
      (2222, list);
      ({ floorList:  });
    });
  },
});


           

元件模闆(components目錄下面的)的事件必須定義在

methods

裡面

// components/Tabs/Tabs.js
Component({
  /**
   * 元件的屬性清單
   */
  properties: {
    tabs: {
      type: Array,
      value: [],
    },
  },

  /**
   * 元件的初始資料
   */
  data: {},

  /**
   * 元件的方法清單
   */
  methods: {
    // 點選tab切換事件
    handleItemTap(e) {
      // 1 擷取點選的索引
      const { index } = ;
      // 2 觸發 父元件中的事件  自定義
      ("tabsItemChange", { index });
    },
  },
});

           

十、綁定事件傳參

在 vue 中,綁定事件傳參挺簡單,隻需要在觸發事件的方法中,把需要傳遞的資料作為形參傳入就可以了,例如:

<button @click="say('明天不上班')"></button>

new Vue({
  el: '#app',
  methods:{
    say(arg){
    (arg)
    }
  }
})
           

在小程式中,不能直接在綁定事件的方法中傳入參數,需要将參數作為屬性值,綁定到元素上的 data-屬性上,然後在方法中,通過 .*的方式擷取,進而完成參數的傳遞,很麻煩有沒有...

<view class='tr' bindtap='toApprove' data-id="{{}}"></view>
Page({
data:{
    reason:''
},
toApprove(e) {
    let id = .id;
  }
})
           

十一、父子元件通信

1.子元件的使用

在 vue 中,需要:

  1. 編寫子元件
  2. 在需要使用的父元件中通過 import 引入
  3. 在 vue 的 components 中注冊
  4. 在模闆中使用
//子元件 
<template>
  <div class="search-box">
    <div @click="say" :title="title" class="icon-dismiss"></div>
  </div>
</template>
<script>
export default{
props:{
    title:{
       type:String,
       default:''
      }
    }
},
methods:{
    say(){
       ('明天不上班');
       this.$emit('helloWorld')
    }
}
</script>

// 父元件 foo.vue
<template>
  <div class="container">
    <bar :title="title" @helloWorld="helloWorld"></bar>
  </div>
</template>

<script>
import Bar from './'
export default{
data(){
  return {
    title:"我是标題"
  }
},
methods:{
    helloWorld(){
        ('我接收到子元件傳遞的事件了')
    }
},
components:{
    Bar
}
</script>
           

在小程式中,需要:

  1. 編寫子元件
  2. 在子元件的 json 檔案中,将該檔案聲明為元件
{
  "component": true
}
           
  1. 在需要引入的父元件的 json 檔案中,在 usingComponents 填寫引入元件的元件名以及路徑
"usingComponents": {
    "tab-bar": "../../components/tabBar/tabBar"
  }
           
  1. 在父元件中,直接引入即可
<tab-bar currentpage="index"></tab-bar>
           

具體代碼:

// 子元件
<!--components/tabBar/tabBar.wxml-->
<view class='tabbar-wrapper'>
  <view class='left-bar {{currentpage==="index"?"active":""}}' bindtap='jumpToIndex'>
    <text class='iconfont icon-shouye'></text>
    <view>首頁</view>
  </view>
  <view class='right-bar {{currentpage==="setting"?"active":""}}' bindtap='jumpToSetting'>
    <text class='iconfont icon-shezhi'></text>
    <view>設定</view>
  </view>
</view>
           

2.父子元件間通信

在 vue 中

父元件向子元件傳遞資料,隻需要在子元件通過 v-bind 傳入一個值,在子元件中,通過 props 接收,即可完成資料的傳遞,示例:

// 父元件 foo.vue
<template>
  <div class="container">
    <bar :title="title"></bar>
  </div>
</template>
<script>
import Bar from './'
export default{
data:{
    title:"我是标題"
},
components:{
    Bar
}
</script>

// 子元件
<template>
  <div class="search-box">
    <div :title="title" ></div>
  </div>
</template>
<script>
export default{
props:{
    title:{
       type:String,
       default:''
      }
    }
}
</script>
           

子元件和父元件通信可以通過 this.$emit 将方法和資料傳遞給父元件。

在小程式中

父元件向子元件通信和 vue 類似,但是小程式沒有通過 v-bind,而是直接将值指派給一個變量,如下:

<tab-bar currentpage="index"></tab-bar>
           

此處, “index”就是要向子元件傳遞的值

在子元件 properties 中,接收傳遞的值

properties: {
    // 彈窗标題
    currentpage: {            // 屬性名
      type: String,     // 類型(必填),目前接受的類型包括:String, Number, Boolean, Object, Array, null(表示任意類型)
      value: 'index'     // 屬性初始值(可選),如果未指定則會根據類型選擇一個
    }
  }
           

子元件向父元件通信和 vue 也很類似,代碼如下:

//子元件中
methods: {
    // 傳遞給父元件
    cancelBut: function (e) {
      var that = this;
      var myEventDetail = { pickerShow: false, type: 'cancel' } // detail對象,提供給事件監聽函數
      ('myevent', myEventDetail) //myevent自定義名稱事件,父元件中使用
    },
}

//父元件中
<bar bind:myevent="toggleToast"></bar>

// 擷取子元件資訊
toggleToast(e){
    ()
}
           

3. 如果父元件想要調用子元件的方法

vue 會給子元件添加一個 ref 屬性,通過 this.$ 的值便可以擷取到該子元件,然後便可以調用子元件中的任意方法,例如:

//子元件
<bar ref="bar"></bar>

//父元件
this.$.
           

小程式是給子元件添加 id 或者 class,然後通過 找到子元件,然後再調用子元件的方法,示例:

//子元件
<bar></bar>

// 父元件
('#id').syaHello()
           

4. 小程式父元件改變子元件樣式

  1. 父元件将 style 傳入子元件
  2. 父元件傳入變量控制子元件樣式
  3. 在父元件樣式中,在子元件類名前面加上父元件類名
<view class='share-button-ontainer' bindtap='handleShareBtn'>
  <share-button-container product="{{goodProduct}}" type="1" back-color="#fff" fore-color="#9e292f" bind:error="on_error" />
</view>

.share-button-container .button--btn-navigator__hover{
  background:#fff;
}
           

參考:

vue和微信小程式的差別、比較

繼續閱讀