• taro vue3 ts nut-ui 项目


    1. # 使用 npm 安装 CLI
    2. $ npm install -g @tarojs/cli
    查看 Taro 全部版本信息

    可以使用 npm info 查看 Taro 版本信息,在这里你可以看到当前最新版本

    npm info @tarojs/cli

    项目初始化

    使用命令创建模板项目:

    taro init 项目名

    taro init myApp

    微信小程序自定义 TabBar

    安装 cnpm install pinia 以便解决 小程序的 页面首次加载

    在 app.config.js 中设置

    1. export default defineAppConfig({
    2. pages: [
    3. 'pages/myPage01/index',
    4. 'pages/myPage02/index',
    5. ],
    6. window: {
    7. backgroundTextStyle: 'light',
    8. navigationBarBackgroundColor: '#fff',
    9. navigationBarTitleText: 'WeChat',
    10. navigationBarTextStyle: 'black'
    11. },
    12. tabBar: {
    13. custom: true,
    14. color: '#000000',
    15. selectedColor: '#000000',
    16. backgroundColor: '#000000',
    17. list: [
    18. {
    19. pagePath: 'pages/myPage01/index',
    20. text: '页面01',
    21. },
    22. {
    23. pagePath: 'pages/myPage02/index',
    24. text: '页面02',
    25. },
    26. ],
    27. }
    28. })

    在 src 目录下 pages 文件夹,在里面新建页面 

    在 src 目录下添加 custom-tab-bar 文件夹,在里面书写底部导航栏组件

    在 src 目录下添加 store 文件夹,在里面写 index.js

    在 src 目录下添加 assets 文件夹,在里面添加 pic 和 tabbarIcon 

    custom-tab-bar 的 index.js

    1. <template>
    2. <view class="custom-tab-bar" style="display: flex; justify-content: space-around; align-items: center; padding: 10rpx 24rpx; background: #fff;">
    3. <view v-for="(item, index) in tabList" @click="handleClick(item, index)">
    4. <view style="width: 96rpx; height: 64rpx;">
    5. <img style="width: 100%; height: 100%;" :src=" current === index ? item.activeImg : item.img" alt="">
    6. </view>
    7. <view style="font-size: 24rpx; width: 100%; text-align: center;">{{ item.title }}</view>
    8. </view>
    9. </view>
    10. </template>
    11. <script setup>
    12. import Taro from '@tarojs/taro'
    13. import { useTabBarStore } from "../store/index";
    14. import { ref, reactive, computed } from 'vue'
    15. const tabBarStore = useTabBarStore();
    16. const current = computed(() => tabBarStore.getSelected)
    17. const tabList = reactive([
    18. {
    19. title: '首页',
    20. pagePath: '/pages/myPage01/index',
    21. img: require('../assets/tabbarIcon/myPage01.png'),
    22. activeImg: require('../assets/tabbarIcon/myPage01Active.png')
    23. },
    24. {
    25. title: '我的',
    26. pagePath: '/pages/myPage02/index',
    27. img: require('../assets/tabbarIcon/myPage02.png'),
    28. activeImg: require('../assets/tabbarIcon/myPage02Active.png')
    29. },
    30. ])
    31. const handleClick = (item, index) => {
    32. tabBarStore.setSelected(index);
    33. Taro.switchTab({ url: item.pagePath })
    34. }
    35. </script>
    36. <style lang="scss" scoped></style>

    store 的 index.js

    1. import { defineStore } from "pinia";
    2. export const useTabBarStore = defineStore("tabBar", {
    3. state: () => {
    4. return { selected: 0 };
    5. },
    6. getters: {
    7. getSelected(state) {
    8. return state.selected;
    9. },
    10. },
    11. actions: {
    12. setSelected(value) {
    13. this.selected = value;
    14. },
    15. },
    16. });

    在 app.js 引入 pinia 

    1. import { createApp } from 'vue'
    2. import './app.scss'
    3. import { createPinia } from "pinia";
    4. const App = createApp({
    5. onShow (options) {},
    6. // 入口组件不需要实现 render 方法,即使实现了也会被 taro 所覆盖
    7. })
    8. App.use(createPinia())
    9. export default App

    设置分享功能 在 app.js 写入

    1. // app.js
    2. import Taro from "@tarojs/taro";
    3. // 分享的时候 wx.getStorageSync("sharePageUrl") 获取分享页面,在每个要分享的页面 进行设置缓存中的 sharePageUrl
    4. /**
    5. * 全局分享配置,页面无需开启分享
    6. * 使用隐式页面函数进行页面分享配置
    7. * 使用隐式路由获取当前页面路由,并根据路由来进行全局分享、自定义分享
    8. */
    9. !(function () {
    10. //获取页面配置并进行页面分享配置
    11. var PageTmp = Page;
    12. Page = function (pageConfig) {
    13. Taro.showShareMenu({
    14. withShareTicket: true,
    15. });
    16. //1. 获取当前页面路由
    17. let routerUrl = "";
    18. wx.onAppRoute(function (res) {
    19. //app.js中需要在隐式路由中才能用getCurrentPages()获取到页面路由
    20. let pages = getCurrentPages(),
    21. view = pages[pages.length - 1];
    22. if (view) {
    23. routerUrl = view.route;
    24. }
    25. });
    26. //2. 全局开启分享配置
    27. pageConfig = Object.assign(
    28. {
    29. onShareAppMessage: function () {
    30. //根据不同路由设置不同分享内容(微信小程序分享自带参数,如非特例,不需配置分享路径)
    31. let shareInfo = {};
    32. let noGlobalSharePages = ["index/index"];
    33. //全局分享配置,如部分页面需要页面默认分享或自定义分享可以单独判断处理
    34. if (!routerUrl.includes(noGlobalSharePages)) {
    35. shareInfo = {
    36. title: "小鑫向上",
    37. imageUrl: wx.getStorageSync("shareUrl"),
    38. };
    39. }
    40. return shareInfo;
    41. },
    42. onShareTimeline: function (res) {
    43. console.log(res)
    44. console.log(routerUrl)
    45. let shareData = {
    46. title: "小鑫向上",
    47. path: wx.getStorageSync("sharePageUrl"), // 分享的路径
    48. // imageUrl: '', // 分享的图片链接
    49. };
    50. return shareData;
    51. },
    52. },
    53. pageConfig
    54. );
    55. // 配置页面模板
    56. PageTmp(pageConfig);
    57. };
    58. })();

    封装API接口

    在 src 下 新建 api 文件夹 下 继续创建 文件

    baseUrl.js

    1. const getBaseUrl = (url) => {
    2. let BASE_URL = "";
    3. if (process.env.NODE_ENV === "development") {
    4. // 开发环境 - 根据请求不同返回不同的BASE_URL
    5. // BASE_URL = "http://pig-gateway:9999";
    6. // BASE_URL = "http://127.0.0.1:3000"
    7. BASE_URL = "http://123.207.67.156:8889";
    8. } else {
    9. // 生产环境
    10. // BASE_URL = "http://127.0.0.1:3000"
    11. BASE_URL = "http://123.207.67.156:8889";
    12. }
    13. return BASE_URL;
    14. };
    15. export default getBaseUrl;

    http.js

    1. import Taro from "@tarojs/taro";
    2. import getBaseUrl from "./baseUrl";
    3. import interceptors from "./interceptors";
    4. interceptors.forEach((interceptorItem) => Taro.addInterceptor(interceptorItem));
    5. class httpRequest {
    6. baseOptions(params, method = "GET") {
    7. let { url, data } = params;
    8. const BASE_URL = getBaseUrl(url);
    9. let contentType = "application/json";
    10. contentType = params.contentType || contentType;
    11. let responseType = "";
    12. responseType = params.responseType || responseType;
    13. const option = {
    14. url: BASE_URL + url,
    15. data: data,
    16. method: method,
    17. header: {
    18. "content-type": contentType,
    19. Authorization: "Bearer " + Taro.getStorageSync("accessToken"),
    20. },
    21. responseType: responseType,
    22. };
    23. return Taro.request(option);
    24. }
    25. get(url, data = "", responseType) {
    26. let option = { url, data, responseType };
    27. return this.baseOptions(option);
    28. }
    29. post(url, data, contentType) {
    30. let params = { url, data, contentType };
    31. return this.baseOptions(params, "POST");
    32. }
    33. put(url, data = "") {
    34. let option = { url, data };
    35. return this.baseOptions(option, "PUT");
    36. }
    37. delete(url, data = "") {
    38. let option = { url, data };
    39. return this.baseOptions(option, "DELETE");
    40. }
    41. }
    42. export default new httpRequest();

    interceptors.js

    1. import Taro from "@tarojs/taro";
    2. const HTTP_STATUS = {
    3. SUCCESS: 200,
    4. CREATED: 201,
    5. ACCEPTED: 202,
    6. CLIENT_ERROR: 400,
    7. AUTHENTICATE: 401,
    8. FORBIDDEN: 403,
    9. NOT_FOUND: 404,
    10. SERVER_ERROR: 500,
    11. BAD_GATEWAY: 502,
    12. SERVICE_UNAVAILABLE: 503,
    13. GATEWAY_TIMEOUT: 504,
    14. Failed_Dependency: 424,
    15. };
    16. const customInterceptor = (chain) => {
    17. const requestParams = chain.requestParams;
    18. return chain
    19. .proceed(requestParams)
    20. .then((res) => {
    21. // 只要请求成功,不管返回什么状态码,都走这个回调
    22. if (res.statusCode === HTTP_STATUS.NOT_FOUND) {
    23. return Promise.reject("请求资源不存在");
    24. } else if (
    25. res.statusCode === HTTP_STATUS.SERVER_ERROR ||
    26. res.statusCode === HTTP_STATUS.SERVICE_UNAVAILABLE
    27. ) {
    28. return Promise.reject("服务端错误");
    29. } else if (res.statusCode === HTTP_STATUS.GATEWAY_TIMEOUT) {
    30. return Promise.reject("请求超时");
    31. } else if (res.statusCode === HTTP_STATUS.BAD_GATEWAY) {
    32. return Promise.reject("网关错误");
    33. } else if (res.statusCode === HTTP_STATUS.FORBIDDEN) {
    34. return Promise.reject("没有权限访问");
    35. } else if (res.statusCode === HTTP_STATUS.CLIENT_ERROR) {
    36. return Promise.reject("请求错误");
    37. } else if (res.statusCode === HTTP_STATUS.AUTHENTICATE) {
    38. Taro.reLaunch({
    39. url: "/pages/login_package/login/index",
    40. });
    41. return Promise.reject("需要鉴权");
    42. } else if (res.statusCode === HTTP_STATUS.Failed_Dependency) {
    43. Taro.reLaunch({
    44. url: "/pages/login_package/login/index",
    45. });
    46. return Promise.reject("请求令牌已过期");
    47. } else if (res.statusCode === HTTP_STATUS.SUCCESS) {
    48. return res.data;
    49. }
    50. })
    51. .catch((err) => {
    52. Taro.showToast({
    53. icon:'error',
    54. title:err
    55. })
    56. });
    57. };
    58. // Taro 提供了两个内置拦截器
    59. // logInterceptor - 用于打印请求的相关信息
    60. // timeoutInterceptor - 在请求超时时抛出错误。
    61. const interceptors = [customInterceptor];
    62. export default interceptors;

    servers.js

    1. import HTTPREQUEST from "./http";
    2. // import Taro from "@tarojs/taro";
    3. // export const refreshToken = (postData) => {
    4. // return HTTPREQUEST.get("/dcms/app-api/sso/refreshToken", postData);
    5. // };
    6. // export const logout = () => {
    7. // return HTTPREQUEST.post("/dcms/app-api/sso/logout");
    8. // };
    9. // 查看商品分类
    10. export const getGoodClass = (postData) => {
    11. // return HTTPREQUEST.get("/api/getGoodClass", postData);
    12. return HTTPREQUEST.get("/getGoodClass", postData);
    13. };
    14. // 查看商品详情
    15. export const getGoodDetail = (postData) => {
    16. // return HTTPREQUEST.get("/api/getGoodDetail", postData);
    17. return HTTPREQUEST.get("/getGoodDetail", postData);
    18. };
    19. // 查看商品详情
    20. export const useIdGetGoodDetail = (postData) => {
    21. // return HTTPREQUEST.get("/api/useIdGetGoodDetail", postData);
    22. return HTTPREQUEST.get("/useIdGetGoodDetail", postData);
    23. };

  • 相关阅读:
    C++ Reference: Standard C++ Library reference: C Library: cwchar: wcscoll
    java 字符串初始化=“” 和=null的区别
    正则表达式(Java)
    Maven assembly多模块多环境(dev|test|prod)定制化打包SpringBoot项目详解
    草莓熊python turtle绘图代码
    基于Unity开发的联机解谜游戏的设计与实现
    leetcode 167. 两数之和 II - 输入有序数组
    Unittest(单元测试)
    「布道师系列文章」宝兰德徐清康解析 Kafka 和 AutoMQ 的监控
    Rust(1) 简介和安装
  • 原文地址:https://blog.csdn.net/czxvzxzczcc/article/details/132467800