热门关键字:
jquery > jquery教程 > html5 > 前端笔记之微信小程序(二){{}}插值和MVVM模式&…

前端笔记之微信小程序(二){{}}插值和MVVM模式&…

435
作者:管理员
发布时间:2020/3/18 10:51:23
评论数:0
转载请自觉注明原文:http://www.jq-school.com/Show.aspx?id=1060

  一、双花括号{{}}插值和MVVM模式

  1.1体会{{}}插值

  index.wxml的标签不是html的那些标签,这里的view就是div。

  {{}}这样的插值写法,叫做mustache语法。mustache是胡子的意思,因为{{}}像胡子。

  <viewclass="container">

  <viewclass="title">

  我是首页{{1+1}}

  {{a}}年!

  </view>

  </view>

  要在同名js文件下的data属性中定义:

  Page({

  data:{

  a:100

  }

  });

  所有的框架:Angular、React、Vue、ReactNative、小程序都是这样的“强耦合”的。

  之前我们js操作html使用:document.getElementById()这样的“不耦合”的方式,但是反而编程麻烦。

  不仅仅{{}}可以出现在文字的部分,还可以出现在属性值的双引号中:

  <viewclass="box"style="width:{{a}}px;height:{{a}}px">我是盒子</view>

  1.2体会MVVM模式

  <buttonbindtap='add'>按我</button>

  监听直接写在标签上,bindtap表示绑定轻触事件。

  注意,是bindtap="add"而不是:bindtap="add()"

  'add'是一个函数,要定义在js文件中。

  注意:改变数据不能直接改,如果这样写,a的确会变化,但是视图不会跟着变化!

  Page({

  data:{

  a:100

  },

  add(){

  this.data.a++;

  }

  });

  必须使用this.setData()函数来改变data值,此时视图才能变化。

  Page({

  data:{

  a:100

  },

  add(){

  this.setData({

  a:this.data.a+1

  });

  }

  });

  数据变化了,视图会自动改变

  我们学习的所有框架都是MVVM模式的,只需要关心数据,不需要关心视图,视图会自动变化。

  二、数据双向绑定

  2.1调色板

  先说一个知识点,用户的屏幕是750rpx。所以如果盒子750rpx宽度,一定撑满的,375rpx就是半屏。

  slider组件:

  index.wxss

  .box{

  width:350rpx;

  height:350rpx;

  margin:10pxauto;

  }

  示例代码

  index.wxml:style行内样式的插值,实现双向数据绑定,就是data中的数据能够成为组件的默认数据。

  添加一个bindchanging事件,这个事件从手册上查的。添加一个自定义属性,叫做data-ys来区分谁是谁。

  注意,自定义属性必须以data-开头

  <viewclass="container">

  <viewclass="box"style="background-color:rgb({{r}},{{g}},{{b}})"></view>

  <slidervalue="{{r}}"bindchanging="changeColor"data-ys="r"max="255"show-valueblock-size="18"/>

  <slidervalue="{{g}}"bindchanging="changeColor"data-ys="g"max="255"show-valueblock-size="18"/>

  <slidervalue="{{b}}"bindchanging="changeColor"data-ys="b"max="255"show-valueblock-size="18"/>

  </view>

  index.js事件处理函数:

  Page({

  data:{

  r:100,

  g:200,

  b:123

  },

  changeColor(event){

  this.setData({

  [event.target.dataset.ys]:event.detail.value

  })

  }

  });

  event.target.dataset.ys就是当前触发这个函数的组件身上的ys标识。

  event.detail.value就是当前触发这个函数的组件的值。

  也就是说,微信小程序的事件处理函数,一律不能传参!

  <buttonbindtap="add(5)"></button>

  只能是:

  <buttonbindtap="add"data-n="5"></button>

  2.2微博发布框

  class的动态实现:{{}}中不能出现复杂语句,比如不能有for、if、while、var,最复杂就是三元了。

  <viewclass="container">

  <textareavalue="{{content}}"bindinput="inputHandler"placeholder="默认"auto-focus/>

  <viewclass="{{content.length>40?'danger':''}}">当前:{{content.length}}字/40字</view>

  <viewclass="row">

  <buttondisabled="{{content.length==0||content.length>40}}">发布</button>

  <buttonbindtap="clear"disabled="{{content.length==0}}">清空</button>

  </view>

  </view>

  index.js

  Page({

  data:{

  content:""

  },

  //当用户输入文本的时候

  inputHandler(event){

  this.setData({

  content:event.detail.value

  });

  },

  //清空

  clear(){

  this.setData({content:""});

  }

  });

  示例代码

  index.wxss

  .danger{color:red;font-weight:bold;}

  .row{display:flex;}

  三、指令

  3.1wx:if指令

  判定一个元素是否上树,而不是是否显示。

  <viewclass="container">

  <buttonwx:if="{{isAgree}}">注册</button>

  </view>

  当这个变量是true按钮上树,否则下树。

  3.2wx:for循环指令

  命令一个标签进行循环,使用wx:for。

  index.js数据:

  Page({

  data:{

  arr:["白板","幺鸡","二万","三饼","四条"]

  }

  });

  index.wxml:

  <viewclass="container">

  <viewwx:for="{{arr}}"wx:key="{{index}}">{{index}}-{{item}}</view>

  </view>

  wx:for的值必须是数组,不能是对象,此时会自动遍历这个数组。

  wx:for必须添加wx:key,表示循环这一项的标识,这个标识有什么用?连上服务器就有用了。增加效率

  {{index}}、{{item}}是循环结构天生就有的,表示下标和项。

  3.2.1九九乘法表

  因为空间太小,做五五乘法表:

  <viewclass="row"wx:for="{{[1,2,3,4,5]}}"wx:key="{{index}}"wx:for-item="a">

  <viewclass="col"wx:for="{{[1,2,3,4,5]}}"wx:key="{{index}}"wx:for-item="b">

  {{a}}*{{b}}={{a*b}}

  </view>

  </view>

  index.wxss

  .row{width:750rpx;display:flex;}

  .col{flex:1;text-align:center;font-size:12px;border:1pxsolid#3bb;}

  3.2.2循环信息流

  index.wxml

  <viewclass="container">

  <viewclass="mingxing">

  <viewclass="box"wx:for="{{mingxing}}"wx:key="{{index}}">

  <viewclass="left">

  <imagesrc="{{item.picurl}}"></image>

  {{item.name}}

  </view>

  <viewclass="right">

  {{item.info}}

  </view>

  </view>

  </view>

  </view>

  index.wxss

  .box{

  width:720rpx;display:flex;border:1pxsolid#3bb;margin:10pxauto;font-size:13px;

  line-height:24px;color:#333;padding:10px;box-sizing:border-box;

  }

  .left{flex:1;}

  .leftimage{width:180rpx;height:180rpx;}

  .right{flex:3;box-sizing:border-box;padding-left:10px;}

  示例代码

  index.js

  Page({

  data:{

  mingxing:[

  {

  "name":"Angelababy",

  "info":"Angelababy(杨颖),1989年2月28日出生于上海市",

  "picurl":"/images/baby.png"

  },

  {

  "name":"迪丽热巴",

  "info":"迪丽热巴(Dilraba),1992年6月3日出生于新疆乌鲁木齐市",

  "picurl":"/images/dilireba.png"

  }

  ]

  }

  });

  示例代码

  3.2.3复选框-循环数组

  <viewclass="container">

  你的爱好:

  <checkbox-groupbindchange="checkboxChange">

  <labelwx:for="{{hobbys}}"wx:key="{{index}}">

  <checkboxvalue="{{item}}"checked="{{false}}"/>

  {{item}}

  </label>

  </checkbox-group>

  <view>

  你的爱好是:{{myhobbys}}

  </view>

  </view>

  Page({

  data:{

  hobbys:["篮球","足球","羽毛球"],

  myhobbys:[]

  },

  checkboxChange(event){

  this.setData({

  myhobbys:event.detail.value

  });

  }

  });

  示例代码

  3.2.4操作数组-增删改查

  <viewclass="container">

  <inputplaceholder="请填写学生名字"auto-focusbindinput="inputHandler"/>

  <buttonbindtap="addstudent">增加</button>

  <viewwx:for="{{student}}"wx:key="{{item.id}}"style="display:flex;">

  <view>{{item.name}}</view>

  <buttondata-id="{{item.id}}"bindtap="delstudent">删除</button>

  </view>

  </view>

  Page({

  data:{

  student:[

  {"id":1,"name":"小明"},

  {"id":2,"name":"小红"},

  {"id":3,"name":"小刚"}

  ],

  //将来被添加的学生名字

  needAddStudentName:""

  },

  delstudent(event){

  constid=event.target.dataset.id;

  this.setData({

  student:this.data.student.filter(item=>item.id!=id)

  });

  },

  inputHandler(event){

  this.setData({

  needAddStudentName:event.detail.value

  });

  },

  addstudent(){

  constname=this.data.needAddStudentName;

  this.setData({

  student:[

  ...this.data.student,

  {id:~~(Math.random()*100),name}

  ]

  });

  }

  });

  示例代码

  四、小程序API

  4.1认识小程序的API

  微信提供了非常多的API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。原理就是将JavaScript翻译为Java、OC语言。

  4.2使用请求数据的API

  微信小程序,域名只支持https(request、uploadFile、downloadFile)和wss(connectSocket)协议;

  s是security安全的意思。微信小程序,只能用安全模式的https和wss协议。

  https就是http的安全版本,用来提供JSON数据等等;

  wss是websocket的安全版本,用来实时通信的。

  域名不能使用IP地址或localhost,且不能带端口号,而且域名必须经过ICP备案;

  对初学者不友好的,想跑一个上线的小程序,还得在服务上花一些钱。但是,在开发时,可以禁止上面的要求。

  后端app.js提供接口

  constexpress=require("express");

  constapp=express();

  vara=10;

  app.get("/api",(req,res)=>{

  res.json({a})

  })

  app.get("/jia",(req,res)=>{

  a++;

  res.json({})

  })

  app.listen(3000);

  示例代码

  <!--index.wxml-->

  <viewclass="container">

  <view>{{a}}</view>

  <buttonbindtap="add">按我加服务器的数据</button>

  <buttonbindtap="refresh">请求服务器上最新数据</button>

  </view>

  wxml示例代码

  小程会自动帮我们跨域,跨域的原理是代理跨域。

  constbaseURL="http://127.0.0.1:3000"

  //请求服务器的数据

  //出了page()函数外,this是window

  constrequireServer=function(){

  varself=this;

  wx.request({

  url:`${baseURL}/api`,

  success:function({data}){

  self.setData({

  a:data.a

  });

  }

  });

  }

  Page({

  data:{

  a:0

  },

  //页面显示/切入前台时触发

  onShow(){

  //给函数绑定当前位置的this指向

  requireServer.call(this);

  },

  add(){

  wx.request({

  url:`${baseURL}/jia`

  });

  },

  refresh(){

  requireServer.call(this);

  }

  });

  示例代码

  4.3模拟网络切换和监控

  在模拟器里切换网络类型,查看控制台的输出内容

  在调试器里,输入以下代码并按回车键,进行网络监听:

  wx.onNetworkStatusChange(function(res){

  console.log('网络连接:'+res.isConnected);

  console.log('网络状态:'+res.networkType);

  });

  示例代码

  4.4生命周期

  4.5小程序编译及编译模式






如果您觉得本文的内容对您的学习有所帮助:支付鼓励



关键字:html
友荐云推荐