taro+ts+dva+微信小程序云開發(fā)實(shí)現(xiàn)《詩詞小程序》

項(xiàng)目初始化

如果未安裝taro的話先使用下面命令安裝

$ yarn global add @tarojs/cli

安裝完成后就可以使用taro命令創(chuàng)建項(xiàng)目了

$ taro init poetry

輸入創(chuàng)建命令時(shí)會(huì)讓你選擇語言,類型什么的,因?yàn)槲覀兪怯胻ypescript,所以選擇是就行了。

圖片

配置云開發(fā)

taro是支持小程序云開發(fā)模式的,具體看文檔https://taro-docs.jd.com/taro/docs/wxcloudbase,使用云開發(fā)模板的目錄結(jié)構(gòu)如下,

├── client                                  小程序端目錄
│   ├── config                              配置目錄
│   │   ├── dev.js                          開發(fā)時(shí)配置
│   │   ├── index.js                        默認(rèn)配置
│   │   └── prod.js                         打包時(shí)配置
│   ├── dist                                編譯結(jié)果目錄
│   ├── package.json
│   ├── src                                 源碼目錄
│   │   ├── app.scss                        項(xiàng)目總通用樣式
│   │   ├── app.js                          項(xiàng)目入口文件
│   │   ├── components                      組件文件目錄
│   │   └── pages                           頁面文件目錄
├── cloud                                   服務(wù)端目錄
│   └── functions                           云函數(shù)目錄
│       └── login                           login 云函數(shù)
│           ├── index.js                    login 函數(shù)邏輯
│           └── package.json
└── project.config.json                     小程序項(xiàng)目配置

文檔的介紹是這樣的:

  1. 開發(fā)時(shí),進(jìn)入 client 目錄,在此目錄下運(yùn)行相關(guān)編譯預(yù)覽或打包命令
  2. 使用微信開發(fā)者工具調(diào)試項(xiàng)目,請將項(xiàng)目整個(gè)文件夾作為運(yùn)行目錄。 注意: 不是 client 中生成的 dist 文件夾

必須將整個(gè)項(xiàng)目作為運(yùn)行目錄,我覺得這樣挺麻煩的,其實(shí)云開發(fā)主要是比普通開發(fā)多了一個(gè)云開發(fā)的文件夾,只要我們改寫一下配置,把輸出目錄修改一下就可以了。

首先我們先修改下文件目錄結(jié)構(gòu)

├── poetry  
│   ├── config                              配置目錄
│   │   ├── dev.js                          開發(fā)時(shí)配置
│   │   ├── index.js                        默認(rèn)配置
│   │   └── prod.js                         打包時(shí)配置
│   ├── package.json
│   ├── src                                 源碼目錄
│   │   ├── app.scss                        項(xiàng)目總通用樣式
│   │   ├── app.tsx                          項(xiàng)目入口文件
│   │   ├── components                      組件文件目錄
│   │   └── pages                           頁面文件目錄
│   ├── wx_output                           編譯輸出目錄
│       └── cloudfunctions                  云函數(shù)目錄
│           └── login                       login 云函數(shù)
│               ├── index.js                    
│               └── package.json
│   └── miniprogram                          小程序編譯目錄
└── project.config.json                     小程序項(xiàng)目配置

然后我們修改一下config/index.js下的文件內(nèi)容

const outputRoot = process.env.TARO_ENV === 'weapp' ? 'wx_output/miniprogram' : 'dist';

const config = {
  ...
  outputRoot: outputRoot,
  ...
},

module.exports = function (merge) {
if (process.env.NODE_ENV === 'development') {
  return merge({}, config, require('./dev'))
}
return merge({}, config, require('./prod'))
}

通過改寫配置我把編譯輸出目錄改成了 wx_output/miniprogram 文件夾,只要把wx_output作為小程序項(xiàng)目的根目錄就可以了,不過有一點(diǎn)要注意下,因?yàn)榫幾g時(shí)project.config.json是編譯在miniprogram文件夾下的,小程序要求在必須在根目錄下才行,所以我們還要將project.config.json移動(dòng)到wx_output/目錄下才能正常運(yùn)行。

其它的一些需要配置的只要參考微信云開發(fā)文檔進(jìn)行配置就行了,這個(gè)問題不大。

定義ts接口

scr 目錄下新建 typings 文件夾,然后新建 store.d.ts 文件,文件里可以定義我們所需要的ts接口,如下

...
interface ToastParams {
  title: string,
  duration?: number,
  icon?: iconType
}

interface 詩詞詳情數(shù)據(jù) {
  poetryInfo: poetryItem,
  tag: string
}

interface 作者相關(guān) {
  authorInfo: 作者數(shù)據(jù),
  hasAuthor: boolean
}

interface 作者數(shù)據(jù) {
  _id: string,
  description: string,
  name: string,
  short_description: string,
  imgUrl?: string
}
...

試了一下中文也是可以的,定義完成后就可以直接在項(xiàng)目中使用該類型了

type PageDispatchProps = {
  dispatch: (object)=>void
  poetryDetail: 詩詞詳情數(shù)據(jù)
  author: 作者相關(guān)
}

數(shù)據(jù)來源

小程序所用數(shù)據(jù)來源于https://github.com/chinese-poetry/chinese-poetry,將該數(shù)據(jù)通過json導(dǎo)入云開發(fā)數(shù)據(jù)庫就可以了,我根據(jù)詩詞的類型創(chuàng)建了不同的數(shù)據(jù)集

圖片

創(chuàng)建云函數(shù)

參考文檔新建所需的云函數(shù),比如新建一個(gè)獲取所有詩詞類別的方法

async allCategories(params) {// 獲取所有詩詞類別
  try {
    const data = await db.collection('catalog').get();
    return await this.success(data);
  }catch(err) {
    return await this.failMsg(err);
  }
}

使用dva

先安裝dva所需依賴 dva-core dva-loading redux等,安裝完后在src文件夾下新建models文件夾,新建index.ts文件,內(nèi)容如下,

import poetryDetail from '../pages/model/poetryDetail'
import author from '../pages/model/author'

let list = [
  poetryDetail,
  author
];

export default list;

上面的../pages/model/poetryDetail還有../pages/model/author就是我需要共用的數(shù)據(jù)文件,具體寫法可以參考dva教程,文件的模板如下:

export default {
  namespace: 'xxx',

  state: {// 存放數(shù)據(jù)
  },

  effects: {
    // 定義方法
    *someFunction({payload, callback}, {call, put}) {

    }
  },

  reducers: {
    save(state, {payload}) {
      return {
        ...state,
        ...payload
      }
    }
  }
}

修改app.tsx文件

import Taro, { Component, Config } from '@tarojs/taro'
import {Provider} from '@tarojs/redux'
import models from './models/index'
import dva from './utils/dva'
import Index from './pages/index'

import './app.scss'

const dvaApp = dva.createApp( {
  initialState: {},
  models
});  
const store = dvaApp.getStore();

// 如果需要在 h5 環(huán)境中開啟 React Devtools
// 取消以下注釋:
// if (process.env.NODE_ENV !== 'production' && process.env.TARO_ENV === 'h5')  {
//   require('nerv-devtools')
// }

class App extends Component {

  componentDidMount () {
    if (process.env.TARO_ENV === 'weapp') {
      Taro.cloud.init({
        env: 'xxx',
        traceUser: true
      })
    }
  }

  config: Config = {
    ...
  }

  // 在 App 類中的 render() 函數(shù)沒有實(shí)際作用
  // 請勿修改此函數(shù)
  render () {
    return (
      <Provider store={store} >
        <Index />
      </Provider>
    )
  }
}

Taro.render(<App />, document.getElementById('app'))

在需要使用dva的頁面中加入構(gòu)造器就行了

@connect(
  ({poetryDetail,author}) => ({poetryDetail,author})
)

class xxx extends Component<IProps, PageState> {
  ...
}

export default xxx

配置完成后我們就可以在頁面中調(diào)用了,要使用某個(gè)方法時(shí),可以這樣

  const { dispatch } = this.props;
  dispatch({
    type: 'author/someFunction',
    payload: {
      clounFnName: 'poetry', 
      controller: 'poetry',
      action: 'getHotAuthor',
    },
    callback: res => {
      this.setState({
        hotAuthor: res.data
      })
    }
  })

總結(jié)

第一次用ts來開發(fā)小程序,算是當(dāng)作練手,熟悉一下ts在項(xiàng)目中的運(yùn)用以及一些需要注意的點(diǎn),這個(gè)小程序比較簡單,也沒有什么難點(diǎn),用來練習(xí)正好,一些細(xì)節(jié)方面的東西我也沒用講到,可以直接看源碼了解,也可以掃下面這個(gè)小程序進(jìn)行體驗(yàn),有什么建議也歡迎提出。

小程序碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容