大家好,我来了!本期为大家带来的Web前端学习知识是”Web前端:小程序界面与逻辑项目实训“,喜欢Web前端的小伙伴,一起看看吧!

主要内容

  1. 数据绑定
  2. 渲染
  3. 界面层数据渲染
  4. 事件处理

学习目标

一、数据绑定

1.1 渲染层和逻辑层

小程序宿主环境

我们称微信客户端给小程序所提供的环境为宿主环境。小程序借助宿主环境提供的能力,可以完成许多普通网页无法完成的功能。

小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。

整个小程序框架系统分为两部分:逻辑层(App Service)和 视图层(View)

逻辑层与渲染层分离

首先,我们来简单了解下小程序的运行环境。小程序的运行环境分成渲染层和逻辑层,其中 WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层。

小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。一个小程序存在多个界面,所以渲染层存在多个WebView线程,这两个线程的通信会经由微信客户端(下文中也会采用Native来代指微信客户端)做中转,逻辑层发送网络请求也经由Native转发,小程序的通信模型下图所示。

1.2 逻辑文件介绍app.js pages.js

app.js 小程序逻辑

每个小程序都需要在 app.js 中调用 App 方法注册小程序实例,绑定生命周期回调函数、错误监听和页面不存在监听函数等

生命周期回调函数:小程序从创建到销毁的整个过程,自动创建的一些函数

包含内容:

  1. 全局变量 globalData:{}
  2. 生命周期函数
  3. 定义事件函数

pages.js 页面逻辑

对于小程序中的每个页面,都需要在页面对应的 js 文件中进行注册,指定页面的初始数据、生命周期回调、事件处理函数等

  1. data界面视图的数据内容

2.自己的生命周期函数

3.自定义事件的函数

1.3 逻辑层javascript

我们先看下小程序的javascript和普通页面的javascript区别

小程序javascript的三个特点:

1.小程序不是运行在浏览器中,没有BOM和DOM

console.log(window) ->undefined

console.log(document) ->undefined

2.小程序的js有一些额外的成员

App()方法 用于定义应用程序实例对象

Page()方法 用于定义页面对象

getApp()方法 用于获取全局的应用程序对象

wx 对象 提供核心API

// xxx.jsconst appInstance = getApp()

console.log(appInstance.globalData) // I am global data

3.小程序的js支持Commonjs规范

module.exports={} 导出

var data=require(./data.js) 引入

模块化

可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块。模块通过 module.exports 对外暴露接口。

// common.js
function sayHello(name) {console.log(`Hello ${name} !`)}
function sayGoodbye(name) {console.log(`Goodbye ${name} !`)
}
module.exports.sayHello = sayHello

在需要使用这些模块的文件中,使用 require 将公共代码引入

var common = require('common.js')
Page({helloMINA: function() {common.sayHello('MINA')},goodbyeMINA: function() {common.sayGoodbye('MINA')}
})

在 JavaScript 文件中声明的变量和函数只在该文件中有效 不同的文件中可以声明相同名字的变量和函数,不会互相影响

1.4 界面层数据绑定

1.4.1 数据绑定

WXML 中的动态数据均来自对应 Page 的 data。

简单绑定

数据绑定使用 Mustache 语法(双大括号)将变量包起来,可以作用于:

内容

<view> {{ message }} </view>
Page({data: {message: 'Hello MINA!'}})

组件属性(需要在双引号之内)

<view id="item-{{id}}"> </view>
Page({data: {id: 0}})

{{}}语法用途

表达式 获取变量 绑定class属性

特殊地方:

1.4.2 列表渲染

wx:for

在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。

默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item

<view wx:for="{{array}}">{{index}}: {{item.message}}
</view>
Page({data: {array: [{message: 'foo',}, {message: 'bar'}]}})

使用 wx:for-item 可以指定数组当前元素的变量名,

使用 wx:for-index 可以指定数组当前下标的变量名:

<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">{{idx}}: {{itemName.message}}
</view>

block wx:for

类似 block wx:if,也可以将 wx:for 用在<block/>标签上,以渲染一个包含多节点的结构块。例如:

<block wx:for="{{[1, 2, 3]}}"><view> {{index}}: </view><view> {{item}} </view>
</block>

1.4.3 条件渲染

wx:if

在框架中,使用 wx:if="" 来判断是否需要渲染该代码块:

<view wx:if="{{condition}}"> True </view>

也可以用 wx:elif 和 wx:else 来添加一个 else 块:

<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>

block wx:if

因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使用一个 <block/> 标签将多个组件包装起来,并在上边使用 wx:if 控制属性。

<block wx:if="{{true}}">
<view> view1 </view>
<view> view2 </view>
</block>

注意: <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

wx:if vs hidden

因为 wx:if 之中的模板也可能包含数据绑定,所以当 wx:if 的条件值切换时,框架有一个局部渲染的过程,因为它会确保条件块在切换时销毁或重新渲染。

同时 wx:if 也是惰性的,如果在初始渲染条件为 false,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。

相比之下,hidden 就简单的多,组件始终会被渲染,只是简单的控制显示与隐藏。

一般来说,wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。

二、事件处理

2.1 什么是事件

  • 事件是视图层到逻辑层的通讯方式。
  • 事件可以将用户的行为反馈到逻辑层进行处理。
  • 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
  • 事件对象可以携带额外信息,如 id, dataset, touches

事件的使用方式

在组件中绑定一个事件处理函数。

如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。

<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>

在相应的Page定义中写上相应的事件处理函数,参数是event。

Page({tapName: function(event) {console.log(event)}})

2.2 事件冒泡

2.2.1 事件分类

事件分为冒泡事件和非冒泡事件:

冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。

非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。

2.2.2 绑定并阻止事件冒泡

除 bind 外,也可以用 catch 来绑定事件。与 bind 不同, catch 会阻止事件向上冒泡

例如在下边这个例子中,点击 inner view 会先后调用handleTap3和handleTap2(因为tap事件会冒泡到 middle view,而 middle view 阻止了 tap 事件冒泡,不再向父节点传递),点击 middle view 会触发handleTap2,点击 outer view 会触发handleTap1。

<view id="outer" bindtap="handleTap1">outer view<view id="middle" catchtap="handleTap2">middle view<view id="inner" bindtap="handleTap3">inner view</view></view></view>

2.3 事件传参

dataset

在组件节点中可以附加一些自定义数据。这样,在事件中可以获取这些自定义的节点数据,用于事件的逻辑处理。

在 WXML 中,这些自定义数据以 data- 开头,多个单词由连字符 - 连接。这种写法中,连字符写法会转换成驼峰写法,而大写字符会自动转成小写字符。如:

  • data-element-type ,最终会呈现为 event.currentTarget.dataset.elementType ;
  • data-elementType ,最终会呈现为 event.currentTarget.dataset.elementtype 。

示例:

<view data-alpha-beta="1" data-alphaBeta="2" bindtap="bindViewTap">DataSet Test
</view>
Page({bindViewTap:function(event){event.currentTarget.dataset.alphaBeta === 1 // - 会转为驼峰写法event.currentTarget.dataset.alphabeta === 2 // 大写会转为小写}}

2.4单数数据流

实现数据同步修改

index.wxml

this.setData({data属性:属性值
})

三、模板使用

WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。

3.1 定义模板

使用 name 属性,作为模板的名字。然后在<template/>内定义代码片段,如:

<template name="msgItem"><view><text> {{index}}: {{msg}} </text><text> Time: {{time}} </text></view>
</template>

3.2 使用模板

使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入,如:

<template is="msgItem" data="{{...item}}"/>
Page({data: {item: {index: 0,msg: 'this is a template',time: '2016-09-15'}}})

is 属性可以使用 Mustache 语法,来动态决定具体需要渲染哪个模板:

<template name="odd"><view> odd </view></template><template name="even"><view> even </view></template>
<block wx:for="{{[1, 2, 3, 4, 5]}}"><template is="{{item % 2 == 0 ? 'even' : 'odd'}}"/>
</block>

四、网易云精选案例

效果图:

本期为大家带来的Web前端学习知识”Web前端:小程序界面与逻辑项目实训“介绍完毕了,想了解更多内容的小伙伴,关注我,更多内容等你看,我们下期再见!

web前端小项目个人实例_Web前端:小程序界面与逻辑项目实训相关推荐

  1. web前端学习文档 电子版_web前端小白系统入门学习

    正文 互联网正在改变我们的生活,前端也成了很重要的岗位之一,许多人都往前端靠拢,可又无能为力,不知所措,首先我们说为什么在编程里,大家都倾向于往前端靠呢?原因很简单,那就是,在程序员的世界里,前端开发 ...

  2. web前端学习文档 电子版_web前端工程师要学习那些内容

    一,最简单也是最基础的H5+C3 1.HTML4 文档标题可见文本...1.基本标签(Basic Tags) 最大的标题 . . . . . . . . . . . . 最小的标题 这是一个段落. 2 ...

  3. vue 为什么要销毁第三方实例_Web前端工程师面试之Vue问题汇总解析

    又是一年毕业季,很多学习前端的同学面对激烈的求职竞争倍感压力,想要了解企业招聘会提问哪些问题.今天千锋郑州Web前端培训小编就给大家分享一下高级Web前端工程师面试中有关Vue的问题及解析. 1.Vu ...

  4. vscode中前端vue项目详解_web前端Vue项目实战-Music

    上篇讲到vue的使用方法,今天这一篇介绍vue的实操,可以大家更加加固去学习web前端vue技术. 第一节 Music项目环境第一部分 本届作业 聊一聊React和Vue的区别 老版本的项目环境如何创 ...

  5. vue 前端设置允许跨域_web 前端的一些小问题

    关于vue使用axios post发送json数据跨域请求403的解决方法: 1. 问题 vue开发的时候,使用axios跨域发送请求,同时post发送的数据格式是json格式,发送出去的时候发现控制 ...

  6. web前端需要学MySQL吗_web前端开发需要学些什么

    展开全部 Web前端是为了协调前端设计62616964757a686964616fe4b893e5b19e31333433636234与后端开bai发之间工作的岗位,是最接近产品和设du计的工程师,起 ...

  7. web前端开发技术期末考试_web前端开发技术试卷六

    Web 前端开发技术课程考试试卷(六) 总分 100 分 考试时间: 120 分钟 考试形式:闭卷 一.选择题(每题 1 分,共 20 分) 1 .以下标记符中,用于设置页面标题的是 _______ ...

  8. web前端需要学MySQL吗_web前端需要学什么?容易学吗?

    展开全部 第一62616964757a686964616fe78988e69d8331333433623739 前端开发难学吗??   总在难易上徘徊,容易内心纠结. 如果学什么课程之前,首先考虑的难 ...

  9. web前端开发技术期末考试_Web前端开发技术期末试题与答案2

    4.外部JavaScript文件后缀名通常为 . (A)*.html或*.htm (B)*.txt (C)*.css (D)*.js 5.下列代码中设置5号标题字正确的语句是 . (A)HTML (B ...

最新文章

  1. 推荐 6 个好用到爆的 Pycharm 插件
  2. 中消协发布2018年春节消费提示
  3. 牛客华为机试第5题python
  4. 蓝桥杯:入门训练 圆的面积
  5. matlab指纹图像采集,基于MATLAB实现的指纹图像预处理
  6. Java中的主类概念以及public static void main方法的分析
  7. C#——《C#语言程序设计》实验报告——继承与多态——银行ATM程序
  8. boost::mpl模块实现lambda相关的测试程序
  9. 卡西欧9860连接电脑数据传输_轻松办公好助手,卡西欧STYLISH计算器体验记
  10. sql server常用性能计数器
  11. indesign文字怎么绕排图片形状_indesign透明度怎么调整?indesign怎么设置图片透明度?...
  12. ElasticSearch 2 (16) - 深入搜索系列之近似度匹配
  13. Ubuntu下安装配置Honeyd蜜罐
  14. 最后一本书 上机5(翻书)
  15. vue项目怎么修改项目名称
  16. android显示输入法键盘布局,android 解决输入法键盘遮盖布局问题
  17. 华为使用计算机投屏要打开什么,华为手机怎么投屏到电脑?这些小屏变大屏的操作你会吗...
  18. 笔记 -- 时间复杂度 log2n
  19. 武汉星起航:亚马逊卖家做站外引流可以给店铺带来哪些好处
  20. How to choose optimizer ?训练时,如何选择优化器?

热门文章

  1. dell服务器t330进入不了系统,Re: 戴尔T330服务器故障
  2. 从入门到入土:基于Python实现百度查询返回结果真实url读取及域名读取
  3. Eggplant 依托人工智能技术,改造软件自动化测试
  4. 大厂难进,Java面试该如何一面即中?
  5. 手撕前端面试之经典排序算法
  6. Python写出一个字节,一个YouTube,我用Python怎么了!
  7. JavaScript 流行度最高,Java 屈居第三! | 2020 最新软件开发状况报告
  8. 寒武纪与华为海思分庭抗礼:中立芯片公司的成人礼
  9. 清晰架构的 Go 微服务: 程序容器
  10. 百度网盘就“用户激励计划”道歉;沈义人卸任 OPPO 全球营销总裁;Python 2.7.18 发布| 极客头条...