小程序开发入门
微信小程序开发入门
配置 tabBar
tabBar 相当于路由,最少配置 两个,每个配置项会匹配一个 page,配置后会在页面底部生成导航菜单。当点击下方的导航时,会跳转到对应的页面。
"tabBar": {
"selectedColor": "#d81e06",
"color": "#515151",
"list": [
{
"pagePath": "pages/playlist/playlist",
"text": "音乐",
"iconPath": "images/bottomNavIcon/music.png",
"selectedIconPath": "images/bottomNavIcon/music-checked.png"
},{
"pagePath": "pages/blog/blog",
"text": "动态",
"iconPath": "images/bottomNavIcon/release.png",
"selectedIconPath": "images/bottomNavIcon/release-checked.png"
}
]
},
配置项中,pagePath 表示对应的 page 路径;text 表示要显示的文案;
iconPath表示没有选中时的图标路径;selectedIconPath表示选中时的图标路径(选中后,页面会切换)color为本选中时的文案颜色;selectedColor选中后的文案颜色;
事件绑定
使用 bind 绑定事件默认会有事件冒泡;而如果使用 catch 绑定事件,则不会冒泡;
原生组件,比如 textarea、input,在绑定事件时,不应使用 bind: 的方式绑定,而应使用 bindxxx 的方式绑定(不在中间加 :)。
页面与组件通信
小程序中可以使用自定义事件的方式实现页面与组件通信。组件中使用 this.triggerEvent 调用自定义的事件。
this.triggerEvent('eventName', ...args);
在页面级组件中定义事件函数,并把事件函数传给子组件。
<component bind:myEvent="eventName" />
父组件可以使用 this.selectComponent 获取到子组件的实例,然后就可以调用子组件中的方法。
// 通过类名的方式获取子组件,并调用其 updateTime 方法
this.selectComponent('.curTime').updateTime(new Date());
子组件:
<component class="curTime" />
对于在同一页面中组件与组件之间的通信,可以用页面容器组件为桥接,使用自定义事件或 selectComponent 的方式进行通信。
公共数据
A 页面在 B 页面跳转时,可以在 URL 上传递数据,但如果 B 页面的操作会影响到 A 页面(回退时页面的内容会发生变化)时,如何把 B 页面的数据回传到 A 页面?
可以使用微信小程序提供的 API,在 app.js 文件中,onLaunch 事件中可以定义 globalData 对象,它是存放公共数据的地方。
// app.js
App({
onLaunch: function () {
// 存放公共数据
this.globalData = {
a: 1
};
},
//
setA(id){
this.globalData.a = id;
},
getA(){
return this.globalData.a;
}
});
在其他页面或者组件中就可以访问到数据了。
const app = getApp();
console.log(app.getA());
引入样式类
场景:组将想要使用页面的 CSS 样式,比如使用字体图标的 class 类名,默认情况下,在组件中使用了字体图标的 class 类名,图标是是用不了的。要想使用可以这么做:
首先页面组件需要传入对应的 css 类名,例如:
<component iconfont="iconfont" />
上面代码,容器组件中给子组件 component 传入了一个 iconfont 属性,值是某个 css 的类名,也叫 iconfont。子组件要想使用这个类名,可以在自己的脚本中设置:
Component({
externalClasses: [
"iconfont"
],
// ...
});
需要注意的是,引入的 class 类名是“只读的”,即在组件的 wxss 中我们不能再使用该类名编辑样式了,这是没有效果的,你应该再起一个类名。
除了使用 externalClasses 之外,还可以给组件设置 styleIsolation 配置项:
Component({
options: {
styleIsolation: 'isolated'
}
});
设置完之后,就可以直接使用页面级组件中的 css 样式了,也不用设置 externalClasses。isolated 表示表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响。
如果 styleIsolation 的值设置成 shared 则表示自定义组件 wxss 中指定的样式和页面的样式会相互影响。
获取用户信息
四种方式:
- 使用
open-data
例如:
<!-- 展示用户头像 -->
<open-data type="userAvatarUrl"></open-data>
<!-- 展示用户昵称 -->
<open-data type="userNickName"></open-data>
<!-- 展示用户所在城市 -->
<open-data type="userCity"></open-data>
open-data 获取的用户信息只能用作展示,并且只能展示用户自己的信息。这不需要通知用户授权,因为这些信息只有用户自己可见。
- 使用
wx.getUserInfoAPI。
它可以获取到用户的昵称、头像、性别、所在城市等信息。但这种情况下必须是在用户已经授权的情况下,才可以获取到。
wx.getUserInfo({
success: (res) => {
console.log();
}
});
- 创建一个按钮,由用户点击,小程序弹出模态框,询问用户是否授权获取用户信息。比如:
<button open-type="getUserInfo" bindgetuserinfo="onGetUserInfo">
获取用户信息
</button>
上面代码中的 button 按钮是特殊的,他有 open-type 属性和 bindgetuserinfo 属性,前者表示这时一个获取用户信息的按钮,后者表示当用户点击后触发的事件函数。事件函数需要我们自己定义,它有一个 event 对象参数。
onGetUserInfo(event){
console.log(event);
}
- 使用云函数获取用户的 openid
前两种方式是获取不到 openid 的。传统模式下,即有后端服务器,可以再小程序端调用 wx.login 从微信服务器中获取 code,然后调用 ex.request 将 code 传递给后端服务器,后端服务器拿到 code 后,需要请求微信服务器获取 openid 和 session_key,获取到之后就可以 把用户标识(openid)发给小程序,并本地存储。
在云开发模式下,用户可以点击按钮,然后触发事件,从云函数中获取到用户信息,在小程序端还可以将用户信息存储到小程序的云数据库中。
在云开发中,小程序自带一个 login 云函数,我们可以让用户点击按钮后,调用云函数获取 openid。
<button bindtap="getOpenid">获取openid</button>
会发现,button 只是一个普通的按钮,其实我们也并不需要用户点击,直接调用云函数即可。
getOpenid(){
wx.cloud.callFunction({
name: 'login'
}).then(res => {
console.log(res);
});
}
需要注意的是,返回的 res 中会有 openid,如果你想使用 openid 获取用户的个人信息,比如昵称、头像等,目前是做不到的,因为获取 openid 是不需要用户授权的,在用户没有授权的情况下(不知情)就可以获取到用户信息,对于用户信息是不安全的(涉及到用户的隐私)。
