赞
踩
官方学习文档:基础 | 微信开放文档
目录
报错:navigateTo:fail can not navigateTo a tabbar page
1.申请一个AppID
在网址:微信公众平台,点击截图中红色圈住部分
2.进入页面后,下滑到底端,点击前往注册
3.注册之后,登录小程序后台 :小程序,我们可以在菜单 “开发”-“开发设置” 看到小程序的AppID了
4.下载微信开发者工具,用上面同一个微信号登录开发者工具
5.打开开发者工具,点击新建小程序,输入AppID
6.新建后,创建云服务openid
官方文档:微信开放文档
在开发者工具工具栏左侧,点击 “云开发” 按钮
点击开通按钮,然后按照提示进行
注:AppID 首次开通云环境后,需等待大约 10 分钟方可正常使用云 API,在此期间官方后台服务正在做准备服务,如尝试在小程序中调用云 API 则会报 cloud init error:{ errMsg: "invalid scope" } 的错误
7.新建云函数: “云开发”控制台内
8.找到云开发的环境ID
点击云开发控制台窗口里的设置图标,在环境变量的标签页找到环境名称和环境ID。
当云开发服务开通后,我们可以在小程序源代码cloudfunctions文件夹名看到你的环境名称。如果在cloudfunctions文件夹名显示的不是环境名称,而是“未指定环境”,可以鼠标右键该文件夹,选择“更多设置”,然后再点击“设置”小图标,选择环境并确定。
9.指定小程序的云开发环境
打开开发者工具中打开源代码文件夹miniprogram里的app.js,在 env: 'my-env-id'处改成你的环境ID
10.微信小程序云开发获取openid报错
按照提示右键目录,问题成功解决
1.pages文件夹下新建文件夹home
2.新建文件夹home下面新建页面index,输入index后回车,自动生成文件
3.修改app.json文件
小程序根目录下的 app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。
新增任何页面都需要在app.json文件的"pages":[]内添加路径
然后需要写导航栏
- "tabBar": {
- "list": [{
- "pagePath": "pages/home/index",
- "text": "首页"
- }, {
- "pagePath": "pages/index/index",
- "text": "设置"
- }]
- },
4.简单的导航栏就完成啦
官网学习链接:小程序代码构成 | 微信开放文档
在小程序中WXML 充当的就是类似 HTML 的角色
和 HTML 非常相似,WXML 由标签、属性等等构成。
1.标签名字
HTML的标签是:div, p, span等
小程序的 WXML 用的标签是 :view, button, text
2.wx:if 这样的属性以及 {{ }} 这样的表达式
网页中我们通常会通过 JS 操作 DOM
小程序的框架也是用到了这个思路,如果你需要把一个 Hello World 的字符串显示在界面上。
WXML 是这么写 :
- <view>{{ msg }}</view>
- <button bindtap="clickMe">点击我</button>
在 JS 文件里边声明 clickMe 方法来响应这次点击操作:
- Page({
- clickMe: function() {
- this.setData({ msg: "Hello World" })
- }
- })
通过 {{ }} 的语法把一个变量绑定到界面上,我们称为数据绑定。仅仅通过数据绑定还不够完整的描述状态和界面的关系,还需要 if/else, for等控制能力,在小程序里边,这些控制能力都用 wx: 开头的属性来表达。
3.WXSS 样式:WXSS | 微信开放文档
相当于我们的css文件
新增了尺寸单位 rpx
WXSS 仅支持部分 CSS 选择器
1.微信开发工具 打开项目
2.新建个文件夹(放项目的一级或者二级目录都可以),然后把图片拷贝到这个目录下。
3.代码的两种实现方法
一种是:直接在wxml文件下使用图片标签,并且直接写出路径
<image src="路径"></image>
另一种是:
在wxml文件下使用图片标签
<image src="{{src}}"></image>
然后在js文件中设置路径
等等,等有时间的时候继续学习并且同步更新博客
先通过import引入另外一个wxml页面,然后用template组件
(1)index.wxml中template 标签的is属性与template.wxml中template 标签的name属性值相同
(2)index.wxml文件中要通过import标签声明需要使用的模板文件
index.wxml
- <!--index.wxml-->
- <import src ="./swiper.wxml"/>
- <view class="container">
- <view class="box">
- <view>学习引入另外一个页面</view>
- <template is="swiper"/>
- <view>通过template引入swiper.wxml</view>
- <text>Hello World</text>
- <image src="../images/tree.jpg"></image>
- </view>
- </view>
swiper.wxml
- <template name="swiper">
- 123哒哒哒哒哒
- </template>
在index.wxss文件内,引入样式文件,那么这个样式文件就会生效
@import "./swiper.wxss";
1.新建json wxml wxss js这四个文件
2.在swiper.json中进行自定义组件声明,也就是告诉开发者这是一个组件:
- {
- "component": true
- }
3.swiper.wxml
- <view class="container">
- <view class="testColor">{{text}}{{innerText}}</view>
- </view>
4.swiper.wxss
.testColor{color:red}
5.注册组件
在自定义组件的js文件中,需要使用 Component() 来注册组件,并提供组件的属性定义、内部数据和自定义方法,如在cpt.js中:
- Component({
- properties: {
- // 这里定义了innerText属性,属性值可以在组件使用时指定
- innerText: {
- type: String,
- value: 'default value',
- }
- },
- data: {
- // 这里是一些组件内部数据
- text:"text"
- },
- methods: {
- // 这里是一个自定义方法,将自定义组件的函数都写在这里面
- customMethod: function () {
- console.log('customMethod')
- }
- }
- })
6.使用自定义组件
在你要用组件的那个页面中引用声明.也就是在index.json文件中:
- {
- "navigationBarTitleText": "学习轮播图",
- "usingComponents": {
- "componentName": "./swiper/swiper"
- }
- }
在index.wxml中使用:(注意里面引用的组件名是上面usingComponents内的名字)
- <view class="box">
- <view>学习引入另外一个页面</view>
- <componentName inner-text="自定义组件" />
- <image src="../images/tree.jpg"></image>
- </view>
swiper.wxml
- <view class="container">
- <view class="testColor">{{text}}{{innerText}}</view>
- <view class="page-body">
- <view class="swiperContainer">
- <swiper indicator-dots="{{indicatorDots}}"
- autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}" current="{{currentIndex}}">
- <block wx:for="{{imgUrls}}" wx:key="*this">
- <swiper-item>
- <image src="{{item}}" class="slide-image"/>
- </swiper-item>
- </block>
- </swiper>
- <image src="{{preImage}}" class="pre-image" bindtap="preClick"/>
- <image src="{{nextImage}}" class="next-image" bindtap="nextClick"/>
- </view>
- <view class="page-section" style="margin-top: 40rpx;margin-bottom: 0;">
- <view class="weui-cells weui-cells_after-title">
- <view class="weui-cell weui-cell_switch">
- <view class="weui-cell__bd">指示点</view>
- <view class="weui-cell__ft">
- <switch checked="{{indicatorDots}}" bindchange="changeIndicatorDots" />
- </view>
- </view>
- <view class="weui-cell weui-cell_switch">
- <view class="weui-cell__bd">自动播放</view>
- <view class="weui-cell__ft">
- <switch checked="{{autoplay}}" bindchange="changeAutoplay" />
- </view>
- </view>
- </view>
- </view>
- <view class="page-section page-section-spacing">
- <view class="page-section-title">
- <text>幻灯片切换时长(ms)</text>
- <text class="info">{{duration}}</text>
- </view>
- <slider bindchange="durationChange" value="{{duration}}" min="500" max="2000"/>
- <view class="page-section-title">
- <text>自动播放间隔时长(ms)</text>
- <text class="info">{{interval}}</text>
- </view>
- <slider bindchange="intervalChange" value="{{interval}}" min="2000" max="10000"/>
- </view>
- </view>
- </view>
swiper.js
- Component({
- properties: {
- // 这里定义了innerText属性,属性值可以在组件使用时指定
- innerText: {
- type: String,
- value: 'default value',
- }
- },
- data: {
- // 这里是一些组件内部数据
- someData: 1,
- text: "text",
- background: ['red', 'green', 'yellow'],
- imgUrls: ["../../images/people.jpg", "../../images/tree.jpg"],
- preImage: "../../images/left.png",
- nextImage: "../../images/right.png",
- currentIndex: 0,//当前所在页面的 index
- indicatorDots: true, //是否显示面板指示点
- autoplay: false, //是否自动切换
- interval: 3000, //自动切换时间间隔,3s
- duration: 1000, //滑动动画时长1s
- circular: true, //是否采用衔接滑动
- vertical: false
- },
- methods: {
- // 是否要指示点
- changeIndicatorDots() {
- this.setData({
- indicatorDots: !this.data.indicatorDots
- })
- },
- // 是否自动轮播
- changeAutoplay() {
- this.setData({
- autoplay: !this.data.autoplay
- })
- },
- // 更改轮播切换时间
- intervalChange(e) {
- this.setData({
- interval: e.detail.value
- })
- },
- // 更改自动播放间隔时长
- durationChange(e) {
- this.setData({
- duration: e.detail.value
- })
- },
- //点击切换到上一张图片
- preClick: function (e) {
- if (this.data.currentIndex > 0) {
- this.setData({
- currentIndex: this.data.currentIndex - 1
- })
- } else {
- this.setData({
- currentIndex: this.data.currentIndex + 1
- })
- }
- },
- //点击切换到下一张图片
- nextClick: function (e) {
- if (this.data.currentIndex >= 1) {
- this.setData({
- currentIndex: 0
- })
- } else {
- this.setData({
- currentIndex: this.data.currentIndex + 1
- })
- }
- }
- }
- })
1、在微信开发者工具中找到上传按钮,上传当前代码
2、到微信公众平台登录-版本管理:微信公众平台
1、Component组件生命周期
- const app = getApp()
-
- Component({
- behaviors: [require('miniprogram-computed')],
- /**
- * 使用全局样式属性
- */
- options: {
- addGlobalClass: true
- },
- /**
- * 组件的属性列表
- */
- properties: {
- },
- /**
- * miniprogram-computed提供计算属性
- */
- computed: {
- },
- /**
- * 自带的监听器
- */
- observers: {
- },
- /**
- * miniprogram-computed提供监听器
- */
- watch: {
- },
- /**
- * 组件的初始数据
- */
- data: {
- },
- /*组件生命周期*/
- lifetimes: {
- created: function () {
- console.log("在组件实例刚刚被创建时执行")
- },
- attached: function () {
- console.log("在组件实例进入页面节点树时执行")
- },
- ready: function () {
- console.log("在组件在视图层布局完成后执行")
- },
- moved: function () {
- console.log("在组件实例被移动到节点树另一个位置时执行")
- },
- detached: function () {
- console.log("在组件实例被从页面节点树移除时执行")
- },
- error: function () {
- console.log("每当组件方法抛出错误时执行")
- }
- },
- /*组件所在页面的生命周期 */
- pageLifetimes: {
- show: function () {
- // 页面被展示
- console.log("页面被展示")
- },
- hide: function () {
- // 页面被隐藏
- console.log("页面被隐藏")
- },
- resize: function (size) {
- // 页面尺寸变化
- console.log("页面尺寸变化")
- }
- },
- /**
- * 组件的方法列表
- */
- methods: {
- }
- })
2、页面生命周期
-
- // pages/a.js
- Page({
-
- /**
- * 页面的初始数据
- */
- data: {
-
- },
- /*页面生命周期*/
- onReady: function () {
- console.log('监听页面初次渲染完成')
-
- },
- onShow: function () {
- console.log('监听页面显示')
- },
- onHide: function () {
- console.log('监听页面隐藏')
-
- },
- onUnload: function () {
- console.log('监听页面卸载')
- },
-
- /**
- * 页面相关事件处理函数--监听用户下拉动作
- */
- onPullDownRefresh: function () {
-
- },
-
- /**
- * 页面上拉触底事件的处理函数
- */
- onReachBottom: function () {
-
- },
-
- /**
- * 用户点击右上角分享
- */
- onShareAppMessage: function () {
-
- }
- })
-
1、父传子
子组件:假设名字为child
- properties:{
- passValue:{
- type:String, //数据类型
- value: '', //默认值
- }
- }
- //组件js文件内有一个事件
- methods:{
- handleTest(){
- let value = '打印'
- this.triggerEvent('pass',value )
- }
- }
父页面
- //wxml文件1、首先必须定义id
- <child bind:pass="open" passValue="123"/>
- //js文件
- open(val){
- console.log(val)
- },
2、子传父
子组件:假设名字为child
- //组件js文件内有一个事件
- methods:{
- handleTest(){
- console.log('打印')
- }
- }
父页面
- //wxml文件1、首先必须定义id
- <child id = 'child'/>
- <view bindtap="open"></view>
- //js文件
- onReady:function(){
- this.child = this.selectComponent('#child')
- },
- open(){
- this.child.handleTest()
- },
1、IOS微信小程序页面滚动导致滚动穿透的解决办法
第一步:修改对应页面的.json文件
设置页面的 disableScroll: true 属性,该属性需要配合 enablePullDownRefresh: false 使用, disableScroll: true 该属性是禁止页面的滚动,可以解决ios页面滚动的问题
第二步:修改对应页面的.wxml文件
需要设置页面最外层的样式:height: 100vh;overflow-y: scroll; 设置该样式是为了当此页面内容超出100vh时可以实现内容滚动
从而就可以实现页面禁止滚动,而超出页面的内容可以滚动。
<view style="background-color:{{testData == 1 ?'#f5f5f5':''}};margin-bottom:{{newMarginBottom}}rpx"></view>
- .wxml文件
- <view bindtap="change" data-id="{{1}}"></view>
- .js文件
- change(e){
- const id = e.currentTarget.dataset.id
- }
- wx.setNavigationBarTitle({
- title:'新的导航栏文案'
- })
.wxml页面(引用了vant的遮罩)
- <view bindtap="handleShow" class="box">
- <view wx:if="{{show}}" class="newPopBox">
- <view>测试</view>
- </view>
- </view>
-
- ...
- <van-overlay show = '{{show}}' bind:click="closeShow">
.js页面
- ...
- data:{
- show:false,
- }
- ...
- methods:{
- handleShow(){
- this.setData({
- show:true,
- })
- },
-
- closeShow(){
- this.setData({
- show:false,
- })
- },
- }
.less页面
- .box{
- position:relative;
- .newPopBox{
- z-index:999;
- width:256rpx;
- height:180rpx;
- border-radius:16rpx;
- position:absolute;
- top:60rpx;
- left:-52rpx;
- background:#fff;
- }
- .newPopBox:after{
- border:12rpx solid transparent;
- border-bottom:12rpx solid #fff;
- content:'';
- position:absolute;
- top:-24rpx;
- right:32rpx;
- }
- }
解决方法
判断你要跳转的页面是否是tarBar内的页面,然后选用下面对应的方法
方法一:使用switchTab,switchTab用于跳转tarbar内的页面:
- wx.switchTab({
- url: '../job/job',
- })
方法二:使用redirectTo,navigateTo跳转不是tarBar内的页面:(在模拟器上不报错,在真机上报错)
- wx.redirectTo({
- url: '../logs/logs',
- })
wx.redirectTo
通过wx.redirectTo跳转的页面,前一个页面不会缓存在路由history,所以右滑动只是会退出小程序
wx.exitMiniProgram({})
该事件需要执行点击事件才会生效
因为一些兼容问题,在ios上通过 wx.onPullDownRefresh 下拉后的部分尔尔会出现无法恢复下拉前的状态。这里只要等我们的下拉请求完后通过wx.stopPullDownRefresh() 让页面恢复原状就好了。
- onPullDownRefresh: function () {
- this.setData({
- pageNum: 1,
- theEnd:false
- }, () => {
- this.getList().then(res=>wx.stopPullDownRefresh())
- })
- },
把input组件换成textarea组件,因为textarea组件有个fixed属性
如果对于textarea高度没啥要求,直接用下面的代码
<textarea placeholder-class="placeholder-class" auto-height fixed class="input" placeholder="请填写"></textarea>
如果需要限制textarea高度,用下面的代码
- <textarea placeholder-class="placeholder-class" auto-height fixed class="input" placeholder="" value="{{searchName}}"></textarea>
- <text class="search-placeholder" wx:if="{{!searchName}}">请填写</text>
-
-
-
- .search-placeholder{
- position:absolute;top:32rpx;left:102rpx;color:#999;z-index:0;font-size:28rpx;
- }
- .input{
- position:relative;height:72rpx;line-height:72rpx;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。