我写小程序像菜虚鲲——2、

引言

大家好,我是练习时长两年半的个人练习生菜虚鲲,我喜欢唱,跳,rap,篮球,Music!

嗯哼!还是别那么沙雕了,严肃点,我可是在写技术教程啊!
(私信催更让我写沙雕文的是?吗?)

人靠衣装马靠鞍,狗配铃铛跑的欢,先来学下小程序的界面开发,先整点????
的,后面在去撸交互流程,优化性能等等这类东西。本节内容比较简单,学习流程
如下,读者根据自己的层次按需学习:

  • ?学一学:几分钟速成前端三剑客(HTML,CSS和JavaScript)的基本语法。
  • ?比一比:从HTML、CSS无痕过渡到微信小程序的WXML、WXSS。
  • ?瞄一瞄:微信小程序都提供了哪些组件。
  • ?搞一搞:控制组件隐藏显示两种方法:block wx:if VS hidden属性。
  • ?爽一爽:重复代码抽模板template/组件component,哪里用到哪里导。
  • ?皮一皮:反编译别人的小程序,学(chao)习(xi)下组件怎么堆。

看上去内容很多,其实都很简单,估计十分钟不用你就看完本文了~

?Music!


0x1、?你太美贝贝耶(前端基础语法速成)

上节就说过,原生小程序的玩法:

wxml里写页面,wxss里写样式,js里写逻辑,json里改配置

可能有些小白真的完全没碰过前端,作为一个《真丶从零开始学习微信小程序开发》 的教程:

就顺带提提吧,也就几分钟~


1、前端三剑客(HTML,CSS,JS)


HTML(Hyper Text Markup Language)

超文本标记语言,没有编译过程,只是一个标记语言,而非编程语言,通过各种标签的堆砌成网页。

一个简单的HTML页面代码示例如下:


<html>
<head>
<title>一个标题title>
head>
<body>
    <p>内容p>
body>
html>
复制代码

接着是「两个名词」

标签/元素」:尖括号包围的关键词,比如上面的

,语法如下:

  • 标签一般 成对出现,如上面的

    内容

    ,也有例外,如换行

    前面的标签称为「开始/开放」标签,后面的标签称为「结束/闭合」标签。
  • 标签支持 嵌套,但 不能交叉,比如

    正确,

    却是错误的。

属性」:给标签添加辅助信息,属性以 键值对 的形式出现,比如为a标签添加跳转链接:

<a href="http://coder-pig.github.io">疯狂暗示~a>
复制代码

语法如下

  • 可以为一个标签设置多个属性,使用 空格 隔开;
  • 几个通用的属性:class(设置类名),id(设置元素唯一ID),style(设置元素样式)

想了解更多标签以及属性可移步至:www.w3school.com.cn/tags/index.…


CSS(Cascading Style Sheets)

层叠样式表,样式就是标签的表现形式,比如:为文本标签设置蓝色字体的样式。

<font color="blue">文字font>
复制代码

层叠 指的是:利用CSS选择器对HTML元素堆叠很多样式!其实利用标签的 style属性
就能添加样式,但还引入CSS的原因解决内容和表现分离的问题。修改CSS文档即可
改变HTML页面中所有元素的布局和外观,而不需要自己到HTML页面里一个个找元素进行修改。

引入CSS样式的四种方式


<p style="color: #000000;">xxxp>


<style type="text/css">
    h1 {background-color:#000000;}
style>


<head>
    <link rel="stylesheet" type="text/css" href="mystyle.css">
head>


<style>
    @import url("style.css");
style>


复制代码

CSS选择器

要为标签设置样式,总得先找到结点吧?CSS选择器就是用来 定位标签的一套规则

三类选择器

  • 标签选择器:文档中 所有的特定标签 使用同一个CSS样式。
  • id选择器:元素以 id属性 来设置id选择器,选择器以"#"来定义。
  • 类选择器:元素以 class属性 来设置类选择器,可以在多个元素中使用,以"."号显示。

新建一个test.html,试试CSS选择器的使用:


<html>
<head>
  <title>CSS示例title>
  <style type="text/css">
  --
 标签选择器 >
  p {background-color:red;}
  -- id选择器 >
  #id-choose {background-color:green;}
  -- class选择器 >
  .class-choose {background-color:blue;}
style>
head>
<body>
  <p>文字1p>
  <p id="id-choose">文字2p>
  <p class="class-choose">文字3p>
body>
html>
复制代码

浏览器打开看下效果

除此之外,还有些组合玩法,比如派生选择器,关于CSS选择器和定位,后面会细讲,莫慌。
更多CSS样式以及CSS选择器的详细用法可移步至:www.w3school.com.cn/css/index.a…


JSJavaScript

号称最流行的脚本语言(我大py表示不服),除了前端写交互和动效,通过Node.js还能写服务端:

著名的Atwood定律:Any application that can be written in JavaScript, will eventually be written in JavaScript.

依旧是简单的过过JavaScript的基础语法~

「1、变量」:通过 var关键字 来声明,字母开头,区分大小写。
「2、注释」:分为单行注释(//注释内容) 和 多行注释(/*注释内容*/)。
「3、数据类型」分两类:

基本数据类型

  • undefined(未定义):变量没初始化的默认值。
  • null(空):空值,可理解为占位符,可用于初始化变量或函数返回值。
  • string(字符串):所有字符为16位,Unicode编码,使用单/双引号表示。
  • boolean(布尔):用于逻辑判断,只有 true 和 false 两个值。
  • number(数值):内部表示为64位的浮点数,js中1和1.0的值是相同的。

引用数据类型

  • 数组var num = [1,2,3]; 通过下标访问,下标从0开始,支持不同类型的元素!
  • 对象大括号包裹,对象属性通过 名称:对 的形式来定义,多个属性用逗号隔开。
    var person = { id: 1, name:"抠腚男孩" };,可以通过.或者[]访问属性,比如:
    person.idperson["id"]都是可以的。
  • 函数:通过function关键字来定义,使用大括号包裹代码块。

「4、运算符」

  • 算数运算符(7种):`+`(加)`-`(减)`*`(乘)`/`(除)`%`(求余)`++`(自增)`--`(自减)
  • 赋值运算符(6种):算数运算符后加`=`(等号)`=`、`+=`、`-=`、`*=`、`/=`、`%=`
  • 逻辑运算符(3种):`&&`(和)`||`(或)`!`(非),返回一个布尔值。
  • 比较运算符(8种):`==`(等于)、`===`(绝对等于,值与类型都相等)、`!=`(不等于)、
    `!==`(值或类型不等)、`>`(大于)、`<`(小于)、`>=`(大于等于)、`<=`(小于等于)
  • 条件运算符:简化的if语句,比如:var s = age > 18? (输出成年):(输出未成年)
  • 按位运算符(7种):`&`(按位与)`|`(按位或)`^`(按位异或)`~`(按位取反)`<<`(左移)
    `>>`(有符号右移)`>>>`(无符号右移)
  • 类型运算符(2种):typeof(返回变量类型),instanceof(判断对象是否为某个类型)。

「5、条件结构」:JS中的条件结构分为ifswitch结构,代码示例如下:

var socre = 70;


if(score > 60){
  console.log("合格");
}else {
  console.log("不合格");
};


if(score < 60){
  console.log("不及格");
}else if(score <= 70){
  console.log("及格");
}else if(score <= 80) {
  console.log("中");
}else if(score <= 90) {
  console.log("良");
}else {
  console.log("优");
};


switch(true){
    case score < 60: console.log("不及格"); break;
  case score < 70: console.log("及格"); break;
  case score < 80: console.log("中"); break;
  case score < 90: console.log("良"); break;
  default: console.log("优"); break;
};
复制代码

「6、循环结构」

  • for循环:多次循环执行某个代码块。
  • for-in:遍历对象属性。
  • while:当指定条件为true时,循环执行某个代码块,do-while是先执行一次再判断。

除此之外还有两个循环中断语句break(跳出循环) 和 continue(跳过当前循环进入下次循环)。
关于JS的基本语法就讲到这里吧,内容太多一时半会也讲不完,想系统学的可以移步至:
www.w3school.com.cn/b.asp,反正我写了两周多的小程序也没怎么翻文档,
可能是我小程序还没玩溜吧,后面觉得有需要再另开一节撸JavaScript吧。


2、微信小程序中的WXML与WXSS

HTML/CSS和微信小程序的WXML/WXSS可谓是「极其相似」,官方有篇对比的文章:
《小程序代码构成》,这里简单提炼下要点。

WXML VS HTML

  • 不一样的标签:木有了div, p, span,多了 view, button, text等常用控件。
  • 不能操作DOM树:不能像网页一样通过DOM API操纵DOM的属性和行为,比如
    无法通过getElementById()来访问元素。小程序采用MVVM模式,数据双向绑定,
    通过一种模板语法来描述状态和界面结构关系。
  • 事件:组件的内部行为会通过事件的形式让开发者感知。

CSS VS WXSS

  • 新增尺寸单位rpx,根据屏幕宽度进行自适应。
  • 提供全局样式与局部样式:app.wxss全局生效,page名.wxss单页面生效。
  • 仅支持部分CSS选择器

PS:其实差别也不是很大,会HTML和CSS过渡到WXML和WXSS很容易,有问题多查
文档即可。


0x2 ?你太美贝贝oh(微信小程序组件速览)


1、自带组件一览

略略看下微信小程序都提供了哪些组件,想用的时候知道去查哪个就好,
本系列不会一个个讲解控件,官方文档对于各个组件都有详细讲解,
还有每个组件Bug & Tip 可以看看,文档链接:
developers.weixin.qq.com/miniprogram…


2、block wx:if vs hidden

在日常开发中有一个很常见的需求,根据不同的情况控制组件的显示或隐藏。
在微信小程序中可以通过hidden属性来控制,使用代码示例如下:


//添加一个变量控制
Page({
  data: {
    isLogin: false  //是否登录
  },
})


//使用<block wx:if>
<view class="container">
    <block wx:if="{{isLogin}}">
        <view>已登录view>
    block>
    <block wx:else>
        <view>未登录view>
    block>
view>

//使用hidden属性控制
<view hidden="{{isLogin}}">未登录view>
<view hidden="{{!isLogin}}">已登录view>
复制代码

两种方法都可以实现我们想要的效果,接着说下两者的区别:

  • wx:if惰性,如果初始渲染条件为false,什么都不做,直到条件第一次为true时才
    开始局部渲染,有更高的切换消耗,适用于运行条件改变不太频繁的场景。
  • hidden:组件始终会被渲染,只是控制显示与隐藏,有更高的初始渲染消耗,
    适用于频繁切换的场景。

另外,有一点要注意:

block并不是一个组件!!!它仅仅是一个包装元素不会在页面中做任何 渲染,只接受控制属性如wx:if,wx:for等。比如你想当条件成立时,显示这一堆
组件,不显示的时候用那堆组件,就可以用block包裹。如果只有一个组件需要
判断,就没必要裹一层block,比如上面的代码完全可以把block去掉:

<view wx:if="{{isLogin}}">已登录view>
<view wx:else>未登录view>
复制代码

3、模板template与组件component

页面写多了,自然存在一些重复代码,毕竟美工也是想偷懒的,有相同
或类似的地方实属正常。不像美工直接复制个图层粘贴下就好了,我们
除了需要复制页面代码,还可能还需要去复制样式,交互逻辑等。每次
都手动去复制粘贴,多捞啊,作为一个喜欢效(tou)率(lan)的开发仔,肯定
要想办法把相关的代码抽取出来啊,用到的时候导一导就好。而在小程序
中提供了两种复用模式:

  • template模板,主要用于展示,函数需要在调用页另外写。
  • component组件,可以有自己的业务逻辑,可看做单独的page页面,用于业务逻辑交互多的场景。

接着我们写两个最简单的代码来分别体验下这两者的区别。


模板template

模板文件的创建与引用

新建templates文件夹 => 新建一个text.wxml文件 => 模板部分使用