前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

# 前言

前面章节讲解了事件系统与通讯系统,这两大模块是线程与线程之间的桥梁,那么我们接下来就来探索一下逻辑线程。

本章内容分解:

  • .js语法结构
  • 数据在线程之间如何传递
  • 小程序生命周期设计

# JS语法结构

接下来看一下.js文件的语法结构, 拿pages/index/index.js页面来举例子。

image.png

看到内部是一个Page实例,看到这个Page实例有种似曾相识的感觉,与两个地方有点关联,我们来看一下。

首先是VUE写法,又是不得不与VUE进行一个比对,前面我们比对过WXML与VUE tempalte之间的写法,语法结构十分的相似,比如事件绑定等等都是十分相似的。这个时候来到了逻辑js处还是一股熟悉的味道。

image.png

data的方法

逻辑层的data与view是相互绑定的,WXML中的动态数据说的就是data。平常业务的开发之中,data中存储的数据一般都是初始化数据,之后通过接口或者用户交互等变换为其他数据,在小程序中改变data的方法为setData。

data是页面第一次渲染使用的初始数据。页面加载的时候,data将会以JSON字符串形式由逻辑层传至渲染层。

因此data中的数据必须是可以转成JSON的类型:字符串,数字,布尔值,对象,数组。能储存的类型还是比较有限的,但是在小程序这样的开发环境下也就是够用了,没有什么组件类、或者奇怪的东西需要被更新在data中。

看一下这里的架构图。

js 架构01.png

上图中,渲染层和逻辑层都从start开始出发,自身分别进行初始化操作,都初始化完毕后要怎么做呢?两条线程互相并不知道对方初始化怎么样了。所以这个时候由渲染层发出信号,发出一个我已经初始化完毕的信号发给逻辑层,并且自身状态进入等待。逻辑层收到这个信号的时候有两种情况。第一种就是自身还没初始化完,那么收到此信号后只需要初始化完毕后发送初始数据Data到渲染层即可。第二种情况就是逻辑层早已经进入等待状态,那么收到信号后立即发送初始数据Data到渲染层即可。

看一下js文件中基本绑定语法:

image.png

数据绑定使用 Mustache 语法(双大括号)将变量包起来。

组件属性绑定:

image.png

控制属性绑定

image.png

双向绑定:

image.png

生命周期也是挂在在data同一级。

image.png

  • onLoad(Object query) 页面加载时触发,一个页面只会调用一次,可以在onLoad的参数中获取打开当前页面路径中的参数。
  • onShow() 页面显示/切入前台时触发
  • onHide() 页面隐藏/切入后台时触发。 如 wx.navigateTo 或底部 tab 切换到其他页面,小程序切入后台等。
  • onReady() 页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。
  • onUnload() 页面卸载时触发。如wx.redirectTo或wx.navigateBack到其他页面时。

知识点:可以看到上述几种跳转方式分别对应着不同的生命周期,页面跳转场景中,结合webview一起进行理解则更加透彻,wx.navigateTo方式是创建新的webview,并且展示新的webview,当前webview进入Hide状态,这时,并未进行页面卸载。

路由跳转navigateTo.png

Wx.redirectTo以及wx.navigateBack是通过更新自身webview进行页面转换的,所以当前页面会进行卸载操作,并且重新生成新页面。所以两个页面都会进入完整生命周期序列。这个知识点需要注意一下

路由跳转redirectTo or navigateBack.png

配合整体架构图来看一下生命周期。

js 架构01.png

page实例中还可以添加一些页面事件处理函数和普通的事件,这里就不例举了。

最后我们再来看一下最开始展示的小程序架构图。

小程序架构图.png

在渲染层章节的时候我们了解到每个页面都是一个webview实例,所以我们一共有多少页面,理论上来讲最多就会有多少个webview实例。

在逻辑层就不一样了,内部只有一个APP实例,所有页面里面的写的逻辑都在一个逻辑线程中执行。从小程序渲染层的代码中可以看到。

image.png

是不是有人以为像渲染层WXML一样会有个可执行的编译工具再编译一下我们的js逻辑文件? 并没有哈,所有的js逻辑文件都放在了渲染层文件中执行,并且细看的话utils.js文件也被放在了逻辑层中。当然还有最重要的app.js文件。

后面我们具体看一下逻辑层的整体结构。

fe
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏