微信小程序使用入门踩坑手册

2019-08-07  本文已影响0人  shaocx

1、先需要注册一个小程序,拿到想要的AppID

2、下载微信开发者工具,新建一个小程序(绑定的文件夹一定要是空文件夹)

3、开发过程中
3.1
使用了npm中的组件,先要在本地安装。
但是安装了之后小程序开发工具不会读到,所以引用资源不要引用这个文件夹的资源。
主要是需要去开发工具里面的 工具-构建npm 点一下,然后才算构建完成。这个构建是基于node-modules这个文件夹构建的。
具体使用的话还要去开发工具右上角详情里面,勾选 “使用 npm 模块” 才算是正式可以使用。

3.2
所有路由都要在app.json文件中添加,小程序路由不像是真正的路由,它每个路由页面都是一个单独的页面,不存在子路由。路由页面每一个重复元素都需要自己提炼书写。如果没在app.json中添加,报错信息如下

redirectTo:fail page "pages/home/home" is not found

3.3
使用icon,在小程序中使用iconfont,缺点在于没法使用多色图标,多色图标中的颜色会消失。ttf转换base64页面
另外文章中有一点没提到,下面这一个文件应该是不用再引用了。可以删掉。

代码

3.4
修改标题栏
想修改整个程序的导航栏,在app.json 文件 修改

 "window": {
    "navigationBarTitleText": "导航栏名称"
  },

想修改单页面的导航栏的,在要修改的页面文件夹中的json文件中填写以下代码即可修改

"navigationBarTitleText": " 导航栏名称"

3.5
rpx其实是微信对于rem的一种应用的规定,或者说一种设计的方案,官方上规定屏幕宽度为20rem,规定屏幕宽为750rpx。所以可以选择iphone6、7进行开发,这两个均是375,具体像素修改的时候设为rpx/2就可。

3.6
template模板简单使用

3.7
小程序默认使用的box-sizing是content-box,如有需要可以手动改成border-box。

3.8
配置底部导航tabBar的时候,只要在app.json里面配置即可,别的地方无需写代码。
同时也有问题,配置了tabBar的页面,只能使用switchTab访问,其他的navigateTo、redirectTo均无法使用

3.9
class等地方想用data属性,可以在{{}}中直接用js语法,是可以使用的。我最后代码如下:
class="home-bar-each {{type == 2 ? 'active' : ''}}"

3.10
小程序中的css不可以 .a > p 不可以.a.b,:first-child这种伪类也不行。


小程序支持的全部选择器

3.11
获取窗口高度

// 获取系统信息
wx.getSystemInfo({
  success: (res) => {
    // 获取可使用窗口宽度
    let clientHeight = res.windowHeight;
    // 获取可使用窗口高度
    let clientWidth = res.windowWidth;
    // 设置高度
    this.setData({height: clientHeight});
  }
});

3.12
组件中的class样式也不可以修改,写了也没用。
解决方法,尽量不改原来的样式,要修改,加class之后对这个class进行样式修改

3.13
小程序原生貌似现在不支持css变量写法,但是可以用组件实现。(暂未尝试)

3.14
我这边用了weui的组件,他们的searchbar组件的ext-class在声明之后,wxss改了也不生效,于是


css不生效.png

我的解决方案是将整个组件拷贝出来,然后直接改组件,加参数。(虽然是有点low,但被逼无奈)

3.15
他这边的bindtap虽然可以绑定在view上,但是实际上它里面每个元素都绑上了,随意点击事件,像我这样要取data-id,不能使用target,而是要去使用currentTarget。

<view data-id="{{item.id}}" bindtap="openDetail">
    <view class="home-list-name">{{item.name}}</view>
    <view wx:if="{{item.status == 1}}" class="home-list-status-ing">进行中</view>
    <view wx:else class="home-list-status-ed">已完成</view>
    <view class="home-list-boss-name">{{item.bossName}}</view>
</view>

3.16
wx:for 以及 wx:if 是可以写在同一行里面,for中传入的data对应的index,item都可以在同一行的if中直接使用。


for与if

3.17
wx:if 可以用在任意元素上。

3.18
setData是一个同步方法,不像React的setState是一个异步方法。

3.19
修改顶部标题分静态和动态修改。
静态修改是在.json文件中配置 "navigationBarTitleText": "首页"
动态修改是在js中调用 wx.setNavigationBarTitle({title: "添加项目记录"});方法

3.20
数据回传,当子页面修改了数据,需要传到父页面时。可以用Pages对象Pages对象里面存的是所有页面,用getCurrentPages方法可以拿到这些页面。然后可以进行修改处理。

var that = this 
var pages = getCurrentPages();
var currPage = pages[pages.length - 1];   //当前页面
var prevPage = pages[pages.length - 2];  //上一个页面

prevPage.setData({
    userName: this.data.contentStr
});

3.21
switchTab方法跳转的时候,页面不会更新,不会调用onLoad方法,如果需要手动更新可以进行如下操作

wx.switchTab({
    url: '/pages/index/index',
    success: function (e) {
        var page = getCurrentPages().pop();
        if (page == undefined || page == null) return;
        page.onLoad();
    }
})

3.22
这边在用textarea的时候发现一个问题,官方好像也不准备解决了。
具体方案:方案
另外我这边解决方案非常简单,去掉Page上设置的height:100%;就好了

textarea悬浮bug

3.23
navigateTo跳转的页面最好加上Unload的生命周期,如果没有,这个组件是没法unload的。
下次再进来这个页面是不会调用onload的。

3.24
获取元素css样式,可以使用如下方法:

let query = wx.createSelectorQuery();
query.select(".project-detail").boundingClientRect((dom)=> {
    console.log(dom.width)//width等
}).exec();

但是dom中的元素属性仅有:


元素属性

3.25
获取scrollTop值,可以从onPageScroll中获取。设置scrollTop也有专门方法,

onPageScroll: function (e) { // 获取滚动条当前位置
    console.log(e.scrollTop)
}

wx.pageScrollTo({
    scrollTop: 100
})

3.26
switchTab,只能在app.json中设置了tabBar才可以使用。
navigateTo,跳转到一个非tabBar页面,有后退按钮,会自动到scrollTop:0,onLoad只会触发一次。
redirectTo,跳转到一个非tabBar页面,不可退回上一个页面。
navigateBack,跳转回一个已经打开过的页面,不会自动scrollTop:0。

3.27
所有的data会默认执行,最好不要在data中加方法。
我在data中写了个JSON.parse(wx.getStorageSync("a")),然后如果没有这个东西的话,会影响整个程序的运行。

3.28

data: {
    loginAccountId: wx.getStorageSync('accountId'),
}

我在代码中这样使用,这个值在我重新打开小程序依旧不会改变,这样会造成问题,建议在onShow中重写。

4、资料
4.1、 小程序官方demo,组件demo / 小程序demo,git地址
4.2、 微信小程序--上传文件(图片/word等)功能
4.3、小程序api-官方

上一篇下一篇

猜你喜欢

热点阅读