01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,
小程序
1,小程序简介:
不需要下载安装即可使用的应用,实现了“触手可及”的梦想,用户扫一扫或者搜一下即可下载
也体现了“用完即走”的理念,用户不关心是否安装太多应用的问题
微信布局:
不仅是聊天平台,更多是服务的平台:订机票,打车,订餐,但是一般还是会使用官方app,因为服务号不能满足用户的需求,所以有了应用号,但是后来改名叫小程序;因为在苹果上线的时候,里边有应用两个字,不符合规范
非技术层面:体验近乎于原生app,代替了服务号,在服务平台的一个布局
技术层面:传统开发模型,就要移动操作系统之上,直接开发应用程序;微信也是基于安卓或者IOS上的一个app, 微信本身的业务会变得很小,取而代之的是小程序代替了很大的部分,
混合式应用开发:通过web开发一些web应用程序,通过cordova/phoneGap等方式运行在安卓或者IOS平台
微信: 开发了应用程序 通过微信提供的平台,运行在iOS或者安卓上
小程序能做什么?
搭建开发环境 https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
VScode 内核,和他很像
2. 小程序的项目结构:
1)首先,找到应用程序的配置文件app.json: 跟页面外观设置的一些变化;
- ‘’Pages’’ 几个页面
- “windows” 导航条,文字背景,文字,颜色等
- 打开开发文档,框架中,配置,有很多示例,可以参考
2)app.js 启动文件
3)app.wxss 样式文件: 全局样式,全局共享的
4)pages 文件夹
- index文件夹
- index.js 完成页面的逻辑:功能实现等操作
- index.wxml (weixin markup language)基于xml,必须有开始结束标签, 定义页面结构
- index.wxss (weixin style sheet) 完全遵循css, 在单位这点比css高级(rpx),定义页面样式
- logs文件夹:
- logs.json 实际上覆盖app.json中windows的定义一些选项; 这个文件可有可无
- logs,wxss 可有可无
页面文件组成
3. 小程序下的配置
配置内容:app.json 指定项目信息,窗口颜色样式,tab栏的组成,
页面配置:page.json 会覆盖app.json中windows的内容,只是windows
标签栏的配置:app.json 下 tabBar 每个标签栏点击后的页面 ;tabBar 是一个对象,最重要的属性list:[是一个数组,指定tab栏中有多少个tab标签], 必须是两个或两个以上,五个以内的的成员才能体现出来
Sitemap 配置-了解: 小程序内搜索,建立索引,
4, 逻辑与界面分离结构
4.1 逻辑层:
JS完成,业务数据供给界面,界面触发事件进行处理
- 逻辑层的JS文件:
-1,小程序不是运行在浏览器中,所以没有BOM(Windows), DOM(document)对象
-2,小程序中有一些额外的成员:
App() 用于定义应用程序实例对象;
page() 用于定义页面对象;
getApp() 获取全局应用实例对象;
getCurrentPages() 用来获取当前页面的调用栈,越早访问历史栈在最底下(数组,最后一个就是当前页面)
wx 对象用来提供核心API
-3。小程序的JS支持CommonJS规范的 :文件和文件是如何相互组织和协调的
4.2 界面层:
页面结构(WXML),页面样式(WXSS),展示逻辑层的数据
1) 数据绑定:
- 动态数据兼容到模板中,做一个界面上的呈现;
- Mustache语法(双大括号){{ }} 将变量包裹起来
<!--index.wxml--> <view class="container"> <!-- the framework : make the developer follows the fixed regulation to write code
1,where is the data? [in the data attribute of the html page object ] 2,binding to where? [wherever you want just use mustache grammer{{}}] -->
<!--{{}} mustache grammer --> <text>{{message}}</text> <text>{{person.name}}</text>
<!-- you can output inner tag; or in the attribute of the tag --> <view class="{{viewClassName}}"></view>
<!-- you can also add to the inner class mustache grammer {{}} use : 1,inner elements 2, attribute of the elements 3, can't use in tag name or attribute; just for value --> <view class="add {{viewClassName}}"></view>
<text>{{'hello'}}</text> <text>{{11111}}</text> <text>{{1111 + 9999}}</text> <text>{{100>50?'okay, you are right~':'sorry :D'}}</text>
<!-- checkbox add the checked='false' is also checked; cause they think its a string; you need to use {{}} : if the grammer is under misunderstand situation use {{}} --> <checkbox checked="{{false}}"></checkbox> </view> |
Index.js // provide the data to the html page // data is a briage between interface and logic Page({ data: { message: "hello Lindsay", person: { name: 'luojin', age: 20, major: 'computer science' }, viewClassName: 'hi' } }) |
2) 列表渲染
逻辑层中 数组型的数据,就需要用到列表的渲染
<!-- 四,列表渲染 list data render --> <!-- 1, you need to know the loop content of the html structure 2,delete the same content, just remain one 3, add wx:for = 'the data/array / object you want to through ' 4, in the tag (loop) ,use : item = element that you want to though if the whole attribute has the [item] keyword, you need to change item keyword 像这样: wx:for-item=“” 起别名的效果 index 可以拿到索引 wx:for-index="bbb" 可以修改index的名字,如果有重名的话
--> <view> <view wx:for="{{todos}}" wx:key="key" wx:for-item="aaa"> <text>{{index}}</text> <checkbox checked="{{item.completed}}"></checkbox> <text>{{aaa.name}}</text> </view> <!-- <view> <checkbox></checkbox> <text>js</text> </view> <view> <checkbox></checkbox> <text>css</text> </view> <view> <checkbox checked="{{true}}"></checkbox> <text>html</text> </view> -->
</view> </view> |
按钮的使用: <button bindtap="buttonTapHandle">click </button> App.js 中的函数代码: Page({ buttonTapHandle: function(e){ console.log(111); // console.dir()将一个对象以树状的形式打印到控制台 console.dir(e); }, |
3)事件冒泡
<!-- 3,事件冒泡 1)基本的事件使用,就是通过给组件 添加一个 ‘bind + 事件名’ 的属性,属性的值指向一个定义在当前页面对象中的js 方法; 2)冒泡:两个元素相互嵌套,点击内部,外部也会触发; 3)阻止冒泡:bindtap 换成 catchtap=‘’ --> <view bindtap="outerHandle" style='width:50px;height:50px;background-color:red'> <view catchtap="innerHandle" style='width:30px;height:30px;background-color:blue'></view> </view> |
App.js代码 Page({ innerHandle: function (){ console.log("inner") }, outerHandle: function (){ console.log("outer") } }) |
4)事件传参
和之前的事件参数不是一回事,以前,多个元素公用一个事件,怎么知道到底是哪个按钮触发了这个按钮,通过this,找到当前对象,做一些划分;第二种用参数区分
小程序中不一样
<!-- 4,事件传参 1)基本使用:bind(XXX) / catch(XXX) 2)小程序事件冒泡和html中 不一样,这里使用 catch~ 3)如果需要给事件处理函数 指定参数的话,只能通过 dataset 这样方式 ,就是给元素添加 data- 通过e.target拿到点击的元素 dataset指以data-开头的数据 data-hello-name="luojin", 会自动变成驼峰命名法 --> <button bindtap="buttonTapHandle2" data-name="luojin">事件传参 </button> |
buttonTapHandle2: function (e) { //data-... 给dom元素记录数据用的 // 在这里中的this 事件处理函数中的 指向还是页面对象 !!! 和html开发不一样 // console.log(this) console.log(e.target.dataset) //对象 } |
5),单向数据流
应用程序:把一堆数据呈现到界面上,再把用户输入在界面上的东西,保存当数据当中,这其中涉及到数据的扭转;
逻辑(JS)--------数据绑定this.setData()--------》界面(wxml)
逻辑(JS)《---------------事件-------------------界面(wxml)
用户向文本框输入内容,同步显示到代码框中的text标签中:bindinput = “ ”,可以通过detail拿到需要的值,在保存给data中的message
通知框架:数据绑定之后,需要检视数据变化,想同步,需要通知, 调用方法,同步到界面上setData({ })
|
SetData() 改变数据
|
|
6 |
6),页面登陆案例
实现功能:
(1)数据绑定,通过逻辑层 到 界面层:界面语法用 {{ }}语法,绑定数据,在界面发生变化时,触发 bindinput=’change’ 方法;
(2)改过的值,传给逻辑层,通过 this.setData() 把原本数据改掉,再给界面
如何做?
- 设计数据结构:data属性,它是一个对象,他的成员由输入框决定;用户名和密码等
- 将数据绑定到 指定元素上:value= ‘{{ username}}’
(3)等待用户输入,登陆点击事件(具体的登陆逻辑)bingtap=””/catchtap=’’’没有冒泡的
完成具体逻辑:
- 先需要知道用户输入了什么?
给文本框绑定事件,bindinput=’’ usernameHandle’’;等
定义这个 usernameHandle’函数,通过e.detail.value拿到用户输入的值
- 根据用户输入的值判断
- 根据判断的结果作出相应:输入对了 跳转,错了给一个提示等
(4)抽取共同事件处理函数
如果给每一个文本框绑定一个处理函数,代码会非常多
找共同点:函数体内部,只是属性名字不一样;你告诉我要改哪个?使用参数,但是在小程序中不可以自己传参数,要借助,setData()
|
JS属性名要用变量代替,必须是字符串,字符串必须用在索引器中,定一个对象,通过对象传递进去 var changed = { } changed[], 如果知道属性名可以用点的方式,但是用变量值做属性名,要用【】索引器的方式
可变的usename:是可变的,要借助外界传进来,怎么传进来?要想在事件中传自己自定义的参数,只能借助dataset属性:e.target.dataset[‘prop’]
改变界面的绑定:
加上data属性:
|
|
(5)其实,真正做的时候,不需要这样
在小程序有一个 form表单组件,不需要给文本框做什么事件绑定,给外界套上一个form标签,把按钮改成 submit按钮,点击之后,会触发提交事件,提交时候,会拿到所有input元素,要给input加上name属性
|
|
7)条件渲染
根据表达式决定我们某一个元素,或者某一些元素是否显示在界面上,WX:if =“{{ 为真,显示 }}”
切换面板展示,点击展开内容
|
|
Block 把元素包裹起来,写一些属性,同时控制多个元素;只是控制属性的载体,页面渲染当中没有实际意义;
If 和 hidden 的区别:
Hidden: 只能作用于具体的元素上;为真时隐藏,display:none;
Wx:if : 为真时 存在;这个在页面的结构中根本就不存在;当条件不存在的时候,是不会渲染它的
8)wxss vs css
Wxss: 样式,扩展:尺寸单位 rpx (responsive pixel)
5, UI 开发
5.1 基础内容组件
icon text rich-text progress
(1)icon: 定义图表类型
属性值type:success, success_no_circle, info, warn, waiting, cancel, download, search, clear
属性值size: 23默认
属性值color: 'red'
(2)text: 文本标签
支持内容换行
更好的控制文本样式等
类似于 p 标签,但是可以相互嵌套
(3)rich-text
(4)progress
show-info 控制是否显示数值
<icon type="download"></icon> <icon type="download" size="40px" color="blue"></icon>
<text>this is a text</text> <rich-text space="emsp">this is a text</rich-text>
<progress percent="10" show-info stroke-width="6"/> |
5.2 表单控件
参考: https://developers.weixin.qq.com/miniprogram/dev/component/button.html
<-- 表单控件 button:type=“default” / primary / warn 主要用来控制类型 size: default 和 mini plain 变透明 disabled 是否禁用 loading 是否带有加载图标 form-type 用于 form 组件,点击分别会触发 form 组件的 submit/reset 事件 hover-class 控制按下去的样式 --> <button type="default">默认按钮</button> <button type="primary" size="default" plain>primary按钮</button> <button type="warn" size="mini" loading>warn按钮</button> <button hover-class="btn-active">hover class</button> |
5.3 操作反馈
<!-- 5.3 操作反馈 通过调用方法API 实现, --> <button type="primary" bindtap="actionFeedback">操作反馈..</button>
actionFeedback: function(){ // 当点击按钮式触发 // console.log(1111) // 交互操作组件,必须通过API 调用 // 1,wx.showActionSheet /* wx.showActionSheet({ itemList: ["A","B","C"], //显示出来的默认列表 success: function(res){ //点击其中任意一个的回掉函数 if(!res.cancel){ //res.cancel是否点击取消按钮 console.log(res.tapIndex) //res.tapIndex 点击的下标 } } }) */ // 2,莫泰框 /* wx.showModal({ title: 'nihao', content: '这是一个莫泰框', success: function(res){ if(res.confirm){ console.log("用户点击确定") } } }) */
// 3, 通知 wx.showToast({ title: 'hello', icon: 'success', // 只支持success 和loading duration: 2000 }) }, |
5.4 布局类组件(视图容器)
伸缩布局 flex
5.5 基础布局案例 – tab标签栏 选项卡
- 页面之间跳转
使用绝对路径;
Json文件,为空,会不符合json数据格式
- 页面之间值传递
?号行式:输入内容,点击按钮,跳转到下一个页面,肯定需要我们刚才填的这个内容?
如何拿到这个值呢?
1,输入之后,点击,跳转下一个页面,如何实现传值呢?
2,下一个页面如何拿到这个值 :并显示在下一个页面上,必须要配合js脚本 才可以做到
onLoad: function (options) {
console.log(options)
// console.log(options) object {name: "xiaoming"}
},
redirect 重定向:跳转不回返回?无历史记录,:只需要访问一次的页面,应用程序刚开始启动,引导页,应用说明等
<navigator url="../demo2/demo2" redirect> skip(not back)</navigator>
导航元素显示高亮:
Cursor:point;也是一个高亮的方式,可以让任何元素点击高亮
<navigator hover-class="my-hover"> 导航元素高亮显示 </navigator>
页面导航API: