知è˜(shÃ)
ä¸ç®¡æ˜¯ç¶²(wÇŽng)站,軟件還是å°ç¨‹åºï¼Œéƒ½è¦ç›´æŽ¥æˆ–間接能為您產(chÇŽn)生價(jià )值,我們?cè)è°§éžç¬ƒæ¹Ÿæ›ˆX表ç¾(xià n)çš„åŒæ™‚(shÃ),更å´(cè)é‡äºŽåŠŸèƒ½çš„ä¾¿æ·ï¼Œç‡Ÿ(yÃng)銷的便利,é‹(yùn)營(yÃng)的高效,讓網(wÇŽng)ç«™æˆç‚ºç‡Ÿ(yÃng)銷工具,讓軟件能切實(shÃ)æå‡ä¼æ¥(yè)å…§(nèi)éƒ¨ç®¡ç†æ°´å¹³å’Œæ•ˆçŽ‡ã€‚å„ª(yÅu)秀的程åº?yà n)楹笃è°î¥?jÃ)æä¾›ä¾¿æ·çš„æ”¯æŒï¼
您當(dÄng)å‰ä½ç½®>é¦–é » æ–°èžè³‡è¨Š » å°ç¨‹åºç›¸é—œ(guÄn) >
編程日æ·å°ç¨‹åºï¼Œå°(duì)å°ç¨‹åºäº‘開發(fÄ)和生æˆåˆ†äº«æµ·å ±(bà o)的實(shÃ)è¸
發(fÄ)表時(shÃ)間:2021-2-3
發(fÄ)布人:葵宇科技
ç€è¦½æ¬¡æ•¸(shù):78
1ã€èµ·æº
朋å‹åœˆæ›¬çš„å¾ˆå¤šçš„ä¸€æœ¬æ—¥æ·æ›¸ã€Šäº†ä¸èµ·çš„程åºå“¡ 2021》,我也買了,很厚,紙質(zhì)書嘛,ç¾(xià n)在已經(jÄ«ng)å¾ˆå°‘çœ‹äº†ï¼ŒåŠ ä¸Šé€™æ˜¯ä¸€æœ¬æ—¥æ·æ›¸ï¼Œå¸Œæœ›æ˜¯æ¯å¤©éƒ½æ‰“開看。å¯å¯¦(shÃ)éš›ä¸Šçš„æƒ…æ³æ˜¯ï¼Œè¦ä¹ˆå¿˜è¨˜çœ‹ä»Šå¤©çš„å…§(nèi)容,è¦ä¹ˆä¸€å£æ°£çœ‹äº†å¥½å¹¾å¤©çš„å…§(nèi)容,然åŽå‰©ä¸‹å¹¾å¤©åˆä¸çœ‹äº†ã€‚
åŽä¾†ã€Šäº†ä¸èµ·çš„程åºå“¡ 2021》在 Github é–‹æºäº†ã€‚
äºŽæ˜¯ä¹Žï¼æˆ‘就想åšä¸€å€‹(gè)å°ç¨‹åºï¼Œå› ?yà n)æ§è¬¾C(jÄ«)æ¯å¤©æ‰“é–‹çš„é »çŽ‡å¤ªé«˜äº†ï¼Œç¢Žç‰‡æ™‚(shÃ)é–“ä¹Ÿå¾ˆå¤šï¼ŒåŠ ä¸Šå°ç¨‹åºçš„ä¸ç”¨å®‰è£ç”¨å®Œå³èµ°çš„優(yÅu)點(diÇŽn)ï¼Œä½¿ç”¨æ–¹ä¾¿ï¼Œä¸æœƒ(huì)有壓力感。
å†åŠ ä¸Šè‡ªå·±é‚„æ²’æœ‰ä¸€æ¬¾æ£å…’å…«ç¶“(jÄ«ng)çš„å°ç¨‹åºä½œå“,å°(duì)ç¾(xià n)在很ç«çš„云開發(fÄ)也沒怎么用éŽï¼Œç‰¹åˆ¥æ˜¯å°ç¨‹åºäº‘開發(fÄ),他他到底用起來爽ä¸çˆ½å‘¢ï¼Ÿï¼ˆå¾ˆçˆ½?。?/p>
于是乎ï¼é–‹å¹²ï¼
2ã€ç”¢(chÇŽn)å“è¨(shè)計(jì)
這是最傷腦ç‹çš„部分,å°ç¨‹åºåˆ°åº•è¦åšæˆä»€ä¹ˆæ¨£ï¼Œç•«å€‹(gè)原型圖?作為一個(gè)『資深ã€ç¨‹åºå“¡ï¼Œå¾žä¾†æ²’æ£ç¶“(jÄ«ng)ç•«éŽåŽŸåž‹å’Œè¨(shè)計(jì)ã€‚æ‰‹è¶³ç„¡æŽªï¼Œæ”¹ç”¨ä»€ä¹ˆå·¥å…·ï¼Ÿé›–ç„¶æˆ‘çŸ¥é“æœ‰ Sketch 這個(gè)神器,還很多在線è¨(shè)計(jì)工具,比如磨刀,但從來沒用éŽå•Šï¼Œæœ€åŽç¡¬è‘—é 皮用磨刀畫了畫原型,很簡(jiÇŽn)陋的原型,就是線框圖級(jÃ)別。
這個(gè)éŽç¨‹ä¸æ–·æœ‰æ–°çš„æƒ³æ³•,所以改來該去,產(chÇŽn)å“è¨(shè)計(jì)花了好幾天,å¸(xué)ç¿’(xÃ)怎么畫原型,實(shÃ)ç¾(xià n)è…¦å里亂七八糟的å„種想法。
在這個(gè)éŽç¨‹ä¸æˆ‘䏿–·çš„çµ¦è‡ªå·±å®¶éœ€æ±‚ï¼Œä¸€åº¦å¢žåŠ äº†ä»€ä¹ˆæ·å²ä¸Šçš„今天ã€çŸ¥ä¹Žæ—¥æ·ç‰ç‰å„種內(nèi)容,最åŽé‚„æ˜¯è¢«è‡ªå·±ç‹ å¿ƒä¸€ä¸€æ–ƒæŽ‰äº†ï¼Œåªç•™ä¸‹ç´”粹的編程日æ·å…§(nèi)容。
鑒于å°(duì)產(chÇŽn)å“å’Œè¨(shè)計(jì)䏿“…é•·(zhÇŽng),在æ¤èª (chéng)é‚€ UIã€ç”¢(chÇŽn)å“å°ä¼™ä¼´ï¼Œä¸€èµ·ç§Ÿä¸€å€‹(gè)團(tuán)隊(duì),有機(jÄ«)會(huì)一起åšä¸€äº›ç”¢(chÇŽn)å“,讓我們的想法能è½åœ°ï¼Œç”Ÿæ ¹ç™¼(fÄ)芽。
3ã€é–‹ç™¼(fÄ)
產(chÇŽn)å“è¨(shè)計(jì)階段和開發(fÄ)階段å 用的時(shÃ)間比大概是 8:2 å·¦å³ï¼Œæœ‰äº†åŽŸåž‹é–‹ç™¼(fÄ)很快,畢竟也沒什么復(fù)雜的æ±è¥¿ã€‚
下é¢é‡é»ž(diÇŽn)èªªä¸€ä¸‹åˆ†äº«æµ·å ±(bà o)功能的實(shÃ)ç¾(xià n)å§ã€‚
3.1ã€é¸æ“‡æµ·å ±(bà o)分享方案
在開發(fÄ)åˆ†äº«æµ·å ±(bà o)åŠŸèƒ½ä¹‹å‰æˆ‘也看了下網(wÇŽng)ä¸Šå¤§è‡´çš„æ–¹æ¡ˆï¼Œæœ€åŽæˆ‘鏿“‡äº†å¾®ä¿¡å°ç¨‹åºè‡ªå·±çš„æ“´(kuò)展組件:wxml-to-canvas,å°ç¨‹åºå…§(nèi)通éŽéœæ…‹(tà i)模æ¿å’Œæ¨£å¼ç¹ªåˆ¶ canvas ,導(dÇŽo)出圖片,å¯ç”¨äºŽç”Ÿæˆåˆ†äº«åœ–ç‰å ´(chÇŽng)景。
我為什么ä¸ç”¨å…¶ä»–方案:
- 手寫 canvas,太麻煩
- åŽç«¯ç”Ÿæˆå‰ç«¯ç²å–,太麻煩,我這個(gè)å°ç¨‹åºå¾ˆç°¡(jiÇŽn)單沒必è¦
- é–‹æºå°ç¨‹åºæµ·å ±(bà o)組件,嘗試éŽä¸€å€‹(gè),感覺也ä¸å¤ªå¥½ç”¨ï¼Œæœ‰äº›æ²’文檔用起來åƒåŠ›
ä¸Šåœ–ï¼Œæ˜¯é¨¾åæ˜¯é¦¬æ‹‰å‡ºä¾†é›é›ï¼Œä¸‹åœ–çš„çš„æµ·å ±(bà o)å°±æ˜¯é€šéŽ wxml-to-canvas å‹•(dòng)æ…‹(tà i)繪制的。
3.2ã€å¼•å…¥ wxml-to-canvas 組件
wxml-to-canvas çš„é™åˆ¶å¾ˆå¤šï¼Œç¬¬ä¸€æ¬¡æ²’ç¶“(jÄ«ng)é©—(yà n)的話覺得很難用,如果å†è®“我åšä¸€æ¬¡ï¼Œæˆ‘就快很多了。
官方的示例åªå–®ç´”æ•™ä½ æ€Žä¹ˆç”Ÿæˆæµ·å ±(bà o),缺ä¹ä¸Šä¸‹æ–‡å’Œæ€Žä¹ˆæ•´åˆé€²(jìn)ä½ çš„é …(xià ng)ç›®åŠé‚輯,需è¦è²»(fèi)一下腦å。
Step1. npm 安è£ï¼Œåƒè€ƒ å°ç¨‹åº npm 支æŒ
npm install --save wxml-to-canvas
復(fù)制代碼
Step2. JSON çµ„ä»¶è²æ˜Ž
{
"usingComponents": {
"wxml-to-canvas": "wxml-to-canvas"
}
}
復(fù)制代碼
Step3. wxml 引入組件
<view class="share-image-container">
<wxml-to-canvas
id="canvas"
width="{{canvasWidth}}"
height="{{canvasHeight}}"
></wxml-to-canvas>
</view>
復(fù)制代碼
3.3ã€æµ·å ±(bà o)分享é‚輯說明
點(diÇŽn)擊編程日æ·å°ç¨‹åºåº•éƒ¨çš„æµ·å ±(bà o)分享按鈕,在當(dÄng)å‰é é¢ç”Ÿæˆ canvas é (yù)覽圖,然åŽå†ç”Ÿæˆåœ–片跳轉(zhuÇŽn)åˆ°æµ·å ±(bà o)圖片é (yù)覽和ä¿å˜é é¢ã€‚
上é¢çš„ .share-image-container
類如下:
.share-image-container {
border: 1px solid red;
position: absolute;
transform: translateY(-1000%);
bottom: 0;
z-index: 0;
}
復(fù)制代碼
å³åœ¨é é¢å¤–ç”Ÿæˆ canvas,也是在這里調(dià o)試 wxml-to-canvas 組件效果的地方,去掉該類的樣å如下:
3.4ã€js ç²å–實(shÃ)例
Step4. js ç²å–實(shÃ)例
import RenderCodeToWXML from "./renderCodeWXML.js";
Page({
data: {
canvasWidth: 373,
canvasHeight: 720,
bannerImgHeight: 240,
bannerImgWdith: 320,
},
renderToCanvas() {
wx.showLoading({
title: "處ç†ä¸...",
});
this.canvas = this.selectComponent("#canvas");
const {
canvasWidth,
canvasHeight,
bannerImgWdith,
bannerImgHeight,
} = this.data;
let renderToWXML = new RenderCodeToWXML(
canvasWidth,
canvasHeight,
bannerImgWdith,
bannerImgHeight
);
const wxml = renderToWXML.renderWXML();
const style = renderToWXML.renderStyle();
const p1 = this.canvas.renderToCanvas({ wxml, style });
p1.then((res) => {
// console.log('container', res.layoutBox)
app.globalData.container = res;
this.container = res;
this.extraImage();
}).catch((err) => {
wx.hideLoading();
console.log("err", err);
});
},
extraImage() {
const p2 = this.canvas.canvasToTempFilePath();
p2.then((res) => {
wx.hideLoading();
// app.globalData.share = res
wx.navigateTo({
url: "../shareImage/shareImage",
success: function(res2) {
// 通éŽeventChannelå‘被打開é é¢?zhèn)é‰è›¿?shù)據(jù)
res2.eventChannel.emit(
"acceptDataFromOpenerPage",
{
share: res,
container: app.globalData.container,
tab: app.globalData.tab,
date: app.globalData.dateInfo.strings,
}
);
},
});
}).catch((err) => {
wx.hideLoading();
wx.showToast({
title: err,
icon: "none",
});
});
},
});
復(fù)制代碼
這里主è¦å°±æ˜¯å¾ž renderCodeWXML.js
ä¸ç²å– WXML å’Œ Style,然åŽèª¿(dià o)用 canvas çš„ renderToCanvas
方法進(jìn)行渲染:
const wxml = renderToWXML.renderWXML();
const style = renderToWXML.renderStyle();
const p1 = this.canvas.renderToCanvas({ wxml, style });
復(fù)制代碼
最åŽåœ¨ p1.then
里調(dià o)用 this.extraImage();
方法跳轉(zhuÇŽn)到下一個(gè)é é¢ï¼Œå¹¶é€šéŽ eventChannel.emit
æ–¹å¼å‚³éžåƒæ•¸(shù)。
來看看 renderCodeWXML.js
é‡Œé¢æœ‰ä»€ä¹ˆï¼š
const app = getApp();
export default class RenderDataToWXML {
constructor(
canvasWidth,
canvasHeight,
imgWidth,
imgHeight
) {
this.canvasWidth = canvasWidth;
this.canvasHeight = canvasHeight;
this.imgWidth = imgWidth;
this.imgHeight = imgHeight;
}
renderWXML() {
const { dateInfo, data, userInfo } = app.globalData;
const openId = wx.getStorageSync("openId");
let pData = http://www.wxapp-union.com/"";
let pMore = "";
let banner = "";
if (data.data.event) {
pData = http://www.wxapp-union.com/data.data.event.join("");
}
if (data.data.coding) {
pData = http://www.wxapp-union.com/data.data.coding.join("");
}
if (data.data.landmark) {
pData = http://www.wxapp-union.com/data.data.landmark.join("");
}
if (data.data.more) {
pMore = data.data.more[0];
} else if (data.data.people) {
pMore = data.data.people[0].split(":").join(",");
} else {
pMore = "";
}
if (data.data.img) {
banner = `
<view class="banner">
<image class="banner-image" mode="aspectFit" src="http://www.wxapp-union.com/${data.data.img.url}" />
</view>`;
}
if (pData.length >= 156) {
pData = http://www.wxapp-union.com/pData.substring(0, 152) + "...";
}
if (pMore.length >= 50) {
pMore = pMore.substring(0, 48) + "...";
}
let avatar = "";
if (userInfo && userInfo.avatarUrl) {
avatar = `<view class="avatar">
<image class="avatar-image" src="http://www.wxapp-union.com/${userInfo.avatarUrl}" />
<text class="avatar-nikename">${userInfo.nickName}邀請(qÇng)ä½ ä½¿ç”¨</text>
</view>`;
}
let wxmlMore = pMore;
if (wxmlMore) {
wxmlMore = `
<view>
<text class="p-more">${pMore}</text>
</view>
`;
}
const wxml = `
<view class="container">
<view class="top">
<view class="top-left">
<view><text class="en">${dateInfo.date.monthEN}</text></view>
<view><text class="cn">${dateInfo.lunarDate}</text></view>
</view>
<view><text class="top-center">${dateInfo.date.day}</text></view>
<view class="top-right">
<view><text class="en">${dateInfo.date.weekEN}</text></view>
<view><text class="cn">${dateInfo.date.weekCN}</text></view>
</view>
</view>
${banner}
<view class="middle">
<view>
<text class="p-data">${pData}</text>
</view>
${wxmlMore}
</view>
<view class="qrcode">
<view class="appinfo">
${avatar}
<view><text class="appname">編程日æ·</text></view>
<view><text class="appdesc">程åºå“¡å°ˆå±¬æ—¥æ·ï¼Œæœ€æ¥µå®¢æ—¥æ·</text></view>
</view>
<view class="qrcode-image">
<image class="image" mode="aspectFit" src="https://7072-programming-calendar-3b8b7a7d082-1304448256.tcb.qcloud.la/qr/${openId}-qr.png?sign=b5a610dc6ae15c9427720ab617a2f18a&t=1609438339" />
</view>
</view>
</view>
`;
return wxml;
}
// canvas樣å¼
renderStyle() {
const contentWidth = this.canvasWidth - 50;
const mainColor = "#1296db";
const style = {
container: {
width: this.canvasWidth,
height: this.canvasHeight,
backgroundColor: "#fff",
},
top: {
width: this.canvasWidth,
height: 82,
backgroundColor: mainColor,
flexDirection: "row",
justifyContent: "space-around",
alignItems: "center",
},
topLeft: {
width: this.canvasWidth / 3,
height: 82,
textAlign: "center",
alignItems: "center",
},
topCenter: {
width: this.canvasWidth / 3,
height: 82,
lineHeight: 82,
fontSize: 72,
textAlign: "center",
color: "#ffffff",
},
topRight: {
width: this.canvasWidth / 3,
height: 82,
},
en: {
width: this.canvasWidth / 3,
height: 30,
fontSize: 20,
textAlign: "center",
color: "#ffffff",
marginTop: 15,
},
cn: {
width: this.canvasWidth / 3,
height: 30,
textAlign: "center",
color: "#ffffff",
},
banner: {
width: this.canvasWidth,
flexDirection: "row",
justifyContent: "center",
marginTop: 20,
},
bannerImage: {
width: this.imgWidth,
height: this.imgHeight,
},
middle: {
flexDirection: "column",
justifyContent: "center",
alignItems: "center",
marginTop: 20,
},
pData: {
width: contentWidth,
height: 170,
lineHeight: "1.8em",
},
pMore: {
width: contentWidth,
height: 60,
lineHeight: "1.8em",
},
qrcode: {
height: 130,
flexDirection: "row",
justifyContent: "space-between",
backgroundColor: "#CCE6FF",
paddingLeft: 20,
paddingTop: 20,
},
qrcodeImage: {
width: 90,
height: 90,
marginRight: 20,
borderRadius: 45,
flexDirection: "row",
justifyContent: "center",
alignItems: "center",
backgroundColor: "#fff",
},
image: {
width: 90,
height: 90,
scale: 0.9,
borderRadius: 45,
},
appinfo: {
flexDirection: "column",
justifyContent: "flex-start",
alignItems: "flex-start",
height: 80,
},
avatar: {
flexDirection: "row",
justifyContent: "flex-start",
width: this.canvasWidth / 1.8,
height: 30,
},
avatarImage: {
width: 30,
height: 30,
borderRadius: 15,
marginRight: 5,
},
avatarNikename: {
width: this.canvasWidth / 1.8,
height: 22,
lineHeight: 22,
marginTop: 5,
},
appname: {
width: this.canvasWidth / 2,
height: 23,
fontSize: 16,
color: "#0081FF",
marginTop: 8,
marginLeft: 35,
},
appdesc: {
width: this.canvasWidth / 2,
height: 20,
fontSize: 14,
marginLeft: 35,
},
};
return style;
}
// çœç•¥ä¸ç›¸é—œ(guÄn)代碼
}
復(fù)制代碼
è©²æ–‡ä»¶å°±æ˜¯æˆ‘å€‘ç•«æµ·å ±(bà o)çš„åœ°æ–¹ï¼Œå°±æ˜¯ç”Ÿæˆ WXML å’Œ Style ç„¶åŽå°Ž(dÇŽo)出 。
3.5ã€wxml-to-canvas 組件的注æ„äº‹é …(xià ng)
wxml-to-canvas 組件å°(duì) wxml æ¨¡æ¿æ”¯æŒæœ‰é™ :
- 支æŒ
<view>
ã€<text>
ã€<image>
三種標(biÄo)簽,通éŽclass
匹é…style
å°(duì)象ä¸çš„æ¨£å¼ã€‚ - æ–‡å—å¿…é ˆç”¨
<text>
標(biÄo)簽包å«ï¼Œå¦å‰‡ä¸é¡¯ç¤ºã€‚å¹¶ä¸”å¿…é ˆè¨(shè)置寬高。文å—å¯¬åº¦å¿…é ˆå…ˆç¢ºå®šï¼Œè¶…å‡ºå‰‡æœƒ(huì)自動(dòng)截?cái)?。所以?dòng)æ…‹(tà i)æ–‡å—å¯ä»¥æ ¹æ“š(jù)å—?jÇn)?shù),動(dòng)æ…‹(tà i)è¨(shè)置寬度。
æ¨£å¼æ–¹é¢ï¼š
- å°(duì)象屬性值為å°(duì)應(yÄ«ng) wxml 標(biÄo)簽的 cass é§å³°å½¢å¼ã€‚需為æ¯å€‹(gè)å…ƒç´ æŒ‡å®š width å’Œ height 屬性,å¦å‰‡æœƒ(huì)å°Ž(dÇŽo)致布局錯(cuò)誤。
- å˜åœ¨å¤šå€‹(gè) className 時(shÃ),ä½ç½®é åŽçš„優(yÅu)先級(jÃ)更高,åå…ƒç´ æœƒ(huì)繼承父級(jÃ)å…ƒç´ çš„å¯ç¹¼æ‰¿å±¬æ€§ã€‚
- å…ƒç´ å‡ç‚º flex 布局。left/top ç‰ åƒ…åœ¨ absolute 定ä½ä¸‹ç”Ÿæ•ˆã€‚
å› ?yà n)槲淖直仨氂?<text>
標(biÄo)簽包å«ï¼Œå¹¶ä¸”å¿…é ˆè¨(shè)置寬高,文å—å¯¬åº¦å¿…é ˆå…ˆç¢ºå®šï¼Œè¶…å‡ºå‰‡æœƒ(huì)自動(dòng)截?cái)?。所以?dòng)æ…‹(tà i)æ–‡å—å¯ä»¥æ ¹æ“š(jù)å—?jÇn)?shù),動(dòng)æ…‹(tà i)è¨(shè)置寬度。所以寫布局éžå¸¸éº»ç…©ï¼Œæˆ‘推薦大家為æ¯ä¸€å€‹(gè)å…ƒç´ è¨(shè)置背景,這樣å¯ä»¥çœ‹åˆ°å…ƒç´ 渲染的范åœå’Œå¯¬é«˜ã€‚如下所示:
borderColor/marginBottom/marginTop
å¯ä½¿ç”¨ï¼Œé›–ç„¶å¾®ä¿¡æ–‡æª”ä¸æ²’寫。
3.6ã€æµ·å ±(bà o)é (yù)覽和下載é é¢
ç”Ÿæˆ canvas 并調(dià o)用接å£ç”Ÿæˆåœ–片åŽï¼Œæˆ‘å€‘æ”œå¸¶åƒæ•¸(shù)跳轉(zhuÇŽn)到下一個(gè)é é¢ï¼Œå…ˆä¾†çœ‹çœ‹ WXML,éžå¸¸ç°¡(jiÇŽn)單:
<view>
<view class="share-container">
<image
src="{{src}}"
mode="widthFix"
class="image"
style="height: {{height}}px;"
></image>
</view>
<view class="save-button">
<van-button
bind:tap="saveImage"
block
round
icon="down"
size="large"
type="info"
>ä¿å˜åˆ°æ‰‹æ©Ÿ(jÄ«)</van-button
>
</view>
</view>
復(fù)制代碼
js é‚輯
const app = getApp();
Page({
data: {
src: "",
date: "",
width: "",
height: "",
},
onLoad() {
const eventChannel = this.getOpenerEventChannel();
eventChannel.on("acceptDataFromOpenerPage", (data) => {
// console.log("data", data)
this.setData({
showPopup: true,
date: data.date,
src: data.share.tempFilePath,
width: data.container.layoutBox.width,
height: data.container.layoutBox.height,
});
});
},
getDatestr() {
const { strings } = app.globalData.dateInfo;
return strings;
},
saveImage() {
wx.showLoading({
title: "處ç†ä¸...",
});
const _this = this;
wx.getSetting({
success(res) {
if (!res.authSetting["scope.writePhotosAlbum"]) {
wx.authorize({
scope: "scope.writePhotosAlbum",
success() {
_this.save();
},
fail() {
wx.showToast({
title: "授權(quán)失敗",
icon: "none",
});
},
});
} else {
_this.save();
}
},
});
},
save() {
wx.saveImageToPhotosAlbum({
filePath: this.data.src,
success() {
wx.showToast({
title: "ä¿å˜æˆåŠŸ",
icon: "none",
});
},
fail() {
wx.showToast({
title: "ä¿å˜å¤±æ•—",
icon: "none",
});
},
});
},
});
復(fù)制代碼
以上就是我開發(fÄ)æµ·å ±(bà o)功能的é‚輯和代碼,僅供åƒè€ƒå§ï¼Œå¦‚æžœä½ æœ‰ç›¸é—œ(guÄn)ç¶“(jÄ«ng)é©—(yà n)æ¡è¿Žè¨Žè«–交æµï¼Œç•™ä¸‹ä½ 的真知ç¼è¦‹å§ã€‚
4ã€ç·¨ç¨‹æ—¥æ·å°ç¨‹åºé 颿ˆªåœ–
最åŽï¼Œåˆ†å¹¾å¼µå°ç¨‹åºçš„é 颿ˆªåœ–
é (yù)覽 | é (yù)覽 |
---|---|
5ã€åŽçºŒ(xù)è¿ä»£è¨ˆ(jì)劃
å¢žåŠ ç”¨æˆ¶ç‰ç´š(jÃ)計(jì)劃ã€å°(duì)應(yÄ«ng)ç‰ç´š(jÃ)å¯ä»¥æ›ä¸€äº›ç¦®ç‰©ï¼Œå…¶ä½™çš„ã€‚ã€‚ã€‚ä½ æœ‰ä»€ä¹ˆæƒ³æ³•ï¼Ÿæ¡è¿Žäº¤æµï¼
作者:æå·žç¨‹åºå“¡å¼µå¼µ
來æºï¼šæŽ˜é‡‘
著作權(quán)æ¸ä½œè€…所有。商æ¥(yè)轉(zhuÇŽn)載請(qÇng)è¯(lián)系作者ç²å¾—授權(quán),éžå•†æ¥(yè)轉(zhuÇŽn)載請(qÇng)注明出處。
相關(guÄn)案例查看更多
相關(guÄn)閱讀
- 云å—å°ç¨‹åºé–‹ç™¼(fÄ)è²»(fèi)用
- ç¶²(wÇŽng)站建è¨(shè)å…¬å¸å“ªå®¶å¥½
- ç¶²(wÇŽng)站建è¨(shè)方法
- 云å—建è¨(shè)廳官方網(wÇŽng)ç«™
- ç¶²(wÇŽng)站建è¨(shè)å…¬å¸åœ°å€
- å ±(bà o)廢車拆解回收管ç†ç³»çµ±(tÇ’ng)
- 云å—ç¶²(wÇŽng)站制作哪家好
- è²´å·žå°ç¨‹åºé–‹ç™¼(fÄ)
- å°ç¨‹åºè¡¨å–®
- webå¸(xué)ç¿’(xÃ)路線
- 軟件定制公å¸
- 電商網(wÇŽng)站建è¨(shè)
- 云å—建站公å¸
- äº‘å—æ—…游網(wÇŽng)站建è¨(shè)
- flex
- 跳轉(zhuÇŽn)å°ç¨‹åº
- 云å—å°ç¨‹åºè¢«é¨™
- webæœå‹™(wù)
- 微分銷
- 釿…¶ç¶²(wÇŽng)站建è¨(shè)å…¬å¸
- ç¶²(wÇŽng)站建è¨(shè)優(yÅu)化
- æ±½è»Šå ±(bà o)廢管ç†
- 百度自然排å
- 云å—å°ç¨‹åºé–‹ç™¼(fÄ)å ±(bà o)價(jià )
- ç¶²(wÇŽng)站開發(fÄ)å…¬å¸å“ªå®¶å¥½
- æ£è¦(guÄ«)ç¶²(wÇŽng)站建è¨(shè)å…¬å¸
- vue開發(fÄ)å°ç¨‹åº
- 云å—çœåŸŽé„‰(xiÄng)建è¨(shè)廳網(wÇŽng)ç«™
- ç¶²(wÇŽng)站優(yÅu)化哪家好
- 云å—å°ç¨‹åºä»£å»º