隻要是做過程式設計的童鞋都知道子產品化的思想,這樣寫出的代碼更加簡潔明了。子產品化的代碼讓你的思路更加清晰,有利于目前程式設計,同時還有利于後期的維護。另外,很多有公共作用的代碼,理所應當的提煉出來,以提高代碼使用率。很多時候一個子產品不僅适用于目前的項目,其他項目中同樣可以使用的。
一、檔案的作用域
點選(此處)折疊或打開
// 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,是後來動态擷取的。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuI2YkVTO4gjYllTOwgzM3UDOjNDMyY2N5UzYwEmZ5U2MfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
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});