天天看點

小程式學習---子產品化程式設計

      隻要是做過程式設計的童鞋都知道子產品化的思想,這樣寫出的代碼更加簡潔明了。子產品化的代碼讓你的思路更加清晰,有利于目前程式設計,同時還有利于後期的維護。另外,很多有公共作用的代碼,理所應當的提煉出來,以提高代碼使用率。很多時候一個子產品不僅适用于目前的項目,其他項目中同樣可以使用的。

一、檔案的作用域

點選(此處)折疊或打開

// app.js

在app.js中定義全局變量

App({

  globalData: 1

})

//weather.js,在這個檔案中你可以使用上面定義的全局變量

//首先,擷取app執行個體,使用getApp()方法

var app = getApp()

//接着,你可以使用“.”方法來調用全局變量

app.globalData++

console.log(getApp().globalData)

二、使用子產品化

可以将一些公共的代碼抽離成為一個單獨的 js 檔案,作為一個子產品。子產品隻有通過 module.exports 或者 exports 才能對外暴露接口。需要注意的是:

    1)exports 是 module.exports 的一個引用,是以在子產品裡邊随意更改 exports 的指向會造成未知的錯誤。是以更推薦開發者采用 module.exports 來暴露子產品接口,除非你已經清晰知道這兩者的關系。

    2)小程式目前不支援直接引入 node_modules , 開發者需要使用到 node_modules 時候建議拷貝出相關的代碼到小程式的目錄中。來看下面提供的執行個體

// common.js 在這個js檔案中定義兩個函數,友善在其他js檔案中使用

function sayHello(name) {

  console.log(`Hello ${name} !`)

}

function sayGoodbye(name) {

  console.log(`Goodbye ${name} !`)

//使用exports文法将上面定義的函數導出

//注意,另外一個js檔案看到的是 sayHelloFun,不是sayHello

module.exports.sayHelloFun = sayHello

exports.sayGoodbyeFun = sayGoodbye

//weather.js 在這個檔案中使用上面定義的函數

//實作要使用require文法來引用上面的js檔案

//變量common中包含了上面導出的所有的東西

var common = require('common.js')

Page({

  helloMINA: function() {

     //使用”.”文法來調用導出的函數

    common.sayHelloFun('MINA')

  },

  goodbyeMINA: function() {

    common.sayGoodbyeFun('MINA')

  }

    注意:require目前不支援絕對路徑,你使用相對路徑

三、setData

   還記得每一個頁面js檔案嗎,在它的Page中包含了一個data屬性,我們說這個data裡面放的就是頁面的資料,如下:

  data: {

    temp: “28攝氏度”,

    array: [{msg: '1'}, {msg: '2'}]

    上面的代碼很好,但是我們有一個問題,temp值不可能是預先定義好的,你可以看到temp這個key,但是它代表的溫度值應該是動态加載的,會時刻發生變化。如何在js檔案的其他地方來設定這個temp值呢?

   小程式提供setData方法來動态修改data内部的資料,它可以接收兩個參數(ps:我們并不推薦直接使用“=”來指派 )

    1)object 以 key,value 的形式表示将 this.data 中的 key 對應的值改變成 value。

    2)callback 是一個回調函數,在這次setData對界面渲染完畢後調用。

其中 key 可以非常靈活,以資料路徑的形式給出,如 array[2].message,a.b.c.d,并且不需要在 this.data 中預先定義。

    需要注意下面幾點

    1)直接修改 this.data 而不調用 this.setData 是無法改變頁面的狀态的,還會造成資料不一緻。

    2)單次設定的資料不能超過1024kB,請盡量避免一次設定過多的資料。

    3)請不要把 data 中任何一項的 value 設為 undefined ,否則這一項将不被設定并可能遺留一些潛在問題。

    4)setData是異步執行的

    text: 'init data',

  //這是一個自定義函數,在這裡我們可以修改data的資料

  changeText: function() {

    //

    this.setData({

       //修改text的内容

      text: 'changed data',

      //在data中增加了一個num,它對應的value是1

      num:1

    })

})

四、修改項目

1、之前的代碼問題

   我們回顧一下之前的代碼,可以看到weather.js檔案中有大量的資料,這樣讓代碼非常的不友好。首先,這樣寫讓js檔案很亂;其次,在一開始這是key并沒有value,是後來動态擷取的。

小程式學習---子產品化程式設計

   2、提煉data

   我們将data中的資料單獨提煉出來,放在另外一個js檔案中(weather-data.js)。這裡說一下我的習慣:

1)建立檔案夾data,所有的資料檔案都定義在這裡

2)在data檔案夾下面建立目前的weather-data.js檔案

小程式學習---子產品化程式設計

3)修改weather-data.js檔案

//定義一個變量,這個變量包含了我們需要的所有的資料

var allData = {

    title: ["七天預報", "15天預報"],

    weatherData: [{

        date: "1-29",

        image: "/images/sun.png",

        state: "晴",

        temperature: "-11 ~ -1 ℃"

    },

    。。。。

    {

        date: "2-4",

        image: "/images/cloud.png",

        state: "陰",

        temperature: "-19 ~ -5 ℃"

    }]

};

 //将變量導出,名字為allData

//還是那句話,使用者看到的是“=”左邊的名字

module.exports.allData = allData

現在資料已經成功的提煉出來了,那麼記下來就要使用這些資料了

   3、setData

//使用require語句引入js檔案

//wData包含了weather-data.js中定義的所有的變量

var wData = require("../../data/weather-data.js");

    /**

     * 頁面的初始資料

     */

    data: {

     * 生命周期函數--監聽頁面加載

    onLoad: function (options) {

        //給data中新增一個key→myData,它的value是wData.allData

        //注意,由于wData中不一定是一個變量,是以用“.”方法來調用其中的某一個

        this.setData({ myData: wData.allData});

繼續閱讀