1. 程式人生 > >微信小程式知識點

微信小程式知識點

1、:host相當於元件本身(比如你元件名叫 v-name 然後這個元件裡面的:host就是v-name

:host {//這個是元件本身(比如元件名為v-name)v-name的樣式
  color: yellow;
}
相當於
v-name{
color: yellow;
}
2、比如app.wxss(公共樣式)裡面有個 .section ,元件也有,元件不開放公共樣式的話就只用元件裡的樣式了。
3、在 properties 定義段中,屬性名採用駝峰寫法(propertyName);在 wxml 中,指定屬性值時則對應使用連字元寫法(component-tag-name property-name="attr value"),應用於資料繫結時採用駝峰寫法(attr="{{propertyName}}")。
4、 that.setData({
         'A[0].B': 'myPrivateData'
      })=====相當於
    (   that.replaceDataOnPath( ['A', 0, 'B'], 'myPrivateData'); // 替代資料:這裡將 data.A[0].B 設為 'myPrivateData';‘A’表示陣列本身,0表示索引位置,‘B’表示陣列子元素中的某一物件;
     that..applyDataUpdates();//更新資料
     )
5、
bug : 對於 type 為 Object 或 Array 的屬性,如果通過該元件自身的 this.setData 來改變屬性值的一個子欄位,則依舊會觸發屬性 observer ,且 observer 接收到的 newVal 是變化的那個子欄位的值, oldVal 為空, changedPath 包含子欄位的欄位名相關資訊。
6、   observer: function (newVal, oldVal, changedPath) {
        this._propertyChange(newVal, oldVal, changedPath)
      }
      methods: {
    _propertyChange: function (newVal, oldVal, changedPath) {
      console.log(newVal);
      console.log(oldVal);
      console.log(changedPath);
    }
  }
  ======相當於=====
 observer: function (newVal, oldVal, changedPath) {
        console.log(newVal);
        console.log(oldVal);
        console.log(changedPath);
      }
7、元件間通訊
元件間的基本通訊方式有以下幾種。
    WXML 資料繫結:用於父元件向子元件的指定屬性設定資料,僅能設定 JSON 相容資料(自基礎庫版本 2.0.9 開始,還可以在資料中包含函式)。具體在 元件模版和樣式 章節中介紹。
    事件:用於子元件向父元件傳遞資料,可以傳遞任意資料。
    如果以上兩種方式不足以滿足需要,父元件還可以通過 this.selectComponent 方法獲取子元件例項物件,這樣就可以直接訪問元件的任意資料和方法。
    注:this.selectComponent方法的用法:
    index.wxml介面:
    <!-- 引用元件的頁面模版 -->
<view>
  <my-component bindmyevent="myEventListener" id="main">
    <!-- 這部分內容將被放置在元件 <slot> 的位置上 -->
     <view>這裡是插入到元件slot中的內容</view>
  </my-component>
</view>
index.js檔案:
Page({
  data: {
  },
  onReady: function () {
    var main=this.selectComponent("#main");
    console.log(main.data.on);
  }
})
8、dataset
在元件中可以定義資料,這些資料將會通過事件傳遞給 SERVICE。 書寫方式: 以data-開頭,多個單詞由連字元-連結,不能有大寫(大寫會自動轉成小寫)如data-element-type,最終在 event.currentTarget.dataset 中會將連字元轉成駝峰elementType。

示例:

<view data-alpha-beta="1" data-alphaBeta="2" bindtap="bindViewTap"> DataSet Test </view>

Page({
  bindViewTap:function(event){
    event.currentTarget.dataset.alphaBeta === 1 // - 會轉為駝峰寫法
    event.currentTarget.dataset.alphabeta === 2 // 大寫會轉為小寫
  }
})
9、(1) ./當前目錄
     (2)  ../上級目錄
 10、 App() 與behaviors元件間狀態共享的區別:
        (1)① App() 必須在 app.js 中呼叫,必須呼叫且只能呼叫一次(例項一次,比如如果兩個頁面都呼叫了App(),其中的一個引數在一個頁面裡修改,那會導致全部頁面呼叫的資料都修改了)。不然會出現無法預期的後果。
        ②App()裡可以呼叫方法和屬性,在 globalData:{}裡寫方法和屬性。
        (2)①behaviors 是用於元件間程式碼共享的特性(可以例項多次,相當於程式碼複製。比如兩個元件呼叫了該behaviors 檔案,相當於兩個例項,如果其中一個例項中的引數改變,另一個元件裡的例項的引數不會變化的),每個 behavior 可以包含一組屬性、資料、生命週期函式和方法,元件引用它時,它的屬性、資料和方法會被合併到元件中,生命週期函式也會在對應時機被呼叫。每個元件可以引用多個 behavior 。 behavior 也可以引用其他 behavior 。具體功能參考api文件。
11、父元件與子元件之間的通訊:(1)子元件傳遞資料給父元件時:一般情況下是會觸發某種事件的,導致資料(在子元件裡)變化的:你每次改值的時候要觸發元件裡的自定義元件事件函式給父級監聽。
例如:index.wxml頁面:
<list listdata="{{listdata}}"   bind:addData="adddata"></list>
<addBtn listdata="{{listdata}}"></addBtn>
addBtn.wxml頁面:
<view>
    <button catchtap='add'>新增</button>
</view>
addBtn.js:
Component({
  options: {
  },
  properties: {
    listdata: {
      type: Array, // 型別(必填),目前接受的型別包括:String, Number, Boolean, Object, Array, null(表示任意型別)
      value: [], // 屬性初始值(可選),如果未指定則會根據型別選擇一個
      observer: function (newVal, oldVal, changedPath) {
        var that = this;
        that.setData({
          listdata: newVal
        })
      }
    }
  },
  methods: {
    add:function(e){
      var that = this;
      console.log(that.data.listdata);
    }
  }
})
addBtn.json:
{
    "component": true,
    "usingComponents": {}
}
list.wxml:

<view>
    <ul>
        <li wx:for="{{listdata}}" wx:key="index">
        {{item}}<text catchtap='adddata' data-value="{{item}}" data-index="{{index}}">+</text>
        </li>
    </ul>
</view>
list.json:
{
  "component": true,
  "usingComponents": {
    
  }
}
list.js:
Component({
options: {
},
properties: {
  listdata:{
    type: Array, // 型別(必填),目前接受的型別包括:String, Number, Boolean, Object, Array, null(表示任意型別)
    value:[], // 屬性初始值(可選),如果未指定則會根據型別選擇一個
    observer: function (newVal, oldVal, changedPath) {
        var that=this;
        that.setData({
          listdata: newVal
        })
    }
  }
 },
methods: {
  adddata:function(e){
    var index=e.currentTarget.dataset.index;
    var valuetxt = e.currentTarget.dataset.value;
    var that =this;
    var curlistdata={
      index:index,
      curdata: valuetxt
    }
    this.triggerEvent('addData', curlistdata);
  }
}
})
index.json:
{
    "usingComponents": {
      "list": "/components/list/list",
      "addBtn": "/components/addBtn/addBtn"
    }
}
index.js:
Page({

  /**
   * 頁面的初始資料
   */
  data: {
    listdata:[11,12,16]
  },

  /**
   * 生命週期函式--監聽頁面載入
   */
  onLoad: function (options) {
    
  },
  adddata:function(e){
      var index=e.detail.index;
      var datavalue = e.detail.curdata+1;
      var that=this;
      var listdata = that.data.listdata;
      listdata[index] = datavalue;
      that.setData({
        listdata
      })
    console.log(that.data.listdata);
  }
})
12、去除button自帶的的邊框:
button::after{
    border: none;
}