一杯茶的时间,上手 Taro 京东小程序开发
我們研發(fā)開源了一款基于 Git 進行技術(shù)實戰(zhàn)教程寫作的工具,我們圖雀社區(qū)的所有教程都是用這款工具寫作而成,歡迎 Star 哦
如果你想快速了解如何使用,歡迎閱讀我們的 教程文檔 哦
本文由圖雀社區(qū)成員 pftom 寫作而成,歡迎加入圖雀社區(qū),一起創(chuàng)作精彩的免費技術(shù)教程,予力編程行業(yè)發(fā)展。
如果您覺得我們寫得還不錯,記得 點贊 + 關(guān)注 + 評論 三連,鼓勵我們寫出更好的教程💪
小程序世界紛爭不斷,巨型 App 都在紛紛構(gòu)建自己的小程序流量入口,希望在造福商家、用戶的同時,也能鞏固自家流量壁壘,我們已經(jīng)熟知了微信小程序、支付寶小程序,我們可能還知道已經(jīng)有了頭條小程序,QQ 輕應(yīng)用等,今天為大家?guī)淼氖且豢钚滦托〕绦?#xff0c;是由電商巨頭京東即將發(fā)布的一款小程序,電商巨頭的小程序又會為中國互聯(lián)網(wǎng)帶來怎么樣的改變了?讓我們拭目以待吧!而我們今天將帶大家使用 Taro 來編寫京東小程序,并完成可以發(fā)文章的的多頁面博客小程序。
初始化項目代碼
我們將使用同屬于京東凹凸實驗室團隊研發(fā)開源的多端統(tǒng)一開發(fā)解決方案 – Taro 來開發(fā)我們的京東小程序。首先我們來看一看最后的完成效果:
準(zhǔn)備環(huán)境
手動初始化項目
確保你安裝了 Node 開發(fā)環(huán)境,沒有請參考圖雀社區(qū)另外一篇 Node.js 文章,里面有完善的 Node.js 環(huán)境配置。
安裝了最新的 Node.js 環(huán)境之后,我們使用 Node 安裝時自帶的包管理工具 Npm 來創(chuàng)建一個 Taro 項目,打開終端,運行如下命令:
$ npx @tarojs/cli init jd-mp運行上面的命令之后,你會看到終端有如下輸出:
稍等一會,當(dāng)終端出現(xiàn)如下字樣時,就代表項目初始化成功啦!
yarn install v1.21.1 info No lockfile found. [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh packages... success Saved lockfile. Done in 158.43s.創(chuàng)建項目 jd-mp 成功! 請進入項目目錄 jd-mp 開始工作吧!😝可以看到,我用了 158.43s ,所以初始項目的過程可能有點長,請耐心等待,如果最后你沒有看到終端出現(xiàn)如上的字樣,那么你可能遇到了問題,可以訪問 Taro 的論壇去尋求解答。
提示
通過上面的命令初始化項目之后,默認是沒有生成 .gitignore 文件的,這會導(dǎo)致你的版本系統(tǒng)中多了很多 node_modules/** 下面的文件,所以我們需要手動在初始化好的 jd-mp 項目根目錄下添加一個 .gitignore 文件,并添加對應(yīng)的規(guī)則如下:
node_modules # 忽略 `node_modules` 下面的文件dist # 忽略之后構(gòu)建項目生成的目錄使用準(zhǔn)備好的代碼
如果你安裝了 Node 環(huán)境,但是不想或者自己初始化項目是遇到了問題,那么你可以 Clone 一下我們?yōu)槟銣?zhǔn)備的初始項目代碼,之后跟著教程對照著這份初始代碼進行改進就可以啦!
如果你偏愛 Github,那么可以運行如下命令來獲取初始代碼:
$ git clone https://github.com/tuture-dev/jd-miniprogram.git如果你偏愛 Gitee,那么可以運行如下命令來獲取初始代碼:
$ git clone https://gitee.com/tuture/jd-miniprogram.git與自己使用命令初始化 Taro 項目不同,通過 Clone 我們?yōu)槟銣?zhǔn)備好的代碼,你需要手動安裝依賴,打開終端,輸入如下命令安裝依賴:
$ cd jd-miniprogram && npm install好的,通過上面的步驟,我們就準(zhǔn)備好了初始代碼,接下來就需要你實際動手寫代碼了,是不是有點期待呢?我們馬上就可以嘗試開發(fā)一個京東小程序了!
配置 JD 開發(fā)環(huán)境
安裝 JD 的運行腳本
等等,因為京東小程序才剛剛出來,還沒有正式開始推廣,所以 Taro 初始化項目的腳本里沒有生成京東小程序的開啟依賴,所以我們需要手動安裝一下對應(yīng)的開啟依賴,打開命令行,在 jd-mp 項目根目錄下執(zhí)行如下命令安裝:
$ npm install @tarojs/taro-jd安裝好之后,我們還需要在 package.json 中添加如下兩條開啟京東小程序項目的腳本:
{"name": "jd-mp","version": "1.0.0","private": true,"description": "第一個京東小程序","templateInfo": {"name": "default","typescript": false,"css": "sass"},"scripts": {// ..."build:quickapp": "taro build --type quickapp","build:jd": "taro build --type jd",// ..."dev:quickapp": "npm run build:quickapp -- --watch","dev:jd": "npm run build:jd -- --watch"},"author": "","license": "MIT","dependencies": {// ..."@tarojs/taro-jd": "^2.1.5",// ...},// ... }安裝并添加對應(yīng)的命令之后,我們就可以在終端項目根目錄執(zhí)行如下命令來運行我們的京東小程序:
$ npx taro build --type jd --watch注意要加上 --watch 參數(shù),這樣當(dāng)我們在編輯器(如 VSCode)修改內(nèi)容并保存之后,項目會自動編譯更新,然后刷新開發(fā)者工具就可以查看修改后的效果,上面這條命令會實際運行我們 package.json 里面添加的腳本命令:
"dev:jd": "npm run build:jd -- --watch"注冊京東小程序
當(dāng)進行了上面的配置之后,并把項目開起來之后,這個時候我們就需要去注冊一個京東小程序,拿到對應(yīng)的小程序的 AppId ,你可以訪問京東小程序官網(wǎng),根據(jù)步驟注冊小程序,并創(chuàng)建項目,然后取到項目的 AppId ,類似如下:
然后下載京東開發(fā)者工具,新建一個小程序項目,并輸入拿到的 AppId :
并在京東開發(fā)者里面點擊上面圓圈圈出的那個文件夾圖標(biāo),打開上面創(chuàng)建的 jd-mp 項目,不過請注意,我們需要選中項目里面編譯好的 dist 目錄:
這個時候,你的項目運行著,打開之后,你會在京東小程序開發(fā)者工具里面看到如下效果:
當(dāng)然上面這個指示的效果是我最終寫好的項目,你初次打開應(yīng)該可以看到一個 Hello World 🥳🥳🥳
編寫第一個 JD 組件并配置樣式
一切準(zhǔn)備就緒,可以開始編寫我們的京東小程序了!
編寫第一個 JD 組件
Taro 小程序 2.x.x 暫時支持 React 來寫小程序,而 Taro 3.x.x 允許 React,Vue 和 Nerve 來寫,之后我們圖雀社區(qū)會出 Taro 3.x.x 的教程,讓 Vue 的讀者也可以使用 Taro 來寫小程序。
既然現(xiàn)在只能用 React,那么就讓我們新潮一點,使用 React Hooks 來簡化組件編寫,打開 src/pages/index/index.jsx ,將類組件重構(gòu)成函數(shù)式組件,并添加一點發(fā)帖相關(guān)的內(nèi)容:
import Taro from "@tarojs/taro"; import { View, Button, Textarea } from "@tarojs/components"; import "./index.scss";export default function Index() {return (<View className="index"><Textareaplaceholder="撰寫優(yōu)質(zhì)教程..."className="post-input"autoHeight/><Button className="post-button">發(fā)表</Button></View>); }Index.config = {navigationBarTitleText: "首頁" };可以看到我們將類組件改成了函數(shù)式組件,并從 @tarojs/components 里面導(dǎo)入并添加了兩個組件 Textarea 和 Button ,用于帖子表單的內(nèi)容輸入和發(fā)表。
接著,我們將之前的類屬性 config 移動到 Index.config 上面來定義,這個 config 只在頁面級組件里面存在,用于定義頁面的一些屬性,比如這個的 navigationBarTitleText 就是此頁面的標(biāo)題,在小程序里面代表頂部的標(biāo)題:
為組件添加樣式
當(dāng)我們添加了上面兩個組件之后,組件的原生樣式開起來比較普通,為了讓我們的小程序更加專業(yè)一點,我們給其加點樣式,其實使用 Taro 開發(fā)京東小程序時,寫樣式和我們平時開發(fā) Web 應(yīng)用差不多,這里我們使用了 SCSS 來寫樣式,在組件里面定義了對應(yīng)的類名并導(dǎo)入了 CSS 文件,之后再 CSS 文件里面寫樣式。
打開 src/pages/index/index.scss ,在其中添加對應(yīng)的樣式文件如下:
.index {display: flex;flex-direction: column;align-items: center; }.post-input {margin-top: 24px;background: #fff;width: 80%;min-height: 80px;padding: 16px 30px;border: 1px solid #eee;font-size: 14px; }.post-button {margin-top: 24px;width: calc(80% + 60px);border-radius: 0;background-color: #00bc87;color: white; }當(dāng)添加了樣式之后,我們的應(yīng)用變成了如下樣子:
怎么樣,是不是變得有點專業(yè)了呢?🤓
使用 React Hooks 并處理事件
在編寫了第一個組件之后,我們嘗試來處理我們帖子的內(nèi)容輸入,這個時候就涉及到事件處理了,我們需要將之前在 src/pages/index/index.jsx 里面定義的 TextArea 做成 “受控組件”,我們使用 React Hooks 提供的 useState 來做到這一點。
打開 src/pages/index/index.jsx,對其中的內(nèi)容作出對應(yīng)的修改如下:
import Taro, { useState } from "@tarojs/taro"; import { View, Button, Textarea } from "@tarojs/components"; import "./index.scss";export default function Index() {const [post, setPost] = useState("");function handleChange(e) {setPost(e.target.value);}return (<View className="index"><Textareaplaceholder="撰寫優(yōu)質(zhì)教程..."className="post-input"value={post}onInput={handleChange}autoHeight/><Button className="post-button">發(fā)表</Button></View>); }Index.config = {navigationBarTitleText: "首頁" };可以看到,上面我們導(dǎo)入了 useState 鉤子,然后調(diào)用生成了一個 post 和 setPost ,接著我們定義了一個 handleChange 函數(shù)來處理 Textarea 的 onInput 事件,接收用戶輸入來設(shè)置 post 值,并通過將 post 設(shè)置回 Textarea 的 value 來達到 “受控組件” 的目的。
組件組合和處理 UI 反饋
當(dāng)我們的內(nèi)容多起來之后,在一個組件里面放太多內(nèi)容會導(dǎo)致邏輯不清晰,所以我們嘗試新建組件來抽出屬于它的一部分邏輯。接下來我們馬上要處理帖子發(fā)表邏輯,并且還要展示發(fā)表之后的效果,所以我們需要額外新建一個組件來展示帖子邏輯。
新建組件
在 src 目錄先新建 components 文件夾,然后在里面新建 PostCard 文件夾,接著在這個文件夾里面建一個 index.jsx 文件,用于放置組件邏輯和 UI,我們在這里組件里面編寫如下邏輯:
import Taro from "@tarojs/taro"; import { View, Text, Image } from "@tarojs/components";import "./styles.scss";export default function PostCard(props) {const { post } = props;return (<View className="post"><Text className="post-name">{post}</Text></View>); }可以看到我們創(chuàng)建了一個 PostCard 函數(shù)式組件,然后渲染了其父組件傳下來的參數(shù) post ,并且導(dǎo)入了一個 styles.scss 文件,我們將馬上來創(chuàng)建它。
在 src/components/PostCard 文件夾下創(chuàng)建一個 styles.scss ,并編寫如下內(nèi)容:
.post {width: calc(80% + 60px);margin: 0 auto;padding: 32px 0;border-bottom: 1px solid #eee; }.post-name {font-size: 20px;font-weight: 600;width: 100%; }處理 UI 反饋
當(dāng)編寫了渲染帖子的組件之后,我們回到 src/pages/index/index.jsx 組件,來導(dǎo)入我們寫好的 PostCard 組件,并同時處理帖子發(fā)表邏輯:
import Taro, { useState } from "@tarojs/taro"; import { View, Button, Textarea } from "@tarojs/components";import PostCard from "../../components/PostCard"; import "./index.scss";export default function Index() {const [post, setPost] = useState("");const [postList, setPostList] = useState([]);function handleChange(e) {setPost(e.target.value);}function handleSubmit() {console.log("hello world", post);if (!post) {Taro.showToast({title: "內(nèi)容不能為空",icon: "none"});} else {Taro.showToast({title: "發(fā)表成功",icon: "success"});setPost("");setPostList(postList.concat(post));}}return (<View className="index"><Textareaplaceholder="撰寫優(yōu)質(zhì)教程..."className="post-input"value={post}onInput={handleChange}autoHeight/><Button className="post-button" onClick={handleSubmit}>發(fā)表</Button><View className="post-box">{postList.map(postItem => (<PostCard post={postItem} />))}</View></View>); }Index.config = {navigationBarTitleText: "首頁" };可以看到上面我們使用 useState 鉤子創(chuàng)建了一個新的狀態(tài) postList ,接著我們在 Button 上定義了一個 onClick 的處理函數(shù) handleSubmit ,在這個函數(shù)里面,我們判斷輸入的 post 是否為空,如果為空提示用戶不可以發(fā)布,如果有內(nèi)容,則提示用戶新帖子發(fā)布成功,并將 post 添加到 postList 中,以及置空 post 內(nèi)容,等待下次輸入。
注意到這里我們使用 Taro.showToast API 來提示用戶,Taro 還有很多方便的 API,比如彈出模態(tài)框等,可以參考文檔。
提示
這里額外的 console 語句可以忽略,屬于開發(fā)時的調(diào)試語句。
最后,我們加一點樣式來讓我們的界面更加專業(yè),打開 src/pages/index/index.scss ,修改內(nèi)容如下:
.index {display: flex;flex-direction: column;align-items: center; }.post-input {margin-top: 24px;background: #fff;width: 80%;min-height: 80px;padding: 16px 30px;border: 1px solid #eee;font-size: 14px; }.post-button {margin-top: 24px;width: calc(80% + 60px);border-radius: 0;background-color: #00bc87;color: white; }.post-box {width: 100%;margin-top: 24px; }大功告成!我們現(xiàn)在可以發(fā)表帖子并展示效果了,這個時候測試你的京東小程序,應(yīng)該可以看到如下效果:
我們成功的處理了組件的組合,并且在發(fā)表帖子的時候使用 Taro 的 API 給與了用戶 UI 反饋。
多頁面與路由跳轉(zhuǎn)
通過上面的步驟,我們可以展示帖子列表,但是我們都知道,帖子的內(nèi)容可能很長,所以我們需要額外的頁面來展示帖子詳情,所以我們接下來將新建頁面并使用 Taro 提供的 API 進行多頁面的跳轉(zhuǎn)。
新建頁面
我們在 src/pages 文件夾下建一個 post 文件夾,并在里面建一個 post.jsx 文件,并編寫對應(yīng)的內(nèi)容如下:
import Taro, { useRouter } from "@tarojs/taro"; import { View, Text } from "@tarojs/components";import "./post.scss";export default function Post() {const { params } = useRouter();const { post = "" } = params;return (<View className="post"><Text className="post-name">{post}</Text></View>); }Post.config = {navigationBarTitleText: "帖子頁" };可以看到上面我們創(chuàng)建了一個 Post 函數(shù)式組件,然后增加了 config 配置,在標(biāo)題改為 “帖子頁”,接著我們使用 Taro 提供的 useRouter 鉤子來獲取路由傳遞過來的參數(shù),取到參數(shù)里面的 post 并渲染。
注意
一般情況下,我們是通過路由傳遞 postId ,然后在帖子詳情里面發(fā)起 HTTP 請求獲取帖子詳情,這里為了演示京東小程序的能力,所以簡化了寫法。
注冊頁面
當(dāng)創(chuàng)建了新頁面之后,我們還要告訴應(yīng)用我們創(chuàng)建的這個頁面,也就是在應(yīng)用注冊這個頁面,打開 src/app.jsx ,在對應(yīng) App 組件的 config.pages 屬性里面添加剛剛創(chuàng)建的帖子詳情頁的路徑如下:
import Taro, { Component } from "@tarojs/taro"; import Index from "./pages/index";import "./app.scss";// 如果需要在 h5 環(huán)境中開啟 React Devtools // 取消以下注釋: // if (process.env.NODE_ENV !== 'production' && process.env.TARO_ENV === 'h5') { // require('nerv-devtools') // }class App extends Component {componentDidMount() {}componentDidShow() {}componentDidHide() {}componentDidCatchError() {}config = {pages: ["pages/index/index", "pages/post/post"],window: {backgroundTextStyle: "light",navigationBarBackgroundColor: "#fff",navigationBarTitleText: "WeChat",navigationBarTextStyle: "black"}};// 在 App 類中的 render() 函數(shù)沒有實際作用// 請勿修改此函數(shù)render() {return <Index />;} }Taro.render(<App />, document.getElementById("app"));處理路由跳轉(zhuǎn)
創(chuàng)建并注冊了頁面之后,我們就可以在 src/components/PostCard/index.jsx 組件里面處理點擊帖子列表單個帖子的路由跳轉(zhuǎn)了:
import Taro from "@tarojs/taro"; import { View, Text } from "@tarojs/components";import "./styles.scss";export default function PostCard(props) {const { post } = props;function handleClick() {Taro.navigateTo({url: `/pages/post/post?post=${post}`});}return (<View className="post" onClick={handleClick}><Text className="post-name">{post}</Text></View>); }可以看到,我們新增了 onClick 事件的處理方法 handleClick ,并調(diào)用 Taro 提供的 navigateTo API 進行頁面之間的跳轉(zhuǎn),更多頁面導(dǎo)航的 API 可以參考文檔。
現(xiàn)在你可以在添加帖子之后,點擊單個帖子,你會發(fā)現(xiàn)頁面發(fā)生跳轉(zhuǎn)到帖子詳情頁,并展示了帖子的內(nèi)容:
添加 TabBar
處理了多頁面的跳轉(zhuǎn),一個小程序還存在一些 TarBar 的需求,即底部有幾個按鈕進行多種類型的頁面跳轉(zhuǎn),我們也來發(fā)掘一下在京東小程序里面如何添加 TabBar。
編寫新 TabBar 頁面
我們首先來建立 TabBar 需要切換的另外一個頁面,一般邏輯里面是 “我的” 頁面,在 src/pages 目錄下新建 mine 文件夾,然后在里面創(chuàng)建 mine.jsx 文件,編寫對應(yīng)的內(nèi)容如下:
import Taro, { useRouter } from "@tarojs/taro"; import { View, Text, Image } from "@tarojs/components";import "./mine.scss"; import avatar from "../../images/avatar.png";export default function Mine() {return (<View className="mine"><Image src={avatar} className="mine-avatar" /><View className="slogan"><Text className="slogan-name">圖雀社區(qū):予力內(nèi)容創(chuàng)作,加速技術(shù)傳播</Text></View></View>); }Mine.config = {navigationBarTitleText: "我的" };可以看到是我們熟悉的函數(shù)式組件,并且 config 我們設(shè)置了 “我的” 的標(biāo)題,并且還在組件中渲染了一張圖片和標(biāo)語,圖片可以在項目中獲取。1)Github 2)Gitee
接著我們可以創(chuàng)建對應(yīng)的樣式文件,在 src/pages/mine/下創(chuàng)建對應(yīng)的 mine.scss 文件,并編寫如下的內(nèi)容:
.mine {padding-top: 40px;display: flex;flex-direction: column;align-items: center; }.mine-avatar {width: 300px;height: 300px;border-radius: 50%; }.slogan {margin-top: 24px; }.slogan-name {font-size: 32px; }配置 TabBar
準(zhǔn)備好了 TabBar 的第二個頁面之后,我們在 src/app.jsx 里面配置京東小程序的 TabBar:
import Taro, { Component } from "@tarojs/taro"; import Index from "./pages/index";import "./app.scss";// 如果需要在 h5 環(huán)境中開啟 React Devtools // 取消以下注釋: // if (process.env.NODE_ENV !== 'production' && process.env.TARO_ENV === 'h5') { // require('nerv-devtools') // }class App extends Component {componentDidMount() {}componentDidShow() {}componentDidHide() {}componentDidCatchError() {}config = {pages: ["pages/index/index", "pages/post/post", "pages/mine/mine"],window: {backgroundTextStyle: "light",navigationBarBackgroundColor: "#fff",navigationBarTitleText: "WeChat",navigationBarTextStyle: "black"},tabBar: {list: [{pagePath: "pages/index/index",text: "首頁",iconPath: "./images/home.png",selectedIconPath: "./images/homeSelected.png"},{pagePath: "pages/mine/mine",text: "我的",iconPath: "./images/mine.png",selectedIconPath: "./images/mineSelected.png"}]}};// 在 App 類中的 render() 函數(shù)沒有實際作用// 請勿修改此函數(shù)render() {return <Index />;} }Taro.render(<App />, document.getElementById("app"));可以看到,首先我們在 config.pages 里面聲明了 pages/mine/mine.jsx 的路徑,然后我們給 config 額外增加了一個 tabBar 屬性,這個對象里面是一個 list 屬性,然后在里面加入了兩個 TabBar 頁面的配置信息:
- pagePath 代表當(dāng)前選中 TabBar 渲染的頁面路徑
- text TabBar 的展示標(biāo)題
- iconPath TabBar 未選中時展示的圖標(biāo)
- selectedIconPath TabBar 選中時展示的圖標(biāo)
更多 TabBar 的配置信息可以參考文檔。用到的圖標(biāo)文件可以在項目中獲取:1)Github 2)Gitee。
當(dāng)配置好上面的內(nèi)容之后我們應(yīng)該可以在京東小程序開發(fā)者界面里面看到如下效果:
發(fā)起網(wǎng)絡(luò)請求
前面所有的都是了解小程序本地編寫的一些內(nèi)容,大多數(shù)應(yīng)用還需要網(wǎng)絡(luò)請求獲取遠程數(shù)據(jù)來進行展示,當(dāng)然我們的京東小程序嘗鮮也不能漏掉這一點。
我們打開 src/pages/index/index.jsx 文件,對其中的內(nèi)容作出對應(yīng)的修改如下:
import Taro, { useState, useEffect } from "@tarojs/taro"; import { View, Button, Textarea } from "@tarojs/components";import PostCard from "../../components/PostCard"; import "./index.scss";export default function Index() {const [post, setPost] = useState("");const [postList, setPostList] = useState([]);function handleChange(e) {setPost(e.target.value);}function handleSubmit() {console.log("hello world", post);if (!post) {Taro.showToast({title: "內(nèi)容不能為空",icon: "none"});} else {Taro.showToast({title: "發(fā)表成功",icon: "success"});setPost("");setPostList(postList.concat(post));}}useEffect(() => {async function getPosts() {try {const res = await Taro.request({url:"https://9ff4272f-ce60-4be6-9376-f9f462482edc.mock.pstmn.io/articles"});const postList = res.data.map(item => item.name);setPostList(postList);} catch (err) {console.log("err", err);}}getPosts();}, []);return (<View className="index"><Textareaplaceholder="撰寫優(yōu)質(zhì)教程..."className="post-input"value={post}onInput={handleChange}autoHeight/><Button className="post-button" onClick={handleSubmit}>發(fā)表</Button><View className="post-box">{postList.map(postItem => (<PostCard post={postItem} />))}</View></View>); }Index.config = {navigationBarTitleText: "首頁" };可以看到,我們導(dǎo)入了 useEffect 鉤子,并在其中定義了一個異步 getPosts 函數(shù),用于獲取初始的帖子列表,接著我們在這個函數(shù)中使用 Taro 的請求 API Taro.request 來發(fā)起網(wǎng)絡(luò)請求,并將請求到的數(shù)據(jù)進行處理更新到 postList 中,關(guān)于更多請求的 API 請參考 Taro 文檔。
當(dāng)添加了上面內(nèi)容之后,我們可以收獲如下的效果:
總結(jié)
通過這篇教程快速上手京東小程序開發(fā),我們可以發(fā)現(xiàn)得益于 Taro 的優(yōu)秀跨端特性,即使是最新剛推出的京東小程序也可以游刃有余的開發(fā)我們需要的功能,這不禁讓我想起了 Taro Next 發(fā)布之際,Taro 團隊明確的初心和使命:“降低開發(fā)成本,提高開發(fā)體驗和開發(fā)效率”,不忘初心,牢記使命,這就是 Taro 團隊擁抱變化的方式!
想要學(xué)習(xí)更多精彩的實戰(zhàn)技術(shù)教程?來圖雀社區(qū)逛逛吧。
總結(jié)
以上是生活随笔為你收集整理的一杯茶的时间,上手 Taro 京东小程序开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于python的人脸识别检测开题报告_
- 下一篇: openCV——图像金字塔