[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dEpb5tol-1600061439777)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20200629113215495.png)]
前端面向客户,前端向后端发送http请求,获取数据
前端分为pc端(桌面应用=>基于操作系统,web应用=>通过浏览器显示),移动端(h5,原生APP,基于app的二级生态=>基于微信等平台的程序,例如微信小程序)
1.优点:不需要下载安装,不占用手机存储空间,方便快捷,地址传播成本低,开发门槛低,成本低(跨平台,只基于浏览器),推广成本低,技术栈
2.缺点:发送网络请求,请求数据有延迟,会有空白时间
3.使用场景:适用于信息统计 => 投票.报名.用户反馈.表单收集,场景宣传 => 活动宣传小游戏婚礼邀请
1.优点:更加精细,使用更加流畅,不需要重复加载,有缓存,可以使用系统的底层功能
2.缺点:开发周期长,开发成本高,不会自动更新,需要权限开启,占据固定内存空间,技术栈要求高,开发成本高,审核机制严格,质量要求高,更新慢,推广成本高(广告投放)
3.使用场景:体验要求高 => 音视频缓存.响应速度快,功能丰富
公众号:更相似于h5,打开网页,支持发送信息响应功能
1.优点:不需要下载,支持微信自带的交互功能,支持h5网页嵌入
2.缺点:不适合大型功能,体验较差
3.使用场景:消息推送,文章发布,简单交互=>业务办理
微信小程序:功能介于h5和原生APP之间
1.优点:使用门槛低,可以缓存,操作足够流畅,内存占用小,查找便捷,易于传播,开发生态好,有审核,审核快,推广成本低,市场需求大
2.缺点:不支持其他平台使用
3.使用场景:消息推送,文章发布,简单交互=>业务办理
注:微信小程序单包大小不大于2MB,分包不超于8MB,尽量使用远程图片
//npm init 生成 package.json
//npm i @vant/weapp -S --production
//打开微信开发者工具,点击 工具 -> 构建 npm,并勾选 使用 npm 模块 选项,构建完成后,即可引入组件
// app.json 全局使用
"usingComponents": {
"van-button": "@vant/weapp/button/index"
}
//app.json 主配置文件
{
"{
"pages":[
"pages/index/index",//入口文件
"pages/logs/logs"
],
"window":{
//窗口相关配置
//导航栏背景色
"navigationBarBackgroundColor":"#ffdddd",
//导航标题色,只有 black 和 white
"navigationBarTextStyle":"black",
//标题文本
"navigationBarTitleText":"小程序",
//下拉后窗口背景色
"backgroundColor":"#000000",
//下拉后背景字体,loading 图样式,只有 dark 和 light
"backgroundTextStyle":"light",
//是否支持下拉刷新
"enablePullDownRefresh":true
},
"tabBar":{
//标签栏设置
"list":[{
//至少两个对象,最多五个
"pagePath":"pages/index/index", //地址
"text":"首页",//显示名称
"iconPath":"images/home.png",//图标显示
"selectedIconPath":"images/home-selected.png" //选中状态
},{
"pagePath":"pages/logs/logs",
"text":"日志查询",
"iconPath":"images/search.png",
"selectedIconPath":"images/search-selected.png"
}],
//tabBar 处于顶部和底部,只有两个值:top 和 bottom(默认),属性如果设置为 top,则不会显示 icon
"position":"top",
//设置导航颜色
"color":"#000",
//设置导航栏的背景色
"backgroundColor":"#eee",
//设置选中的颜色
"selectedColor":"#06f",
"borderStyle":"white",
//打开调试功能
"debug":true
}
"style": "v2",
"sitemapLocation": "sitemap.json"
}"
}
//当前页面json
"navigationBarTitleText": "菜谱分类"
//生命周期函数
onLaunch() {
//小程序初始化完成时,全局只触发一次
},
onShow(){
//页面显示时执行,后台进入到前台
},
onLoad: function () {
//页面加载执行
},
onReady(){
//首次渲染完成时执行
},
onHide(){
//页面隐藏时执行
},
onUnload(){
//页面卸载时执行
},
onPullDownRefresh() {
//用户下拉刷新
},
onReachBottom() {
//用户下拉触底
},
onPageScroll(calcu){
//页面滚动时触发,参数时一个对象,返回垂直滚动对的距离
},
onShareAppMessage() {
//用户分享时调用
}
//组件内的生命周期函数
Component({
created:function({
//组件被创建,无法获取data无法使用this.setData
}),
attached:function(){
//组件被添加到页面上,可以获取data
},
detached:function(){
//组件在当前页面被移除
},
lifeTimes:{
//兼容性写法,优先级比较高
created:function({
//组件被创建,无法获取data无法使用this.setData
}),
},
pageLifetimes:{
show:function(){
//页面被显示
},
hide:function(){
//页面被隐藏
},
resize:function(){
//页面尺寸变化
}
}
})
//封装axios
//url.js,设置请求地址
const BASE_URL = "地址";
module.exports = {
BASE_URL
}
//request.js , 封装axios ,接收参数返回数据
//引入公共接口地址
const url = require("./url");
function request(obj) {
return new Promise ((resolve,reject)=>{
wx.request({
url: url.BASE_URL + obj.apiUrl, //接口地址
method :obj.method, //请求方式
data : obj.data, //传递数据
success(res) {
resolve(res)
},
fail(error) {
reject(error)
}
})
})
}
module.exports = {
request
}
//api.js , 向封装的request传递地址,方式,传参,返回Promise对象
const api = require ("./request");
module.exports = {
//获取接口
getBanner(){
return api.request({
apiUrl:"接口地址",method:"get",data:{
}})
}
}
//设置模板,只定义wxml,wxss和js写在引入组件位置
<template name="header">内容</template>
//进行复用
<import src="../templates/header.wxml"/> //引入
<template is="header" data="{
{模板需要的数据:...header,key:value}}"/> //调用并传参
//在wxss中引入其他wxss文件
@import "文件地址"
//在wxml页面引入其他wxml文件,可以使用import和include
<include src="文件地址" /> //在哪个位置引入就显示在哪
//标签属性绑定
id class style //可以直接添加属性值,或通过{
{}}变量动态绑定
data-title="views" //自定义属性
class="{
{index==ind?'active':''}}"
//wxss样式设置
添加hover-class //点击修改样式
//wsx使用
//RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
//每一条正则表达式模式对应一个RegExp实例,当使用构造器函数创建正则表达式的时候,必须使用正常的字符串避开规则(在字符串中加入前导字符\)是必须的。
例如,下面的两条语句是等价的:
re=new RegExp("\\w+");
re=/\w+/
//引入
<wxs src="../wxs/image.wxs" module="demo" />
<image src="http://a.itying.com/{
{demo.upimage(v.img_url)}}" class="image" />
//直接在wxml页面使用wxs,每个模块都是独立的作用于,需要通过module.exports暴露其私有的属性和方法
<wxs module="demo">
function upimage(image){
var reg = getRegExp('\\', "g")
var font = image.replace(reg,'/')
console.log('http://a.itying.com/'+font)
return font;
}
module.exports = {
upimage:upimage,
}
<wxs/>
//事件绑定
bingtap="tapGreeting"
tapGreeting(event){
this.setData({
//对属性进行设置
greeting:"";//修改的data里面的数据,也可调用方法进行传参修改数据进行赋值
})
}
//三元表达式,可动态绑定class样式
{
{
obj ? "obj" :"不存在"}}
capture-bind:tap 捕获状态处理数据,从外向内处理事件
capture-catch:tap 捕获状态阻止数据处理
mut-bind 互斥事件绑定
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RbiKtddD-1600061439779)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20200703194221428.png)]
//隐藏显示,组件不渲染
wx:if="{
{变量名或者表达式}}" wx:else //和if相对应
<view wx:if="{
{show==100}}">满分</view>
<view wx:elif="{
{show>=80}}">优秀</view>
<view wx:elif="{
{show>=60}}">及格</view>
<view wx:else>不及格</view>
hidden="{
{false}}" //显示隐藏,隐藏内容
//数组循环渲染
wx:for="{
{arr}}"
{
{
item}} //列表项内容 wx:for-item="v" 另定义
{
{
index}} //列表索引值 wx:for-index="i" 另定义
arr:[
':apple', //可显示为图标
':banana'
]
wx:key="index" 为index值,数组改变顺序重新渲染,状态是复用而不是新建会延续原先index位置的状态
wx:key="*this" *this是小程序的保留字,代表当前的item
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smy8Rqu3-1600061439780)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20200704162106675.png)]
// image 显示图片
<image
mode="aspectFit" //保持比例图片显示完整 aspectFill保持比例并占满容器 widthFix缩放模式,高度自适应
src="图片地址"
show-menu-by-longpress="{
{true}}" //开启长按图片显示识别小程序码菜单
/>
height:100vh; //视口宽度,自动百分百
background-size:contain;
顶部外边距产生合并,在外部盒子添加overflow:hideeen;
//icon自关闭组件
<icon type="info" color="#ccc" size="20"/> //serch,suecss,cacel...
//text 显示文本
<rich-text nodes="{
{nodes}}"/> //节点,渲染成标签,每一个节点都是对象
nodes:[
{
name:"img",
attrs:{
class:"image",
src:"图片地址"
}
},
{
name:"h3",
attrs:{
class:"header"
},
children:[
{
type:'text', //节点类型
text:"hello"
}
]
}
]
let id = event.currentTarget.id;
let images = []
this.data.shopContent.pics.map((itme)=>{
images.push(itme.pics_big)
})
//渲染
wx.previewImage({
urls: images,
current :images[id]
})
<button></button> //默认占据一整行
type:default 白色 primary 绿色 warn 红色
size:default 默认大小,mini 迷你大小
plain:true/false 是否镂空
form-type:submit 提交表单 reset 重置表单
open-type:微信开放能力,绑定事件
button::after{
border:none; //边框设置为空
}
//滚动视图
<scroll-view
scroll-y="{
{true}}" //设置滚动方向,y垂直
style="height:180px"
scroll-into-view="{
{data中变量接受id值}}" //指定当前滚动显示的对象,通过内容的id决定
scroll-with-animation="{
{true}}" //添加动画效果
>
//滚动内容
</scroll-view>
<swiper
autoplay='{
{true}}' //是否自动轮播
indicator-dots="{
{true}}" //指示器的显示和隐藏
indicator-color="" //指示器颜色
indicator-active-color="" //激活状态下指示器颜色
interval="{
{2000}}" //自动切换时间间隔
circular="{
{true}}" //是否采用衔接滑动
current="{
{ind}}" //切换的位置
>
<block wx:for="{
{images}}"> //不占用标签位置
<swiper-item> //幻灯片每一项内容
<img src="{
{item}}"/>
</swiper-item>
</block>
</swiper>
//movable-area 在页面自由移动
<movable-area> //可移动区域
<movable-view
diection:"" //控制移动方向,none不能移动,all任意方向,vertical垂直方向,horizontal水平方向
inertia="{
{true}}" //产生惯性
out-of-bounds="{
{true}}" //设置可越过可移动的区域,松开会自动弹回
x="30", //控制移动的视图在水平和垂直的初始位置
y="30",
> //需要移动的视图
</movable-view>
</movable-area>
<progress
percent="30" //当前所占百分比
activeColor="#ccc" //样式颜色
/>
<form bindsubmit="formSubmit"> //事件处理
<label for="silder"> //解释说明,和silder的id绑定
<text>silder</text>
</label>
<silder id="silder" name="silder" show-value /> //滑动silder实时显示值
<input
type:"text"
name:"text"
placeholder="text"
bindinput="事件名" //输入事件,实时获取输入内容
/>
<textarea
bindinput="事件名"
/>
<checkbox-group name="checkbox" bindChange="改变选择事件"> //一组复选框内容,获取value绑定的值
<label>
<text>复选框1<text>
<checkbox value="1"/>
</label>
<label>
<text>复选框2<text>
<checkbox value="2" checked="{
{控制是否选中}}"/>
</label>
</checkbox-group>
<checkbox-group name="radio" bindChange="改变选择事件"> //一组单选框内容
<label>
<text>单选框1<text>
<radio value="1"/>
</label>
<label>
<text>单选框2<text>
<radio value="2"/>
</label>
</checkbox-group>
<button from-type="submit">提交</button> //reset重置,只收集带name属性的数据
</form>
formSubmit(event){
console.log(event.detail.value)
}
//开关标签
<switch></switch>
//picker在屏幕底部弹出选择器 时间选择器,日期选择器,省市区选择器,通过mode改变类型
<picker
range="{
{items}}" //选择范围,项目
bindchange="改变选择事件",
mode='selector' //设置选择器类型
>
<input type='text' disabled='true' value='{
{array[index]}}' />
</picker>
//日期选择器 需配置开始时间,结束时间
<picker bindchange="onChange" mode="date" id="picker" value='{
{startDate}}' start='{
{startDate}}' end='{
{endDate}}'>
<input type="text" disabled='true' value='{
{date}}' />
</picker>
startDate: util.formatTime(new Date()),
endDate : '2030-12-31',
onChange : function (e) {
this.setData({
date : e.detail.value
});
},
<audio
poster="显示图片地址"
src="音频地址"
author="音频作者"
name="音频名称"
controls //控制音频播放
bindplay="play" //播放音频时执行的事件
bindpause="pause" //暂停音频时执行的事件
bindended="ended" //结束音频时执行的事件
/>
<video
poster="显示图片地址"
src="视频地址"
objectFit="cover" //视频填充方式
controls
bindplay="play" //播放视频时执行的事件
bindpause="pause" //暂停视频时执行的事件
bindended="ended" //结束视频时执行的事件
/>
<map
longitude="117.32" //经度值
latitude="36.666" //纬度值
scale="" //缩放比例,5
markers="{
{markers}}" //地图添加标记,数组
/>
markers:[
{
id:0,
longitude:"117.32" //经度值
latitude:"36.666", //纬度值
iconPath:"",//标记图标地址
width:22, //图标宽度
height:40,
callout:{
content:"", //提示字
fontSize:14, //可直接设置wxss属性
color:"#ccc",
padding:8
}
}
]
//navigator 创建小程序的页面和页面之前的连接,跳转非tabbar页面
//switchTab打开tabbar页面
//reLaunch打开任意界面
<navigator
open-type="switchTab" //切换标签 navigate保留当前页面,跳转其他页面可返回
//redirectTo 关掉当前打开的页面,进入新的页面
url="/pages/index/index?id=1000" //切换的地址,并传参
>
demo
</navigator>
onLoad(options){
//页面加载生命周期接收
console.log(options);
open-type //设置打开类型
bindViewTap:function(event){
wx.navigateTo({
//跳转打开新页面可返回,redirectTo重定向
url: `/pages/vehicles/show?id=${
event.target.dataset.id}`,
})
}
wx.showToast({
//弹框提示
title: '暂不支持',
icon:"none"
})
//rich-text
<rich-text nodes="{
{渲染的节点}}"></rich-text>
upshow(){
let show = !this.data.show;
let animation = wx.createAnimation({
duration: 600, //动画时间
timingFunction: 'ease', //显示类型
})
setTimeout(()=>{
this.fadeIn(animation,show);//调用显示动画
},300)
},
fadeIn(animation,show){
if(!show){
animation.height('320rpx').step();
}else{
animation.height('160rpx').step();
}
this.setData({
show:show,
animationData: animation.export()//动画实例的export方法导出动画数据传递给组件的animation属性
})
},
//创建子组件
创建component => star => star.js/json/wxml/wxss
图片放在star文件夹内
//父组件调用
//index.json
"usingComponents": {
"star":"../../component/star/star" //进行注册
}
//index.wxml
<star></star> //进行调用
//父组件向子组件传参
<star show="{
{show}}"></star>
//子组件接收
properties: {
show:Boolean,
show:{
//对象的形式设置默认值
type:Boolean,
value:true
}
},
//子组件调用父组件方法
<star show="{
{show}}" bind:trigger="upshow"></star> //子组件调用的方法,及调用父组件的方法名
//子组件在methods定义方法
methods: {
upfather(){
this.triggerEvent("trigger","传参","冒泡,捕获") //调用父组件绑定的要调用的方法
}
}
//父组件调用子组件方法
<star show="{
{show}}" id="id名" ></star> //通过id名获取组件实例
updata(){
//通过id名获取想改变的组件对象
let setdata = this.selectComponent("id名");
setdata.子组件方法名(evt.detail.传参值)
}
//子组件使用父组件的样式
Component({
externalClasses:['aaa']
})
<view class ="aaa"></view>
<star show="{
{show}}" aaa="bbb"></star>
.bbb{
color:"red"
}
//slot插槽,添加内容,添加多个插槽需要设置name
Component({
multipleSlots:true //允许使用多插槽
})
<slot name = "{
{index}}" />
<view slot = "{
{0}}"></view>
if(this.length>=3){
this.setData=({
a:true;
})
}else{
this.setData=({
a:false;
})
}
//两种方式结果相等
this.setData=({
a:this.length>=3;
})
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6IC7Doio-1600061439782)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20200705223943443.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AuI7gUfV-1600061439783)(C:\Users\86183\AppData\Roaming\Typora\typora-user-images\image-20200705223948695.png)]
云开发:在一个部署好的环境,前端直接以函数对的形式使用各种服务,完成各种操作
云函数=> 云存储,云数据库(前端使用函数获取数据,函数即服务,弱化了后端服务器的概念)
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
每当小程序可能被销毁之前,页面回调函数 onSaveExitState
会被调用。如果想保留页面中的状态,可以在这个回调函数中“保存”一些数据,下次启动时可以通过 exitState
获得这些已保存数据。
代码示例:
{
"restartStrategy": "homePageAndLatestPage"
}
Page({
onLoad: function() {
var prevExitState = this.exitState // 尝试获得上一次退出前 onSaveExitState 保存的数据
if (prevExitState !== undefined) {
// 如果是根据 restartStrategy 配置进行的冷启动,就可以获取到
prevExitState.myDataField === 'myData'
}
},
onSaveExitState: function() {
var exitState = {
myDataField: 'myData' } // 需要保存的数据
return {
data: exitState,
expireTimeStamp: Date.now() + 24 * 60 * 60 * 1000 // 超时时刻
}
}
})
css
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
每当小程序可能被销毁之前,页面回调函数 onSaveExitState
会被调用。如果想保留页面中的状态,可以在这个回调函数中“保存”一些数据,下次启动时可以通过 exitState
获得这些已保存数据。
代码示例:
{
"restartStrategy": "homePageAndLatestPage"
}
Page({
onLoad: function() {
var prevExitState = this.exitState // 尝试获得上一次退出前 onSaveExitState 保存的数据
if (prevExitState !== undefined) {
// 如果是根据 restartStrategy 配置进行的冷启动,就可以获取到
prevExitState.myDataField === 'myData'
}
},
onSaveExitState: function() {
var exitState = {
myDataField: 'myData' } // 需要保存的数据
return {
data: exitState,
expireTimeStamp: Date.now() + 24 * 60 * 60 * 1000 // 超时时刻
}
}
})