逻辑层
逻辑层 事件处理
1: 事件的基本使用 bind[xxx] catch[xxx]
2: 小程序中事件冒泡和HTML中处理起来不一样,这里是使用catch[xxx]
3: 如果需要给事件处理函数指定参数 只能通过dataset
下面分别来说明:
bindtap
基本的事件使用 就是给组件加一个bind+事件名的属性,属性的值指向一个定义在当前页面对象中的一个function.
<!--index.wxml--> <view class="container"> <button bindtap="buttonTapHandler">点我</button> </view>
//index.js //获取应用实例 const app = getApp() Page({ buttonTapHandler:function(e){ console.log(123); //console.dir() 将一个对象以树状的形式打印到控制台 console.dir(e) } })
效果:
冒泡
catch+ 事件名: 是阻止冒泡并绑定事件:
案例:
<!-- 事件冒泡 --> <!-- catch+ 事件名: 是阻止冒泡并绑定事件 --> <view bindtap="outterHandler" style="width:200px;height:200px;background-color:red"> <view catchtap="innerHandler" style="width:100px;height:100px;background-color:blue"> </view> </view>
效果:
点击 蓝色小方块,冒泡被阻止了–完美。
事件传参
如果需要给事件处理函数指定参数 只能通过dataset
<!-- 事件传参 --> <button bindtap="tap2Handle" data-name="张三" data-age="13">点我</button> <button bindtap="tap2Handle" data-hello-world="张三">点我</button>
tap2Handle:function(e){ // console.dir(e) //dataset指的是元素上所有以data-开头的属性集合 // console.log(this) //事件处理函数中的this还是页面对象!!!跟html不一样. console.log(e.target.dataset) }
演示效果:
注意: 多个“ - ” 的问题, 会自动转成驼峰的属性。
单向逻辑流
小程序没有双向数据绑定。
this.setData 是用来改变data中的数据
它与直接赋值区别在于setData可以通知界面做出变化
直接赋值没有办法实现这一点(早期的js)
解决是:setData.
案例如下:
<!--index.wxml--> <view class="container"> <input value="{{ message }}" bindinput="inputHandler"/> <text>{{ message }}</text> </view>
//index.js //获取应用实例 const app = getApp() Page({ data:{ demo: '123', message: 'initial' }, inputHandler: function(e){ // console.log(123); // console.log(e.target); // console.log(e); // console.log(e.detail.value); // this.data.message = e.detail.value; // console.log(this.data.message); this.setData({ message: e.detail.value }); // this.setData 是用来改变data中的数据 // 它与直接赋值区别在于setData可以通知界面做出变化 // 直接赋值没有办法实现这一点(早期的js) console.log(this.data.message); } })
页面
打印显示:
总结:
通过这种setData方式,让逻辑层的数据传递到页面层。
页面层的数据传递到逻辑层则是 通过 事件方式。
登录案例
<!--index.wxml--> <view class="container"> <view class="userinfo"> <view> <input placeholder="请输入用户名" value="{{ username }}" bindinput="usernameChangeHandler"/> </view> <view class="padding-b-20"> <input placeholder="请输入密码" value="{{ password }}" bindinput="passwordChangeHandler" /> </view> <view> <button bindtap="loginHandler">登 录</button> </view> </view> </view>
/**index.wxss**/ .userinfo { display: flex; flex-direction: column; align-items: center; } input{ border-bottom: 1px solid #CCC; } .padding-b-20 { padding-bottom: 20px; } button{ background-color: green; color: #FFF; font-weight: normal; }
//index.js /* * 1.设计数据的结构(data属性) 2.将数据绑定到特定的元素上 3.登录按钮的点击事件(具体的登录逻辑) 4. */ Page({ data: { username: 'admin', password: '123' }, usernameChangeHandler: function(e){ // this.data.username = e.detail.value; //不要使用这种方式,因为界面层无法判断 this.setData({ username: e.detail.value }); }, passwordChangeHandler: function(e){ // this.data.password = e.detail.value; //不要使用这种方式,因为界面层无法判断 this.setData({ password: e.detail.value }); }, //用于处理登录按钮点击事件 loginHandler: function(){ //TODO :完成逻辑 //1. 先需要知道用户输入了什么 console.log(this.data) //2. 根据用户输入的值判断 //3. 根据判断的结果做出响应 }, })
演示效果:
看下控制台,是否接收到页面的数据
界面层的条件渲染
wx:if
当条件为假得时候是不渲染(这个标签不工作),为真才渲染
hidden
标签仍然会工作,只是不显示在界面上
案例:
<!--index.wxml--> <view class="container"> <view class="item"> <view class="title" bindtap="toggle"> <text>切换面板展示</text> </view> <!-- block 只是控制属性(wx:)的载体,页面渲染过程中没有实际的意义 --> <block wx:if="{{ !show }}"> <!-- <view class="content"> <text> 这里是内容.... 这里是内容.... 这里是内容.... </text> </view> <view class="content" > <text> 这里是内容.... 这里是内容.... 这里是内容.... </text> </view> --> </block> <!-- wx:if 当条件为假得时候是不渲染(这个标签不工作) --> <view class="content" wx:if="{{ !show }}"> <text> 这里是内容.... 这里是内容.... 这里是内容.... </text> </view> ----- <!-- hidden 标签仍然会工作,只是不显示在界面上 --> <view class="content" hidden="{{ !show }}"> <text> 这里是内容.... 这里是内容.... 这里是内容.... </text> </view> </view> </view>
//index.js //获取应用实例 const app = getApp() Page({ data: { show: false }, //事件处理函数 toggle: function(e){ this.setData({ show: !this.data.show }); } })
效果:
block
<!-- block 只是控制属性(wx:)的载体,页面渲染过程中没有实际的意义 --> <block wx:if="{{ !show }}"> <view class="content"> <text> 这里是内容.... 这里是内容.... 这里是内容.... </text> </view> <view class="content" > <text> 这里是内容.... 这里是内容.... 这里是内容.... </text> </view> </block>
wxss和css的区别
rpt的单位,750rpt代表宽度100%
@import引入其他的样式。但是只是加载一次。css会发起多个请求。
微信ui组件
icon组件
<!--index.wxml--> <view class="container"> <!-- icon text process--> <!-- icon的类型,有效值:success, success_no_circle, info, warn, waiting, cancel, download, search, clear --> <!-- type用于定义图标类型,只能是规定范围的类型, 除了这些内置图标,其他图标必须通过图片方式使用 --> <icon type="success"></icon> <icon type="success_no_circle"></icon> <icon type="info"></icon> <icon type="warn"></icon> <icon type="waiting"></icon> <icon type="cancel"></icon> <icon type="download"></icon> <icon type="search"></icon> <icon type="clear"></icon> <!-- size用于指定图标大小, 默认23,单位是px --> <icon type="success" size="60"></icon> <!-- color用于指定图标颜色,取值就是css颜色取值 --> <icon type="info" size="60" color="red"></icon> </view>
text组件
<!-- text类似于html中的p标签,但是p标签不能嵌套 --> <!-- text主要是为了可以很好的控制页面的内容 --> <!-- text标签还支持换行 --> <text>这是一段<text>文本</text>标签</text> 这是一段没有被text包裹的文本
progress 进度条
<!-- 显示一个进度条 percent是0-100的值--> <!-- show-info是用来控制是否显示具体数值的属性 --> <progress percent="20" show-info="true" stroke-width="10" /> <!-- active显示从左到右的动画 --> <progress percent="30" show-info="true" active="true"/>
表单组件
button
<!--index.wxml--> <view class="container"> <!-- type是用来控制按钮的类型,只有三种,primary,default,warn --> <button type="default">这是一个按钮</button> <!-- size控制大小 --> <button type="warn" size="mini">这是一个按钮</button> <!-- plain 镂空 --> <button type="primary" plain>这是一个按钮</button> <!-- loading 加载,前面会有个转圈的菊花 --> <button type="warn" loading>这是一个按钮</button> <!-- form-type submit提交表单 reset重置--> <button type="warn" form-type="submit">这是一个按钮</button> <!-- hover指的是按下,hover-class指的就是按下过后的作用class --> <button hover-class="btn-active">hover class</button> </view>
/**index.wxss**/ .btn-active{ background-color: red; }
radio
<radio-group bindchange="bindchangeHandle"> <radio value="male" color="red"> 男 </radio> <radio value="female" > 女 </radio> </radio-group> <view>您选中的是: {{gender}}</view>
/** * 页面的初始数据 */ data: { gender:"" }, bindchangeHandle: function(e) { console.log(e); console.log( e.detail.value); let gender = e.detail.value this.setData({ gender }); },
checkbox
//index.js //获取应用实例 const app = getApp() Page({ data: { items: [ {value: 'USA', name: '美国'}, {value: 'CHN', name: '中国', checked: 'true'}, {value: 'BRA', name: '巴西'}, {value: 'JPN', name: '日本'}, {value: 'ENG', name: '英国'}, {value: 'FRA', name: '法国'} ] }, checkboxChange(e) { console.log('checkbox发生change事件,携带value值为:', e.detail.value) const items = this.data.items const values = e.detail.value for (let i = 0, lenI = items.length; i < lenI; ++i) { items[i].checked = false for (let j = 0, lenJ = values.length; j < lenJ; ++j) { if (items[i].value === values[j]) { items[i].checked = true break } } } this.setData({ items }) } })
<!--index.wxml--> <view class="container"> <checkbox-group bindchange="checkboxChange"> <label class="checkbox" wx:for="{{items}}"> <checkbox value="{{item.value}}" checked="{{item.checked}}"/>{{item.name}} </label> </checkbox-group> </view>
效果:
input <!--index.wxml--> <view class="container"> <input class="input1" placeholder-class="input-placeholder" placeholder="请输入"/> </view>
.input1{ border: 1px solid #c0c0c0; } .input-placeholder { color: red; }
操作反馈组件
action-sheet
https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showActionSheet.html
//index.js //获取应用实例 const app = getApp() Page({ data: { }, btnToDo: function(){ //当点击按钮触发 // console.log(111) //交互操作组件必须通过调用API的方式使用 // https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showActionSheet.html wx.showActionSheet({ //显示出来的项目列表 itemList: ['java', '大数据', '小程序','APP'], //点击其中任一项的回调 success (res) { //res.cancel 指的是否点击取消 if(!res.cancel){ console.log(res.tapIndex) } }, fail (res) { console.log(res.errMsg) } }) } })
效果:
model 模态框
wx.showModal({ title: '提示', content: '这是一个模态弹窗', success (res) { if (res.confirm) { console.log('用户点击确定') } else if (res.cancel) { console.log('用户点击取消') } } })
toast
wx.showToast({ title: '成功', icon: 'success', duration: 2000 })
点击
wx.showToast({ title: '加载中', // icon: 'success', icon: 'loading', duration: 2000 })
总结
组件的基本用法:
语法问题:
组件的使用类似于html的方式(有不同),组件使用的严格的XML标准(开闭标签问题)
组件的分类
功能性的组件
完成具体功能的
布局类型的组件
用来完成页面结构的(DIV)
API类型(使用的角度)
wx.showModel
wx.showActionSheet
wx.showToast
完