Code前端首页关于Code前端联系我们

微信小程序开发技巧:Promise、如何写scss、如何搭建Webstorm

terry 2年前 (2023-09-22) 阅读数 75 #移动小程序

1.潜在陷阱和Tips

本来想写一点小技巧,结果总结了一下。在开始之前,我并不知道开发微信小程序的体验如此糟糕。从创作工具微信到所谓的“新语言”,都渗透着浓浓的five的碎片化视野。 ,真是让我emmm……另外,我发现网上的迷你编程文章大多是关于如何使用、如何避免陷阱的实用文章,而不是技术文章,这也是从另一个侧面代表的。小程序中的陷阱很多。

在微信小程序原生开发过程中,我们提出了诸如“拥有如此多技术人才的腾讯为什么要这样释放laji?”等问题。很多方面和长辈都是社区提出来的,两三年前。官方回应据说是定了,但几年过去了,依然没有消息,官方回应依然是冷冰冰的“反馈”?白屏,重置不行,可以强行退出再打开;

  • 和上一篇一样,有时候款式上会出错,整个造型就白了。调试器不会告诉你问题所在,只是跳过处理并且不显示它。重启无法解决问题,可以强制退出并重新打开;
  • 与上一篇类似,调试器中报出的错误往往是无用的,导致很难发现问题;
  • Android 当普通Tabbar下降刷新时,它也会随着屏幕下降,这是一个无法到达的bug。写完 Tabbar 配方后,我将其转换为定制的 Tabbar!
  • import的路径不支持完整路径。例如,如果要指定 utils/fetch.js,无论元素有多深,都必须 ../ 单击根文件夹,同样 .wxss文件@import导入文件时只能使用正确的路径,因此会出现../../../。 ../../../utils/fetch.js 此对象类型;
  • 静态资源路径不包含汉字,包含汉字则无法输入;
  • .wxs 该文件不支持ES6,可以使用ES5脚本; .wxs文件是否只能包含在文件
  • .wxml中,而不能包含.js? ? ?即使是
  • 模板{{}}中的方法也不可行,根本无法像+ - * /那样工作。如果遇到需要过滤场景的数据,则需要在.js中执行,然后setData通常是[2,3,4]。那里(有点),我什至都跑不了!文件
  • .wxs 无法使用 Date 对象,因此您无法 new Date()❀,只能使用 ❀ 方法,对于常见的事物也是如此。要创建自定义对象,我们需要使用 getRegExp 函数 getRegExp(pattern[, flags]);其他可以在
  • .wxs.wxs文件中调用,并且必须调用.wxs。导入的文件必须使用相对路径;
  • setData 懒得组合东西。如果 data: { a: {b: 1, c: 1}},则 setData({a: {b: 2}}) 将丢失 a.c 的值,这很烦人 人们很生气,需要 setData({['a.b': 2]}) 这就是要做的;
  • IOS Date 对象可以获得任意时间戳,例如 GetDay 以及所有 和 nan,因为它们不支持 iOS 日期创建者的日期这种格式2018-04-26 2018 /04/26 只有此格式才会合法显示;
  • 开发版小程序有时会发送莫名请求失败。右上角有三个点可以启用调试。打开“开发调试”后,可以匿名发送请求。 ,好像很多手机都是这样,真相不得而知
  • 2。微信请求修改 Promise

    2.1 使用现成的库

    安装 Promise 库 wx-promise-pro,记得带上 -s 或 或 ,否则安装将会失败。

    npm i -S wx-promise-pro

    然后在app.js:

    import { promisifyAll } from 'wx-promise-pro'
    
    promisifyAll()  // promisify all wx api
    
    App({ ... })

    这样就可以正常使用了:

    wx.pro.showLoading({
        title: '加载中',
        mask: true
    })
      .then(() => console.log('in promise ~'))

    2.2 我们自己实现♷,其实规则很简单。以wx.request原生API为例:
    // 原生 API 使用方式
    wx.request({
        url: '',     // 请求的 url
        data: {},    // 参数
        method: '',  // post、get
        success: res => {
            // 请求成功回调函数,res为回调参数
        },
        fail: res => {
            // 请求失败回调函数,res为回调参数
        }
    })

    如果我们做出一个Promise,那么调用方法应该是:

    // Promise 化后的期望使用方式
    wx.pro.request({
        url: '',     // 请求的 url
        data: {},    // 参数
        method: ''   // post、get
    })
      .then(res => {
          // 请求成功回调函数,res为回调参数
      })
      .catch(res => {
          // 请求失败回调函数,res为回调参数
      })

    and then 函数返回一个Promise对象,这样这个函数就可以返回一个承诺对象。调用链还在继续,所以我们需要 new 来退出,带着一个 Promise 对象:

    function request(opt) {
        return new Promise((resolve, reject) => {
            wx.request({
                ...opt,
                success: res => { resolve(res)},
                fail: res => {reject(res)}
            })
        })
    }

    我们可以进一步改进这段代码,因为 success❀

    微信小程序开发小技巧: Promise 化、scss 写样式 、Webstorm 配置方法

    这里发送的参数是使用方法 resolve, reject 实现,因此可以直接传递到 ›♻

    微信小程序开发小技巧: Promise 化、scss 写样式 、Webstorm 配置方法

    reject 照着做就可以了。

    另外,由于原生API格式与其他小程序相同,所以我们可以使用curry方法来操作其他需要promise的API:

    function promisify(api) {
        return (opt = {}) => {
            return new Promise((resolve, reject) => {
                api({
                    ...opt,
                    fail: reject,
                    success: resolve
                })
            })
        }
    }

    然后将curry方法的结果作为新的基于Promise的API是在对象wx.pro中实现的:

    // 将指定 API 进行 Promise 化
    wx.pro.request = promisify(wx.request)
    
    // 使用
    wx.pro.request({...})
        .then(...)

    然后为了方便使用其他方法,我们可以将方法wx♺作为基于对象的Promise进行循环,如请求扫码显示Toast

  • 等被一一放置。 wx.pro对象,可以直接使用wx.pro.xx。因为此方法返回一个 Promise 对象,所以它可以像任何其他 Promise 对象一样使用。

    其实我们不知道,我们实现了wx-promise-pro的源代码。这个库的主要代码就是上面几行?

    2.3 在项目中使用

    有了上面的工具,我们就可以在项目中使用了。为了不将它们分散到整个项目中,wx.requestwx.pro.request只能在此处控制,创建两个新文件如下: 所有API作为单独的文件进行集中管理:

    // utils/api/apis.js 封装所有请求 API
    
    import { fetch } from './fetch'
    
    /* 根据微信code获取用户信息 */
    const appUserGetByCode = ({ code } = {}) => fetch({
        url: '/app/user/get-by-code',
        data: { code }
    })
    
    /* 扫码登录 */
    const appUserQrLogin = ({ qrCode } = {}) => fetch({
        method: 'POST',
        url: '/app/user/qr-login',
        data: { qrCode }
    })
    
    /* 个人信息 */
    const appUserInfo = () => fetch({
        url: '/app/user/info'
    })
    
    /* 系统参数获取,数据字典 */
    const appSysParamListByParam = () => fetch({
        url: '/app/sys-param/list-by-param'
    })
    
    /* 数据字典所有 */
    const appSysParamListAll = () => fetch({
        url: '/app/sys-param/list-all'
    })
    
    export {
        appSysParamListAll,   // 数据字典所有
        appSysParamListByParam,   // 系统参数获取,数据字典
        appUserGetByCode,   // 根据微信code获取用户信息
        appUserQrLogin,   // 扫码登录
        appUserInfo   // 个人信息
    }

    想使用API​​的地方,可以这样包含:

    import * as Api from '../../utils/api/apis.js'   // 相对路径
    
    // 使用方式
    Api.appSysParamListAll()
      .then(({ dataList }) => this.upData({ sysParamList: dataList }))
      .then(() => {
          const keyList = this.data.sysParamList.map(T => T.key)
          this.upData({
              keyList,
              formData: { keys: keyList }
          })
      })

    使用起来非常方便,就用在这里。下面我要介绍的upData是一款强烈推荐的迷你编程工具~

    3。 SetState改变数据对象的状态

    在小程序中,data是无法直接使用的,需要使用setData。考虑到开发微信小程序时使用setData的不好的体验,我使用了一个库函数wx-updata。这对我在图书馆工作的开展过程中非常有帮助。这里给大家一个特别的建议。 ? .height为155,使用setData。范围:

    data: {
        name: '蜡笔小新',
        info: {
            height: 140, color: '黄色',
            desc: [{ age: 8 }, '最喜欢大象之歌', '靓仔', { dog: '小白', color: '白色' }]
        }
    }

    例如,对于某些条件,您需要将info.height更改为155,并更改 .desc

    到数组中的 0 个元素。如果age
  • 是12岁,而第三个元素中的color是灰色怎么办?
    // 先取出要改变的对象,改变数字后 setData 回去
    const { info } = this.data
    info.height = 155
    info.desc[0].age = 12
    info.desc[3].color = '灰色'
    this.setData({ info })
    
    // 或者像某些文章里介绍的,这样可读性差,也不太实用
    this.setData({
        'info.height': 155,
        'info.desc[0].age': 12,
        'info.desc[3].color': '灰色'
    })

    上面的两种方法是我们日常小程序中经常用到的。与其他基于网络的系统相比,它们非常弱,并且给人一种强烈的半成品印象。有没有这样的方法:

    this.upData({
        info: {
            height: 155,
            desc: [{ age: 12 }, , , { color: '灰色' }]
        }
    })

    这个方法会帮助我们深入嵌套对象中修改相应的属性值,跳过我们不想修改的数组元素,直接设置属性值即可。以及我们提供的数组对象。这不是会删除很多坏代码吗?阅读能力也非常好。

    这就是为什么我在线项目中使用wx-updata而不是setData

    wx-updata的原理很简单。例子:

    this.upData({
        info: {
            height: 155,
            desc: [{ age: 12 }]
        }
    })
    
    // 会被自动转化为下面这种格式,
    // this.setData({
    //    'info.height': 155,
    //    'info.desc[0].age': 12,
    // })

    原来这个转换任务需要我们去做,我们必须手动去做,但是现在wx-updata帮我们做了,对吧! ?使用 setDataupData 相同:

    // app.js 中挂载
    import { updataInit } from './miniprogram_npm/wx-updata/index'  // 你的库文件路径
    
    App({
        onLaunch() {
            Page = updataInit(Page, { debug: true })
        }
    })
    
    // 页面代码中使用方式
    this.upData({
        info: { height: 155 },
        desc: [{ age: 13 }, '帅哥'],
        family: [, , [, , , { color: '灰色' }]]
    })

    某些系统可能对

  • Page 可能不是最佳选择方式太多了。 wx-updata 公开工具模式。用户可以直接使用页面代码中的工具方法进行处理:
    // 页面代码中
    import { objToPath } from './miniprogram_npm/wx-updata/index'  // 你的库文件路径
    
    Page({
        data: { a: { b: 2}, c: [3,4,5]},
    
        // 自己封装一下
        upData(data) {
            return this.setData(objToPath(data))
        },
    
        // 你的方法中或生命周期函数
        yourMethod() {
            this.upData({ a: { b: 7}, c: [8,,9]})
        }
    })

    在更改文件夹中的指定对象时,可能会出现跳过目录中的空白区域,wx-updata提供了Empty的Symbol类型的替换,如以及数组中对象的路径方法。如果有兴趣,可以参考wx-updata的文档,也可以参考《开发微信小程序,我为什么放弃setData而使用upData》这篇介绍性文字。

    另外,使用wx-updata后也可以使用原来的setData。尤其是有时候需要清理数组时,可以轻松使用它来获得更好的小程序开发体验。祝大家小程序开发顺利吗?

    4.使用scss编写样式

    4.1 Webstorm配置方法

    关于文件中使用的蹩脚.wxss❀工具❀❀ scss文件编辑编译实时保存在一个文件中.wxss ,我感觉比较好用。这里把我的配置分享给大家:

    微信小程序开发小技巧: Promise 化、scss 写样式 、Webstorm 配置方法

    然后记得在.gitignore文件中添加ignore方法:

    *.scss
    *.wxss.map

    这样,include到git中,scss文件就不会上传了~当然,如果你的团队成员需要scss,建议上传到git时添加scss文件。

    这个条件之后,本地就会出现这样的元素

    微信小程序开发小技巧: Promise 化、scss 写样式 、Webstorm 配置方法

    其中,我们应该看的是.js.js.js .js。更改文件后,会自动生成并更新scss.wxml文件和另一个文件.wxss,并更新.w x SS 地图是插件自动生成的地图连接,不用管。

    如果你没有使用webstorm,可以直接执行命令sass --watch index.scss:index.wxss -s Expanded。如果关闭命令行,sass命令将不会跟踪文件更改然后进行编译。所以最好使用插件编辑器。

    同样,你也可以使用small、stylus等准备好的语言。 ?附加帮助:

    "easysass.formats": [
      {
        "format": "expanded",
        "extension": ".wxss"
      },
      {
        "format": "compressed",
        "extension": ".min.wxss"
      }
    ]

    上面的展开的是编译后的.wxss文件,下面的”.wxs s 文件格式,如果满足以下条件不需要的话,你可以把下面的软件去掉,然后在文件.gitignore中添加忽略中间方法:

    *.scss

    当然可以不添加,如果你的同事也用scss来设计的话小程序,其他都和上面一样。现在你可以愉快地使用scss来开发小程序了~

    5。使用iconfont图标

    在Web开发中,iconfont是最常用的字体工具。 ,这里介绍如何向微信小程序添加iconfont图标。

    首先找到你想要使用的图标,点击购物车,下载到本地。

    微信小程序开发小技巧: Promise 化、scss 写样式 、Webstorm 配置方法

    是本地可用的压缩包。解压后将iconfont.css文件复制到微信小程序的styles文件夹中(也可以将其放入fonts下面想要放入的自定义中) ),将后缀更改为.wxss

    微信小程序开发小技巧: Promise 化、scss 写样式 、Webstorm 配置方法

    将样式包含在app.wxss::❀中即可将其添加到wxml中使用

    。该网站使用商标 i。小程序使用新的text标签:

    <text class="iconfont icon-my-edit" style="color: blue"></text>

    iconfont.css在本地重命名并重写流程。更好,并且不需要包含外部字体文件,但大多数情况下是不能满足的。

  • 版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门