微信小程序学习笔记

55 阅读6分钟

1. 配置文件:路由

"pages":[
    "pages/index/index",
    "pages/class/class",
    "pages/show/show",
    "pages/message/message",
    "pages/home/home"
  ]

路由跳转:

wx:navigateTo({
    url:"pages/index/index"
})

2. 配置文件:window

"window":{
    "navigationBarBackgroundColor":"#ff0",
    "navigationBarTitleText":"我的小程序",
    "navigationBarTextStyle":"black"
  },

3. 路由跳转

wx.navigateTo 跳转后保留跳转记录

<button bindtap="jump">button</button>
// 按钮跳转事件
  jump(){
    wx:wx.navigateTo({
      url: '/pages/home/home'
    })
  }

url 不能优后缀,self 是在当前小程序内打开

<navigator
  target="self"
  url="/pages/home/home"
  open-type="navigate"
>
  <button>跳转</button>
</navigator>

路由返回:使用open-type="navigateBack"路由返回,使用delta="1"规定返回几层

<navigator
  target="self"
  open-type="navigateBack"
  delta="1"
>
  <button>返回</button>
</navigator>

3.1 路由传参

使用 ?传参

<navigator
  target="self"
  url="/pages/home/home?id=001"
>
  <button>跳转</button>
</navigator>

跳转后的页面,接参时直接接收到传的 json 参数

onLoad: function (options) {
    console.log(options);
  },

获取 app中数据

var app = getApp()

4. 配置文件:导航栏

"tabBar":{
    "color": "#333333",				//未选中文本颜色
    "selectedColor": "#00ff00",		//选中文本颜色
    "backgroundColor": "#eeeeee",	//背景颜色
    "list":[						//导航列表
      {
        "pagePath":"pages/index/index",				//路由
        "text":"首页",							   //导航文本
        "iconPath":"logo/shouye.png",				//未选中图标
        "selectedIconPath": "logo/shouye-ch.png"	//选中图标
      },
      {
        "pagePath":"pages/class/class",
        "text":"分类",
        "iconPath":"logo/fenlei.png",
        "selectedIconPath": "logo/fenlei-ch.png"
      },
      {
        "pagePath":"pages/show/show",
        "text":"展示",
        "iconPath":"logo/zhanshi.png",
        "selectedIconPath": "logo/zhanshi-ch.png"
      },
      {
        "pagePath":"pages/message/message",
        "text":"消息",
        "iconPath":"logo/xiaoxi.png",
        "selectedIconPath": "logo/xiaoxi-ch.png"
      },
      {
        "pagePath":"pages/home/home",
        "text":"我的",
        "iconPath":"logo/home.png",
        "selectedIconPath": "logo/home-ch.png"
      }
    ]
  }

5. 数据绑定

<view> {{ message }} </view>
Page({
  data: {
    message: 'Hello world!'
  }
})

6. 条件渲染

wx:ifhidden

<view wx:if="{{index==n}}" >
	<text>{{item.msg}}</text>
</view>
<!-- 不会生成标签,在条件渲染时使用 -->
<block></block>

7. 列表渲染

key 属性直接写,不用加 {{ }}

<view wx:for="{{list}}" wx:for-index="key" wx:for-item="val" wx:key="id" >
	<text>{{key}} - {{val.msg}}</text>
</view>

8. 绑定事件

  1. 一般点击事件用 bindtap
  2. 事件传参时不是直接传,需要用一个自定义属性
  3. data-index="{{index}}"
  4. 事件函数中用 event.currentTarget.dataset.index 接收
  5. 需要 this.setData({ }) 引起页面自动渲染
<button bindtap="func" data-index="{{index}}">{{item.title}}</button>
func: function(ev){
    this.setData({
      n: ev.currentTarget.dataset.index
    })
  }
  1. bind:绑定事件,事件可以冒泡
  2. catch:绑定事件,事件不能冒泡(阻止事件冒泡)

9. 场景值

**场景值:**就是用户通过什么方式进入的小程序

// 获取场景值一
var scene = wx.getLaunchOptionsSync().scene;
console.log(scene);
// 获取场景值二
onLaunch(options){
	var scene = options.scene;
	console.log(scene);
}

10. 生命周期函数

Page({
  // 页面加载完成
  onload(){
    console.log("load");
  },
  // 页面展示
  onShow(){
    console.log("show");
  },
  // 小程序切换后台时
  onHide(){
    console.log("hide");
  },
  // 页面不存在时
  onPageNotFound(){
    console.log("404");
  },
  // 页面下拉刷新
  onPullDownRefresh(){
    console.log("下拉");
  },
  // 页面到底上拉
  onReachBottom(){
    console.log("触底上拉");
  }
})

11. 模板

定义模板时需要写一个 name 属性

<!-- 定义模板 -->
<template name="nav">
  <view class="nav_box" wx:for="{{arr}}" wx:key="*this">
    <text>{{item}}</text>
  </view>
</template>

**data:**data里是传给模板的值

<!-- 使用模板-->
<import src="/template/nav.wxml" />
<template is="nav" data="{{arr}}"></template>

使用 @import 引入其他样式表

@import '/assets/nav.wxss'

12. 组件

1. view 视图容器

<view></view>						<!-- 视图容器:<div> -->
hover-class = "none"				<!-- 按下去的样式 -->
hover-stop-propagation = "false"	<!-- 阻止事件冒泡 -->
hover-start-time = "50"				<!-- 按下一段时间 (ms) -->
hover-stay-time = "600"				<!-- 弹起后点击状态延迟消失 -->

2. icon 图标

<icon></icon>				<!-- 默认图标 -->
type = "success"			<!-- 图标类型 -->
	   "success_no_circle"
	   "info"
	   "warn"
	   "waiting"
	   "cancel"
	   "download"
	   "search"
	   "clear"
size = "23"		<!-- 图标大小 -->
color			<!-- 图标颜色 -->

3. text 文本

<text></text>			<!-- 文本 -->
selectable = "false"	<!-- 文本是否可选 -->
space					<!-- 显示连续空格 -->
decode					<!-- 是否解码 -->

4. rich-text 富文本

使用特殊文本标签:如h1~h6

<rich-text nodes="<h1>hello</h1>"></rich-text>
nodes				<!-- array/string  节点列表/HTML String -->
space = "nbsp"		<!-- 显示多个空格 (&nbsp;) -->

5. image 图片

<image></image>			<!-- 图片 -->
src						<!-- 图片资源地址 -->
mode = "scaleToFill"	<!-- 图片裁剪、缩放的模式 -->
lazy-load = "false"		<!-- 图片懒加载 -->

13. 数据双向绑定

使用 model 双向绑定数据

<input model:value="{{msg}}"></input>

表单数据:在 form 中绑定函数,获取表单数据。获取表单数据时必须使用 name 属性

<form bindsubmit="sub">
账号:<input name="name" value="{{user.name}}"></input>
密码:<input name="pass" value="{{user.pass}}"></input>
<button
  form-type="submit"
>提交</button>
</form>

使用 ev.detail.value 获取表单数据

Page({
  // data
  data: {
    user:{
      name:"",
      pass:""
    }
  },
  //事件处理函数
  sub(ev){
    console.log(ev.detail.value);
  }
})

14. 音频播放

使用 wx.createInnerAudioCOntext() api接口实现音频播放

<button bindtap="player">music</button>
player(){
    var music = wx.createInnerAudioCOntext();
    music.src = "/1.mp3";
    music.play();
}

15. 模块化

定义模块:common.js

两种打包方式

// common.js
function sayHello(val){
  console.log(`hello ${val}`);
}

// 方式一:打包
module.exports.sayHello = sayHello
// 方式二:引用包
exports.sayHello = sayHello

require引入包才能使用

// index.js
// 引入包
var comm = require('common.js')

Page({
  //事件处理函数
  btnClick(){
    comm.sayHello("123")
  }
})

16. 数据请求

wx.request({
  url: 'url',
  method: 'get',
  data:{},
  header:{
    "content-type": "application/json"
  },
  success:(res)=>{
    console.log(res);
  },
  fail:(err)=>{
    console.log(err);
  }
})

封装

const ajax = (url,method,data)=>{
  return new Promise((res,rej)=>{
    wx.request({
      url,
      method,
      data,
      header:{
        "content-type": "application/json"
      },
      success:(data)=>{
        res(data)
      },
      fail:(err)=>{
        rej(err)
      }
    })
  })
}

export default ajax;

17. 本地存储

1. 存储

// 异步存储
wx.setStorage({
  data: "hello world",
  key: 'title',
  success:(res)=>{
    console.log(res);
  },
  fail: (err)=>{
    console.log(err);
  }
})
// 同步存储
wx.setStorageSync('name', "微信小程序")

2. 查询

// 异步查询
wx.getStorage({
  key: 'title',
  success: (res)=>{
    console.log(res);
  },
  fail: (err)=>{
    console.log(err);
  }
})
// 获取本地存储的所有信息
wx.getStorageInfo({
  success (res) {
    console.log(res.keys)
    console.log(res.currentSize)
    console.log(res.limitSize)
  }
})
// 同步查询
var res = wx.getStorageSync('name')
console.log(res);
// 获取本地存储的所有信息
try {
  const res = wx.getStorageInfoSync()
  console.log(res.keys)
  console.log(res.currentSize)
  console.log(res.limitSize)
} catch (e) {
  // error
}

3. 删除

// 异步删除
wx.removeStorage({
  key: 'title',
  success: res=>{
    console.log(res);
  },
  fail: err=>{
    console.log(err);
  }
})
// 同步删除
wx.removeStorageSync('name')

18. WEUI

  1. 安装

    npm install weui-miniprogram
    
  2. 配置

    工具 --> 构建npm

    详情 --> 本地配置 --> 使用 npm 模块

  3. 引入 app.wxss

    @import '/miniprogram_npm/weui-miniprogram/weui-wxss/dist/style/weui.wxss';
    

19. mpvue 框架

  1. 安装vue脚手架

  2. 创建项目

    vue init mpvue/mpvue-quickstart my-project
    
  3. 安装包

    npm install
    
  4. 启动

    npm run dev
    
  5. 项目目录

    index
    	index.vue	//页面,组件
    	main.js		//导出组件 (文件名固定)
    	main.json	//配置文件 (文件名固定)
    
  6. 不支持的语法

    1. v-html不支持
    2. 不支持过滤器
    3. 不支持在 template 内使用 methods 中的函数
    4. 不支持在组件上使用class style
    5. 列表渲染 需要索引 index
    6. 事件修饰符 .stop ,其他的都不支持

20. API

1. 动态设置当前页面标题

wx.setNavigationBarTitle({
  title: "title"
})

2. 跳转页面 (带参)

wx.navigateTo({
  url: "/pages/list/main?type="+data
});

21. Vue 小程序

// 设置标题
document.title = "页面标题";
// 事件监听
window.addEventListener([事件类型(click)], [调用的函数(函数名)], [冒泡还是捕获]);
// 删除事件
window.removeEventListener();

* 问题

1. wx:key 报错:does not look like a valid key name

看起来不像一个有效的键名

直接写 wx:key=id,不用加 {{}}

2. does not have a method to handle event "tap"

没有方法来处理事件“tap”。

1.事件传参时不能直接传参
2.用自定义属性传参
3.事件函数中用event接收
如:
<button bindtap="func" data-index="{{index}}">{{item.title}}</button>
<script>
func: function(ev){
    this.setData({
      n: ev.currentTarget.dataset.index
    })
  }
</script>

3. 根据 sitemap 的规则[0],当前页面 [pages/class/class] 将被索引

在小程序项目配置文件 project.config.jsonsetting 中加入

"checkSiteMap": false,

4. the server responded with a status of 500

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mM1nVl0p-1661839632797)(F:\Markdown\upload\20190820235806120.PNG)]

1.渲染层网络层错误
2.检查图片路径

5. Cannot set property 'data' of undefined

有时候使用 this 时会出现  undefined  的情况

data () {
  return {
    data:[]
  }
},
// 全部对象
var app = getApp();	
app.globalData.data=[1,2];
console.log(app.globalData.data);
或者同步获取