国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
ES6和commonJS的選擇
單一頁(yè)面模組化
首頁(yè) 微信小程式 小程式開發(fā) 淺析小程式中如何優(yōu)雅地進(jìn)行模組化處理?

淺析小程式中如何優(yōu)雅地進(jìn)行模組化處理?

Dec 29, 2021 am 10:21 AM
小程式

小程式中如何優(yōu)雅地進(jìn)行模組化處理?本篇文章就來手把手教大家如何優(yōu)雅的在小程式中進(jìn)行模組化,希望對(duì)大家有幫助!

淺析小程式中如何優(yōu)雅地進(jìn)行模組化處理?

這篇文章就講講在微信小程式中如何優(yōu)雅地進(jìn)行模組化處理。透過最近的一些開發(fā)經(jīng)驗(yàn)進(jìn)行濃縮總結(jié),探索一些可以提升微信小程式開發(fā)效率和降低心智負(fù)擔(dān)的方法。

ES6和commonJS的選擇

首先在微信小程式中不論是ES6 或是commonJS 模組化語(yǔ)法都是支援的,在傳統(tǒng)的web專案中我個(gè)人是習(xí)慣統(tǒng)一使用ES6 模組化語(yǔ)法進(jìn)行開發(fā)的。

在最初我也是將小程式中所有的通用方法抽離成單獨(dú)的文件,並使用exportexport default 匯出,使用import 引入。

注意點(diǎn)

但是!在實(shí)際開發(fā)中,小程式的js檔案是不支援絕對(duì)路徑引入的!這意味著如果你需要在你的頁(yè)面中引入一個(gè)公用方法,你必須使用../../../xxx/xxx.js 的方式,當(dāng)你在同一個(gè)頁(yè)面引入多個(gè)模組時(shí),這種寫法絕對(duì)會(huì)極大的打擊你的開發(fā)熱情。

解決方式

那我們?cè)撊绾谓鉀Q這麼長(zhǎng)的引入路徑呢,在web專案中,我們常常會(huì)使用路徑別名的方式,例如webpackvite 中的resolve.alias 來縮短引入的路徑。

alias: {"@src":path.resolve("src"),

但是在原生微信小程式中,雖然可以透過gulpwebpack 等一些前端工程化的工具對(duì)小程式進(jìn)行一些改造,但是作為一個(gè)開源專案我希望它的啟動(dòng)過程不需要太多額外配置。最好是能夠使用原生的語(yǔ)法去實(shí)作。

最後我選擇了在app.js中新增一個(gè)require方法用於引入模組,這樣在頁(yè)面內(nèi)引入模組時(shí),我們只需要使用app的實(shí)例來進(jìn)行模組引入,這樣可以實(shí)作使用與app.js檔案的相對(duì)路徑來引入檔案.

// app.js
App({
    require(path){
        return path
    }
})

使用方式

// 使用基于app.js的相對(duì)路徑來引入文件,這樣就避免了寫很多"../"
const app = getApp()
const upload = app.require("lib/upload")

當(dāng)然這樣做也不是特別方便,首先是程式碼提示的不健全,使用以上方式的話可能對(duì)於參數(shù)或一些傳回值的提示不到位,但是影響不大。如果之後我摸索出了其他比較好的實(shí)作方式再寫一篇文章解析。其次是必須使用全域統(tǒng)一使用commonJS 的模組化語(yǔ)法啦,不過這一點(diǎn)的話問題不大。

單一頁(yè)面模組化

小程式中並沒有提供特殊的模組化方式,比較常用的就是將一些方法抽離為單獨(dú)的js文件,然後再引入。想要避免一個(gè)頁(yè)面檔案程式碼太長(zhǎng)的話最好的方式是元件化,但是在小程式中,認(rèn)為寫入元件真的是一件很不爽的事情。

小程式元件擁有自己的生命週期,而且引入時(shí)必須在頁(yè)面json中提前定義,由於元件是掛在shadow root節(jié)點(diǎn)上,如果想要和頁(yè)面共享樣式例如colorUI的全域樣式也需要寫入單獨(dú)的設(shè)定項(xiàng)styleIsolation。整體開發(fā)體驗(yàn)相比vue而言比較割裂。

基於以上的一些個(gè)人看法,我在寫小程式時(shí)比較少使用元件,如果是需要抽離wxml或是js我通常使用以下的方法。

wxml模組化

在小程式中我通常使用模板template 進(jìn)行抽離復(fù)用,微信小程式範(fàn)本文件 ,範(fàn)本相較於元件抽離的只是部分的頁(yè)面,不包含功能部分的抽離。

以下是我抽離的一個(gè)模板,這是一個(gè)文章的列表項(xiàng),它並沒有什麼單獨(dú)的功能,但是代碼很長(zhǎng)並且卻在很多頁(yè)面中復(fù)用到,於是我將它進(jìn)行了一個(gè)抽離。把樣式都用行內(nèi)樣式的方式寫上,這樣在哪裡引入都是一樣的樣式。

<!-- 文章列表項(xiàng) -->
<import src=&#39;./avatar&#39; />
<template name="post-item">
<view class="margin padding-sm bg-white radius flex shadow " style="position: relative;height: 350rpx;border-radius: 10rpx;">
        <!-- 背景蒙版 -->
        <view style="position: absolute;top: 0;left: 0;width: 100%;height: 100%;border-radius: 10rpx;">
                <image style="filter:blur(2px) grayscale(80%) opacity(80%)" lazy-load="{{true}}" src="{{imgList[0]}}" mode="aspectFill"></image>
        </view>
        <view style="position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(30, 30, 30, 0.8);border-radius: 10rpx;">
        </view>

        <view style="z-index: 10;width: 100%;" class="text-white">
                <!-- 文章標(biāo)題 -->
                <view class="text-xl  ">
                        <text class="cu-tag margin-right-sm bg-color radius">{{topic}}</text>
                        <text class="text-bold">{{title}}</text>
                </view>
                <!-- 文章內(nèi)容 -->
                <view class="margin-top-xs text-sm text-cut">{{content}}</view>

                <view class="flex align-end justify-between margin-top">
                        <!-- 文章圖片 -->
                        <view class="flex align-center">
                                <view class="margin-xs" style="width: 120rpx;height: 120rpx;" wx:for="{{imgList}}" wx:key="{{index}}" wx:if="{{index < 3}}">
                                        <image class="radius" src="{{item}}" mode="aspectFill"></image>
                                </view>
                        </view>

                        <!-- 瀏覽量-點(diǎn)贊數(shù) -->
                        <view class="bg-color flex align-center text-white text-sm radius" style="padding: 4px 12px;">
                                <view class="cuIcon-attention "></view>
                                <view class="margin-left-xs">{{viewNum||0}}</view>
                                <view class="cuIcon-like margin-left"></view>
                                <view class="margin-left-xs">{{favorNum||0}}</view>
                        </view>
                </view>

                <!-- 發(fā)布時(shí)間 -->
                <view class="margin-top-xs flex align-center text-sm text-gray justify-between padding-lr-xs">
                        <view class="flex align-center">
                                <template is="avatar" data="{{size:45,avatarUrl:user.avatarUrl}}" />
                                <view class="margin-left-xs">{{user.nickName}}</view>
                        </view>

                        <view>{{createTime}}</view>
                </view>
        </view>

</view>
</template>

在頁(yè)面中使用的時(shí)候需要提前引入,由於可以引入多個(gè)模板,因此使用時(shí)需要使用is屬性 聲明使用的是哪一個(gè)template,數(shù)據(jù)的話可以通過data屬性傳入,這裡的範(fàn)例是我將遍歷的item解構(gòu)後再賦值進(jìn)去。

<!-- 某個(gè)頁(yè)面 -->
<import src=&#39;../../template/post-item&#39; />

<template data="{{...item}}" is="post-item" />

當(dāng)然使用template進(jìn)行模組化進(jìn)行抽離的模板程式碼可不能包涵太多的功能邏輯,具體的使用還是需要根據(jù)業(yè)務(wù)來噢。

js模組化

#

在小程序中最基本的js模塊化就是直接抽離js文件,例如一些全局通用的方法,下面展示一個(gè)全局上傳方法的封裝

// lib/upload.js
// 上傳方法
module.exports = async function upload(path) {
	return await wx.cloud.uploadFile({
		cloudPath: new Date().getTime() + path.substring(path.lastIndexOf(".")),
		filePath: path,
	})
}
// pages/form/form.js
const app = getApp()
const upload = app.require("lib/upload")
Page({
async submit() {
    wx.showLoading({
            mask: true,
            title: "發(fā)布中"
    })
    const imgList = []
    for (let img of this.data.form.imgList) {
            const uploadRes = await upload(img)
            imgList.push(uploadRes.fileID)
    }
    // ...其他業(yè)務(wù)代碼
    }
})

當(dāng)然以上的辦法對(duì)于通用方法來說很方便,但是對(duì)于與 頁(yè)面操作的邏輯耦合性 很高的一些業(yè)務(wù)代碼,這樣子抽離并不方便。

在vue2中我們可以使用mixin的方法模塊化代碼,在vue3中我們可以使用hook的方式模塊化代碼,但是在小程序中并沒有以上兩者的支持,最初我想仿照 vue3的hook 方式進(jìn)行頁(yè)面js封裝改造,但最終實(shí)現(xiàn)的效果不理想,于是選擇了實(shí)現(xiàn)一個(gè)模仿vue2 mixin 的方法來實(shí)現(xiàn)模塊化。

具體代碼其他博主有實(shí)現(xiàn)過,因此我就直接拿來使用了,具體代碼如下。如果不了解vue中mixin的使用方法的可以自行去官網(wǎng)看文檔,這里不做過多介紹。

// mixin.js
// 保存原生的 Page 函數(shù)
const originPage = Page
// 定義小程序內(nèi)置的屬性/方法
const prop = [&#39;data&#39;, &#39;properties&#39;, &#39;options&#39;]
const methods = [&#39;onLoad&#39;, &#39;onReady&#39;, &#39;onShow&#39;, &#39;onHide&#39;, &#39;onUnload&#39;, &#39;onPullDownRefresh&#39;, &#39;onReachBottom&#39;, &#39;onShareAppMessage&#39;, &#39;onPageScroll&#39;, &#39;onTabItemTap&#39;]

Page = (options) => {
  if (Array.isArray(options.mixins)) {
    const mixins = options.mixins
    delete options.mixins
    mixins.forEach((mixin) => {
      for (let [key, value] of Object.entries(mixin)) {
        if (prop.includes(key)) {
          // 混入屬性
          options[key] = {
            ...value,
            ...options[key]
          }
        } else if (methods.includes(key)) {
          // 混入原生方法
          const originFunc = options[key]
          options[key] = function (...args) {
            value.call(this, ...args)
            return originFunc && originFunc.call(this, ...args)
          }
        } else {
          // 混入普通方法
          options = {
            ...mixin,
            ...options
          }
        }
      }
    })
  }
  originPage(options)
}

實(shí)現(xiàn)的原理是改造小程序中的Page()函數(shù),小程序的每一個(gè)頁(yè)面都是通過調(diào)用Page({option})方法來實(shí)現(xiàn)的,在option參數(shù)中傳入頁(yè)面相關(guān)的data和聲明周期函數(shù)及其他方法。

我們通過在Page方法的參數(shù)option中增加一個(gè)mixin屬性,這個(gè)屬性可以傳入一個(gè)數(shù)組,數(shù)組即是每一個(gè)要混入的模塊,每一個(gè)模塊的結(jié)構(gòu)其實(shí)與參數(shù)option是一樣的,我們只需要將所有混入的模塊與頁(yè)面自身的option進(jìn)行一個(gè)參數(shù)和方法的合并就能實(shí)現(xiàn)一個(gè)mixin的功能。

使用的方法是現(xiàn)在app.js中引入mixin.js

// app.js
require("./mixins.js")
App({
// ...其他代碼
})

然后我們寫一個(gè)常規(guī)頁(yè)面的js,業(yè)務(wù)代碼大家不用看,主要關(guān)注Page的屬性中多了一個(gè)mixins選項(xiàng),而mixins數(shù)組中有一個(gè)topic模塊。

// pages/form/form.js
const app = getApp()
const upload = app.require("lib/upload")
const to = app.require("lib/awaitTo")
const db = wx.cloud.database()
Page({
	mixins: [require("./mixins/topic")],
	data: {
		user: wx.getStorageSync(&#39;user&#39;),
		form: {
			title: "",
			topic: "",
			content: "",
			imgList: []
		}
	},
	chooseImg() {
		wx.chooseImage({
			count: 9 - this.data.form.imgList.length,
			sizeType: [&#39;original&#39;], //可以指定是原圖還是壓縮圖,默認(rèn)二者都有
			sourceType: [&#39;album&#39;, &#39;camera&#39;], //從相冊(cè)選擇
			success: (res) => {
				res.tempFilePaths = res.tempFilePaths
				if (this.data.form.imgList.length != 0) {
					this.setData({ "form.imgList": this.data.form.imgList.concat(res.tempFilePaths) })
				} else {
					this.setData({ "form.imgList": res.tempFilePaths })
				}
			}
		});
	},
	async delImg(e) {
		const index = e.currentTarget.dataset.index
		const temp = this.data.form.imgList
		temp.splice(index, 1)
		this.setData({ "form.imgList": temp })
	}
})

由于 topic 內(nèi)都是關(guān)聯(lián)性較強(qiáng)的屬性與方法,因此就可以抽離出來,這樣頁(yè)面的js就會(huì)更加精簡(jiǎn)啦,如果有更多的代碼就根據(jù)自己對(duì)于功能的判斷進(jìn)行抽離,然后放在頁(yè)面對(duì)于mixin目錄中即可!

// // pages/form/mixin/topic.js
const db = wx.cloud.database()
module.exports =  {
    data:{
        topic:{
            flag:false,
            list:[]
        },
    },
    onLoad(options) {
		this.getTopic()
    },
    async getTopic(){
		const res = await db.collection("topic").get()
		this.setData({"topic.list":res.data})
	},
	
	clearTopic(){
		this.setData({"form.topic":""})
	},
	toggleTopic(e){
        console.log(e.currentTarget.dataset)
		const flag = e.currentTarget.dataset.flag
		this.setData({"topic.flag":flag})
	},
}

注意點(diǎn)

但是使用mixin也有著與vue中同樣的問題就是變量及方法的來源不好追溯,變量是在那個(gè)位置定義的比較難以定位,這時(shí)就更加依賴開發(fā)者的開發(fā)規(guī)范以及命名方式了,再不濟(jì)也可以每一個(gè)方法寫一個(gè)獨(dú)有的注釋嘛~

【相關(guān)學(xué)習(xí)推薦:小程序開發(fā)教程

以上是淺析小程式中如何優(yōu)雅地進(jìn)行模組化處理?的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
使用Python開發(fā)微信小程式 使用Python開發(fā)微信小程式 Jun 17, 2023 pm 06:34 PM

隨著行動(dòng)互聯(lián)網(wǎng)技術(shù)和智慧型手機(jī)的普及,微信成為了人們生活中不可或缺的一個(gè)應(yīng)用。而微信小程式則讓人們可以在不需要下載安裝應(yīng)用程式的情況下,直接使用小程式來解決一些簡(jiǎn)單的需求。本文將介紹如何使用Python來開發(fā)微信小程式。一、準(zhǔn)備工作在使用Python開發(fā)微信小程式之前,需要先安裝相關(guān)的Python函式庫(kù)。這裡推薦使用wxpy和itchat這兩個(gè)函式庫(kù)。 wxpy是一個(gè)微信機(jī)器

實(shí)作微信小程式中的卡片翻轉(zhuǎn)特效 實(shí)作微信小程式中的卡片翻轉(zhuǎn)特效 Nov 21, 2023 am 10:55 AM

實(shí)作微信小程式中的卡片翻轉(zhuǎn)特效在微信小程式中,實(shí)現(xiàn)卡片翻轉(zhuǎn)特效是一種常見的動(dòng)畫效果,可以提升使用者體驗(yàn)和介面互動(dòng)的吸引力。以下將具體介紹如何在微信小程式中實(shí)現(xiàn)卡片翻轉(zhuǎn)的特效,並提供相關(guān)程式碼範(fàn)例。首先,需要在小程式的頁(yè)面佈局檔案中定義兩個(gè)卡片元素,一個(gè)用於顯示正面內(nèi)容,一個(gè)用於顯示背面內(nèi)容,具體範(fàn)例程式碼如下:&lt;!--index.wxml--&gt;&l

支付寶上線「漢字拾光-生僻字」小程序,用於徵集、補(bǔ)充生僻字庫(kù) 支付寶上線「漢字拾光-生僻字」小程序,用於徵集、補(bǔ)充生僻字庫(kù) Oct 31, 2023 pm 09:25 PM

本站10月31日消息,今年5月27日,螞蟻集團(tuán)宣布啟動(dòng)“漢字拾光計(jì)劃”,最近又迎來新進(jìn)展:支付寶上線“漢字拾光-生僻字”小程序,用於向社會(huì)徵集生僻字,補(bǔ)充生僻字庫(kù),同時(shí)提供不同的生僻字輸入體驗(yàn),以幫助完善支付寶內(nèi)的生僻字輸入方法。目前,用戶搜尋「漢字拾光」、「生僻字」等關(guān)鍵字就可以進(jìn)入「生僻字」小程式。在小程式裡,使用者可以提交尚未被系統(tǒng)辨識(shí)輸入的生僻字圖片,支付寶工程師確認(rèn)後,將會(huì)對(duì)字庫(kù)進(jìn)行補(bǔ)錄入。本站注意到,使用者也可以在小程式體驗(yàn)最新的拆字輸入法,這項(xiàng)輸入法針對(duì)讀音不明確的生僻字設(shè)計(jì)。用戶拆

小程式能用react嗎 小程式能用react嗎 Dec 29, 2022 am 11:06 AM

小程式能用react,其使用方法:1、基於「react-reconciler」實(shí)作一個(gè)渲染器,產(chǎn)生一個(gè)DSL;2、建立一個(gè)小程式元件,去解析和渲染DSL;3、安裝npm,並執(zhí)行開發(fā)者工具中的建構(gòu)npm;4、在自己的頁(yè)面中引入包,再利用api即可完成開發(fā)。

uniapp如何實(shí)現(xiàn)小程式和H5的快速轉(zhuǎn)換 uniapp如何實(shí)現(xiàn)小程式和H5的快速轉(zhuǎn)換 Oct 20, 2023 pm 02:12 PM

uniapp如何實(shí)現(xiàn)小程式和H5的快速轉(zhuǎn)換,需要具體程式碼範(fàn)例近年來,隨著行動(dòng)網(wǎng)路的發(fā)展和智慧型手機(jī)的普及,小程式和H5成為了不可或缺的應(yīng)用形式。而uniapp作為一個(gè)跨平臺(tái)的開發(fā)框架,可以在一套程式碼的基礎(chǔ)上,快速實(shí)現(xiàn)小程式和H5的轉(zhuǎn)換,大大提高了開發(fā)效率。本文將介紹uniapp如何實(shí)現(xiàn)小程式和H5的快速轉(zhuǎn)換,並給出具體的程式碼範(fàn)例。一、uniapp簡(jiǎn)介unia

教你如何在小程式中用公眾號(hào)範(fàn)本訊息(附詳細(xì)想法) 教你如何在小程式中用公眾號(hào)範(fàn)本訊息(附詳細(xì)想法) Nov 04, 2022 pm 04:53 PM

這篇文章給大家?guī)砹岁P(guān)於微信小程式的相關(guān)問題,其中主要介紹瞭如何在小程式中用公眾號(hào)範(fàn)本訊息,下面一起來看一下,希望對(duì)大家有幫助。

用Python編寫簡(jiǎn)單的聊天程式教程 用Python編寫簡(jiǎn)單的聊天程式教程 May 08, 2023 pm 06:37 PM

實(shí)現(xiàn)思路x01服務(wù)端的建立首先,在服務(wù)端,使用socket進(jìn)行訊息的接受,每接受一個(gè)socket的請(qǐng)求,就開啟一個(gè)新的線程來管理訊息的分發(fā)與接受,同時(shí),又存在一個(gè)handler來管理所有的線程,從而實(shí)現(xiàn)對(duì)聊天室的各種功能的處理x02客戶端的建立客戶端的建立就要比服務(wù)端簡(jiǎn)單多了,客戶端的作用只是對(duì)消息的發(fā)送以及接受,以及按照特定的規(guī)則去輸入特定的字符從而實(shí)現(xiàn)不同的功能的使用,因此,在客戶端這裡,只需要去使用兩個(gè)線程,一個(gè)是專門用於接受消息,一個(gè)是專門用於發(fā)送消息的至於為什麼不用一個(gè)呢,那是因?yàn)?只

PHP與小程式的地理位置定位與地圖顯示 PHP與小程式的地理位置定位與地圖顯示 Jul 04, 2023 pm 04:01 PM

PHP與小程式的地理位置定位與地圖顯示地理位置定位與地圖顯示在現(xiàn)代科技中已經(jīng)成為了必備的功能之一。隨著行動(dòng)裝置的普及,人們對(duì)於定位和地圖顯示的需求也越來越高。在開發(fā)過程中,PHP和小程式是常見的兩種技術(shù)選擇。本文將為大家介紹PHP與小程式中的地理位置定位與地圖顯示的實(shí)作方法,並附上對(duì)應(yīng)的程式碼範(fàn)例。一、PHP中的地理位置定位在PHP中,我們可以使用第三方地理位

See all articles