radio
<!-- radio必需要搭配父元素radio-group来使用 -->
<radio-group bindchange="handleChange">
<radio value="male">男</radio>
<radio value="female">女</radio>
<view>
你选中的是{{gender}}
</view>
</radio-group>
gender: ""
handleChange(e) {
let gender = e.detail.value;
this.setData({
gender
})
}
checkbox
<checkbox-group bindchange="handleItemChange">
<checkbox wx:for="{{list}}" value="{{item.value}}" wx:key="id">
{{item.name}}
</checkbox>
</checkbox-group>
<view>
选中的水果:{{checklist}}
</view>
checklist: []
handleItemChange(e) {
let checklist = e.detail.value;
this.setData({
checklist
})
},
自定义组件
1、创建components文件夹(与page同级)
2、新增组件
3、声明组件
//home.json
{
"usingComponents": {
"tabs":"../../components/Tabs/tabs"
}
}
4、使用组件
<!--home.wxml-->
<tabs></tabs>
5、定义组件
<view class="tabs">
<view class="tabs_title">
<view wx:for="{{tabs}}" wx:key="id" class="tabs_item {{item.isActive?'active':''}}" bindtap="itemTap" data-index="{{index}}">
{{item.name}}
</view>
</view>
<view class="tabs_content">内容</view>
</view>
methods: {
itemTap(e) {
// 1 绑定点击事件
// 2 获取被点击的索引
// 3 获取原数组
// 4 对数组循环
// 1给每一个循环性 选中属性 改为 false
// 2给当前索引的项添加激活选中效果
//获取索引
const { index } = e.currentTarget.dataset;
//获取data中的数组
//解构:对复杂类型进行解构的时候,复制了一份变量的引用
//最严谨的做法 重新拷贝一份数组 再对这个数组的备份进行处理
//深拷贝
// let tabs=JSON.parse(JSON.stringify(this.data.tabs))
let { tabs } = this.data;
// let tabs = this.data.tabs;
//循环数组
tabs.forEach((v, i) => i === index ? v.isActive = true : v.isActive = false);
this.setData({
tabs
})
}
}
父传子
1、在父组件定义
<!-- 父组件向子组件传值 通过标签属性的方式来传递
<tabs tabs="{{tabs}}"></tabs>
//home.js
tabs: [{
id: 0,
name: "首页",
isActive: true
},
{
id: 1,
name: "原创",
isActive: false
},
{
id: 2,
name: "分类",
isActive: false
}, {
id: 3,
name: "关于",
isActive: false
}
]
2、在子组件接收properties:{}
//tabs.js
properties: {
//要接受数据的名称,把它当成data里面的数据使用即可
tabs: {
type: Array,
value: []
}
},
3、在子组件中使用
<view class="tabs_title">
<view wx:for="{{tabs}}" wx:key="id" class="tabs_item {{item.isActive?'active':''}}" bindtap="itemTap" data-index="{{index}}">
{{item.name}}
</view>
</view>
<view class="tabs_content">内容</view>
子传父
1、triggerEvent(“父组件中自定义事件的名称”,要传的的参数)
//子组件的tab.js
// 触发父组件中自定义事件,同时传递数据给父组件
// this.triggerEvent("父组件中自定义事件的名称",要传的的参数)
this.triggerEvent("itemChange", { index })
2、父组件中使用
<!--父组件中使用
子向父传递数据 通过事件的方式传递
在子组件的标签上加入一个自定义事件-->
<tabs tabs="{{tabs}}" binditemChange="handleItemChangefather"></tabs>
3、
//父组件的home.js
handleItemChangefather(e) {
//自定义事件,用来接受子组件传递的数据的
const { index } = e.detail;
// let tabs=JSON.parse(JSON.stringify(this.data.tabs))
let { tabs } = this.data;
// let tabs = this.data.tabs;
//循环数组
tabs.forEach((v, i) => i === index ? v.isActive = true : v.isActive = false);
this.setData({
tabs
})
},
slot
//子组件tabs.wxml
<view>
<slot></slot>
</view>
//父组件home.wxml
<tabs tabs="{{tabs}}" binditemChange="handleItemChangefather">
<block wx:if="{{tabs[0].isActive}}">1</block>
<block wx:elif="{{tabs[1].isActive}}">2</block>
<block wx:elif="{{tabs[2].isActive}}">3</block>
<block wx:else>4</block>
</tabs>
应用生命周期
//app.js
App({
//应用第一次启动就会触发的事件
//在应用第一次启动的时候,获取用户的个人信息
onLaunch: function() {
// js方式来跳转 无法触发onPageNotFound
// wx.navigateTo({
// url: '',
// success: (result) => {
// },
// fail: () => {},
// complete: () => {}
// });
},
//应用被用户看到
onShow() {
// 对应用的数据或页面效果 重置
console.log("onshow");
},
//应用被隐藏了
onHide() {
// 暂停或者清除定时器
console.log("onHide");
},
// 应用代码发生错误
onError(err) {
//在应用发生代码报错的时候,收集用错误信息,通过异步请求,将错误信息发送到后台去
console.log(err);
},
// 页面找不到就会触发
// 应用第一次启动的时候,如果找不到第一个入口页面 才会触发
onPageNotFound() {
// 如果页面不存在了,通过js的方式来重新跳转页面,重新跳到第二个首页
//不能跳到tabbar页面
wx.navigateTo({
url: '/pages/home/home',
})
// console.log("onPageNotFound");
},
})
页面生命周期
/**
* 生命周期函数--监听页面加载
*/
onLoad: function(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function() {
},
/**
* 生命周期函数--监听页面隐藏 可以通过点击超链接来演示
*/
onHide: function() {
},
/**
* 生命周期函数--监听页面卸载 也是可以通过点击超链接来演示
*/
onUnload: function() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function() {
},
/**
* 页面滚动就可触发
*/
onPageScroll(){
},
/**
* 页面尺寸发生改变时触发
* 小程序发生了横屏竖屏切换时触发
*/
onResize(){
},
/**
* 必须要求当前页面也是tabbar页面
* 点击的自己的tab item的时候才触发
*/
onTabItemTap(){
}
小程序的第三方框架
1、腾讯 wepy 类似vue
2、美团 mpvue语法 类似vue
3、京东 taro 类似react
4、滴滴 chameleon
5、uni-app 类似vue
项目搭建
1、搭建页面基本结构
2、页面
接口使用
onLoad: function(options) {
//1、发送异步请求
wx.request({
url: 'http://182.92.68.5/my.json',
success: (result) => {
console.log(result);
this.setData({
swiperlist: result.data.image
})
},
});
}
将原生请求修改为Promise方式
1、在request文件夹下创建一个index.js
//封装
export const request = (params) => {
return new Promise((resolve, reject) => {
wx.request({
...params,
success: (result) => {
resolve(result);
},
fail: () => {
reject(err);
}
});
})
}
2、导出使用
import {
request
} from "../../request/index"
onLoad: function(options) {
this.getSwiperdata();
},
//1、发送异步请求
getSwiperdata() {
request({
url: "http://182.92.68.5/my.json"
}).then(result => {
this.setData({
swiperlist: result.data.image
})
})
},
配置less为wxss文件
"less.compile": {
"outExt": ".wxss"
// "compress": true,
// "sourceMap": false, // 是否创建文件目录树,true的话会自动生成一个 .css.map 文件
// "out": false, // 是否输出css文件,false为不输出
},
两栏分别滚动
<view class="scoll_container">
<scroll-view class="left" scroll-y>
<view wx:for="{{100}}">
{{item}}
</view>
</scroll-view>
<scroll-view class="right" scroll-y>
<view wx:for="{{100}}">
{{item}}
</view>
</scroll-view>
</view>
wxss
//运算符左右两边要有空格;
//数字和单位之间不能有空格;
//括号与减数,被减数之间不能有空格;
//以上无效记得加上英文~符和双引号。
.scoll_container {
height: calc(100vh - calc(100vw/375*145));
display: flex;
}
.scoll_container .left {
flex: 2;
background-color: red;
}
.scoll_container .right {
flex: 5;
background-color: aquamarine;
}
两层结构循环
使用缓存技术
存
getSwiperdata() {
request({
url: "http://182.92.68.5/my.json"
}).then(result => {
wx.setStorageSync("cates", { time: Date.now(), data: result.data.image });
this.setData({
swiperlist: result.data.image
})
})
},
取
//获取本地存储中的数据
const Cates = wx.getStorageSync("cates");
//判断
if (!Cates) {
//不存在,发送请求获取新数据
this.getSwiperdata()
} else {
//有旧的数据,定义过期时间
if (Date.now() - Cates.time > 1000 * 10) {
//重新发送请求
this.getSwiperdata();
} else {
//可以使用旧数据
this.Cates = Cates.data;
this.setData({
swiperlist: result.data.image
})
}
}
提取公共接口路径
export const request = (params) => {
//定义公共url
const baseUrl = "http://182.92.68.5";
return new Promise((resolve, reject) => {
wx.request({
...params,
url: baseUrl + params.url,
success: (result) => {
resolve(result);
},
fail: () => {
reject(err);
}
});
})
}
优化接口
简化返回值
export const request = (params) => {
//定义公共url
const baseUrl = "http://182.92.68.5";
return new Promise((resolve, reject) => {
wx.request({
...params,
url: baseUrl + params.url,
success: (result) => {
resolve(result.data);
},
fail: () => {
reject(err);
}
});
})
}
//1、使用es7的async await来发送请求
const result = await request({ url: "/my.json" });
wx.setStorageSync("cates", { time: Date.now(), data: result.image });
this.setData({
swiperlist: result.image
})
使用es7的asysc
//1、使用es7的async await来发送请求
const result = await request({ url: "/my.json" });
wx.setStorageSync("cates", { time: Date.now(), data: result.data.image });
this.setData({
swiperlist: result.data.image
})
省略号
view{
display: -webkit-box;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
}
加载下一页onReachBottom
//es6数组拼接
let a = [1, 2, 3]
let b = [4, 5]
let c = [...a, ...b]
下拉刷新onPullDownRefresh
1、配置json
"enablePullDownRefresh": true,
"backgroundTextStyle": "dark"
2、重置数据、、、
onPullDownRefresh: function() {
this.setData({
swiperlist: []
});
this.getSwiperdata();
},
3、手动关闭
wx.stopPullDownRefresh();
放大预览图片
1、给图片绑定点击事件
<swiper autoplay interval="1000" duration="1000" circular >
<swiper-item wx:for="{{swiperlist}}" wx:key="index" bindtap="handlePrevewImage" data-url="{{item.url}}">
<image src="{{item.url}}" />
</swiper-item>
</swiper>
2、调用API
//点击轮播图放大预览
handlePrevewImage(e) {
//先构造要预览的图片数组
const urls = this.preSwiperimage.map(v => v.url);
//接收传递过来的图片url
const current = e.currentTarget.dataset.url;
wx.previewImage({
current: current, // 当前显示图片的http链接
urls: urls // 需要预览的图片http链接列表
})
},
1、this.setData,setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)
2、微信小程序不支持jQuery和DOM操作修改样式,但可以先写两套样式然后使用三元运算符
3、e.currentTarget.dataset和e.target.dataset都可以获取数据效果一样,除非遇到了事件冒泡,
target:事件源组件对象(事件冒泡源头)
currentTarget:当前组件对象(就是当前对象)
dataset:HTMLElement.dataset属性允许无论是在读取模式和写入模式下访问在 HTML或 DOM中的元素上设置的所有自定义数据属性(data-*)集。
登录
<button type="primary" plain open-type="getUserInfo" bindgetuserinfo="handleGetUserInfo">登录</button>
handleGetUserInfo(e) {
console.log(e);
const {
userInfo
} = e.detail;
wx.setStorageSync("userinfo", userInfo);
wx.navigateBack({
delta: 1
});
},
在用户中心拿出登录的数据
onShow: function() {
const userinfo = wx.getStorageSync("userinfo");
this.setData({
userinfo
})
},
高斯模糊
filter:blur(5px);//值越大越模糊
set和e.target.dataset都可以获取数据效果一样,除非遇到了事件冒泡,
target:事件源组件对象(事件冒泡源头)
currentTarget:当前组件对象(就是当前对象)
dataset:HTMLElement.dataset属性允许无论是在读取模式和写入模式下访问在 HTML或 DOM中的元素上设置的所有自定义数据属性(data-*)集。
# 登录
登录
handleGetUserInfo(e) {
console.log(e);
const {
userInfo
} = e.detail;
wx.setStorageSync(“userinfo”, userInfo);
wx.navigateBack({
delta: 1
});
},
# 在用户中心拿出登录的数据
onShow: function() {
const userinfo = wx.getStorageSync(“userinfo”);
this.setData({
userinfo
})
},
# 高斯模糊
filter:blur(5px);//值越大越模糊