零基础学习微信小程序【原生】 第1天

254 阅读9分钟

1. 今日学习目标

  1. 微信小程序的帐号注册
  2. 微信小程序的开发者工具使用
  3. 微信小程序的基本目录结构
  4. 微信小程序的配置
  5. 微信小程序的模板语法
  6. 微信小程序的条件渲染、事件

2. 什么是微信小程序

  • 什么是微信小程序

    微信小程序官方释义(baike.baidu.com/item/%E5%BE…

    • 一个前提:必须安装了微信;
    • 划重点:不需要下载安装即可使用的应用 ;
    • 微信体系(微信订阅号、微信服务号、微信企业号)的重要组成部分
    • 使用过哪些小程序
    • 微信官方出品小游戏 跳一跳
  • 小程序/移动端网站/app都是什么玩意儿?—— 都是为了适应移动应用时代

    • app —— 必须在应用市场下载安装;根据手机系统可分为ios版本,安卓版本;例如:淘宝app/京东app/微信app等;
    • 移动端网站 —— 通过手机浏览器访问的网址链接,例如:淘宝(main.m.taobao.com/);京东(https:…
    • 小程序 —— 依托微信,在微信里可以直接访问的应用 ;
  • 小程序优势

    • 轻量化

      小程序不像APP一样,需要下载安装,需要注册登录。小程序的特点是即用即走,也可以从当前平台直接授权用户资料;用户使用小程序的决策成本要比使用APP低得多,更有利于吸引用户使用;

    • 背靠生态

      微信小程序背靠着微信巨大的流量平台,能够有效地从生态当中去吸引流量;

    • 方便营销

      小程序的营销工具要比公众号等自媒体要多,裂变属性比APP更强;用小程序能够有效地进行营销活动;

    • 一句话总结

      • 小程序发展势头正足,好好学才是硬道理

3. 微信小程序的注册

  1. 微信公众平台

  2. 开放开台与公众平台的区别

    1. 开放开台,是微信开放的一些公用的API接口,如微信登陆,微信支付。

    2. 公众平台:为小程序,小游戏开发服务的平台。

    3. 区别:

      开放平台常用于前端开发,开发者常依托于微信平台来开发一些功能,并嵌套在微信app内部使用。

      公众平台常用于后端开发,开发者往往是第三方软件开发者,使用微信提供的接口与自家软件做功能对接。

  3. 通过是否登录成功来验证注册是否成功

    image-20200923082614900.png

  4. 微信开发者工具下载地址

        https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
    
  5. 双击打开 微信开发者工具 然后 微信 扫码登录即可

    image-20200923083002706.png

  6. 填写项目的信息

image-20210307190157452.png

  1. 成功显示了第一个小程序应用

WX20201102-115434@2x.png

  1. 介绍微信开发者工具界面/工具

    模拟器 —— 预览小程序;

    编辑器 —— 写代码的工作区;

    调试器 —— 测试打印,给程序员自己看的内容;

    编译 —— 重新加载小程序。

  2. 登陆地址 : mp.weixin.qq.com/

  3. 开放文档地址 : developers.weixin.qq.com/miniprogram…

4. 微信小程序的基本目录结构

字段作用
pages用来存放所有小程序的页面,每个页面都是一个单独的文件夹
utils用来存放工具性质的模块
app.js整个小程序项目的入口文件
app.json全局配置文件
app.wxss全局样式文件
project.config.json项目的配置文件 不常用
sitemap.json配置页面被微信搜索到的一些设置 不常用

5. 微信小程序最精简代码结构

  1. app.js

    App({})
    
  2. app.wxss

    里面为空

  3. app.json

    {
        "pages":[
            "pages/index/index"
        ],
        "window":{
            "backgroundTextStyle":"light",
            "navigationBarBackgroundColor": "#fff",
            "navigationBarTitleText": "Weixin",
            "navigationBarTextStyle":"black"
        },
        "style": "v2",
        "sitemapLocation": "sitemap.json"
    }
    
    
  4. pages/index/index.wxml

    可以为空

  5. pages/index/index.wxss

    可以为空

  6. pages/index/index.js

         Page({})
    
  7. pages/index/index.json

         {
         }
    

6. 解读小程序中的文件以及代码

微信小程序 基本结构和网页的基本结构对比

  1. 网页 三层结构

    1. html
    2. css
    3. js JavaScript
  2. 微信小程序 四层结构

    1. wxml 写标签的部分 类似 html
    2. wxss 写样式的部分 类似 css
    3. js JavaScript
    4. json 页面配置

7. 如何快速的创建页面

> 1. 直接编辑 `app.json` 中的 `pages` 字段即可 微信开发者工具会自动的创建页面。

> 2. **需要注意的是** 当改动了`app.json` 文件之后,必须要手动的在`微信开发者工具`中 保存 `app.json`

在app.json文件中修改pages属性,新建cart购物车页面,mine我的页面,保存之后会看到在pages下面

 {
     "pages":[
         "pages/index/index",
         "pages/cart/cart",
         "pages/mine/mine"
     ],
 }

image-20210307190723108.png

8. 微信小程序配置

8.1 全局配置 app.json

小程序根目录下的 app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径窗口表现、设置网络超时时间、设置多 tab 等

字段作用
pages设置页面的路径
window设置窗口的外观
tabBar导航结构
style全局定义小程序组件使用的样式版本
sitemapLocationsitemap文件的位置

"window":{

    "backgroundTextStyle":"light", // 下拉刷新时,显示的文字的样式 ,值只有二个,light dark

    "backgroundColor": "#333", // 下拉刷新时,看到的背景颜色

    "navigationBarBackgroundColor": "#fff", // 标题栏中的颜色

    "navigationBarTitleText": " ", // 标题文字

    "navigationBarTextStyle":"black",

    "enablePullDownRefresh": true // 全局开启下拉刷新,现在只是演示用,真实开发中,不这么做。

}

更多window属性,请点击

window属性

去掉警告信息

在 project.config.json 文件中的 setting 节点中添加配置

"checkSiteMap":false,

8.2 页面配置

每个页面文件夹中的 .json 配置文件,对当前本页面的窗口外观的配置文件,会覆盖全局的app.json的相同配置项

  1. 在全局配置中指定了窗口的颜色,默认情况下每一个页面的颜色都会受到全局配置中的影响;

  2. 希望单独在某一个页面中显示不同的标题,不同的颜色,在页面配置中单独做个设置 cart.json

  3. 页面配置中能做的设置有限,只能够设置全局配置中的 window的字段;

cart.json

    {
        "usingComponents": {},

        "navigationBarTitleText": "购物车",

        "navigationBarBackgroundColor": "#FF69B4"
    }

默认显示的还是index页面,如何查看购物车页面的效果呢?

只需要在app.json文件中,把"pages/cart/cart"挪到第一位即可

    "pages":[
    
        "pages/cart/cart",
        
        "pages/index/index",
        
        "pages/mine/mine"
    ]

image-20210307214008566.png

8.3 tabBar

需求: 实现类似于如下图的标签导航效果

image-20200923102323674.png

  1. 需要5个页面 十个图标 五个未选中 五个选中

image-20200923102357230.png 2. 需要将 图片素材引入到项目

image-20200923102424634.png

格式化代码快捷键

    alt + shift + f 格式化代码
  1. 在 app.json 文件中配置tabBar属性

    "pages":[
        "pages/index/index",
        "pages/cart/cart",
        "pages/search/search",
        "pages/mine/mine"
    ],
    "tabBar": {
        "list": [
            {
                "pagePath": "pages/index/index",
                "text": "首页",
                "iconPath": "/icon/_home.png",
                "selectedIconPath": "/icon/home.png"
            },
            {
                "pagePath": "pages/cart/cart",
                "text": "购物车",
                "iconPath": "/icon/_img.png",
                "selectedIconPath": "/icon/img.png"
            },
            {
                "pagePath": "pages/search/search",
                "text": "搜索",
                "iconPath": "/icon/_search.png",
                "selectedIconPath": "/icon/search.png"
            },
            {
                "pagePath": "pages/mine/mine",
                "text": "我的",
                "iconPath": "/icon/_my.png",
                "selectedIconPath": "/icon/my.png"
            }
        ]
    },

  1. 优化tabBar
    "tabBar": {
        "selectedColor": "#d52d80",
        "color": "#909090",
    }

演示效果如下:

image-20210307221540575.png

整理代码的快捷键: alt + shift + f

9. 模板语法

9.1 简单的体验:

view —— div,块级元素,独占一行;

text —— span,行内元素,一行多个;

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

需求:页面的某些数据需要动态变化,怎么整? —— 找到js文件;设置data;使用差值表达式{{time}} 动态展示数据;

index.js


Page({
    // data中存放的数据 即将要在页面中直接显示的数据
    data:{
        // 属性
        time:"2022年9月23日 15:16:58",
    }
})

index.wxml


    <view> {{time}} </view>

9.2 基本数据显示

1.字符串类型 —— time: "2021年11月2日 15:16:58"

2.数值类型 —— num: 10000

3.布尔类型 —— flag:truefalse4.对象类型 —— person: { name: "王一博", height: 190 } (通过点语法访问属性值)

5.数组对象 —— 一个数组里的每一项都是对象类型(使用循环语法)

9.3 数组数据的循环显示

  1. wx:for

  2. wx:key

    1. 普通数组的时候 wx:key="*this"
    
        list: [ "王一博","易洋千玺","肖战"]
    
    
    1. 对象数组的时候 wx:key=循环项中的属性名(属性名的值是唯一的)

      wx:key="id" 因为 name值 不唯一了有两个王一博


    list2: [ {
        id : 1,
        name:"王一博"
    },
    {
        id : 2,
        name:"易洋千玺"
    },
    {
        id : 3,
        name:"王一博"
    }]
  1. 默认循环项 {{ item }}

  2. 默认循环索引 {{ index }}

js


Page({

    // data中存放的数据 即将要在页面中直接显示的数据

    data: {
        // 属性 字符串类型
        time: "2022年11月2日 15:16:58",
        
        // 数值类型
        num: 10000,
        
        num2: 1,
        
        // true false 布尔类型
        isShow: true,
        
        // 对象类型
        person: {
            name: "王一博",
            height: 190
        },
        
        /* 数组显示 才是重点和难点 */
        list:[
            "王一博","易洋千玺","肖战"
        ],

        // 对象数组
        list2: [
            {
                id : 1,
                name:"王一博"
            },
            {
                id : 2,
                name:"易洋千玺"
            },
            {
                id : 3,
                name:"王一博"
            }
        ]
    }
})

wxml


<!--

web div a span img h1 ....

小程序

1 div => view 块级元素 会占一整行

2 span => text 行内元素 放多个元素在一行上

3 当我们发现 页面中的某些数据需要动态的发生变化的时候

    1 找到页面的js文件
    2 data对象
    3 在wxml中 通过两个花括号 来使用

-->



<view> {{time}} </view>

<view>数量 {{num}}</view>

<view>数量相加 {{ num + num2 }}</view>

<view>布尔类型 {{isShow}}</view>

<view>对象类型 {{person.name}} {{person.height}}</view>

<view>=============</view>

<!--

数组 循环相关 for

1 wx:for

2 循环项 list[index] item = 数组中的每一个元素

    循环的索引 index

3 必须提供一个key属性 提高循环的性能 wx:key

    1 数组 如果是list 类型 wx:key="*this"

    2 数组 变成了 对象数组形式 list2 wx:key="循环项中的某一个属性即可"

        1 一定要保证这个属性的值是唯一的

        2 key后面的变量不需要加花括号

-->


<view

wx:for="{{list}}"

wx:key="*this"

> {{item}} </view>

<view>++++++++++++++++++</view>

<view wx:for="{{list2}}" wx:key="id">{{index}} {{item.name}} --- {{item.id}}</view>

9.4条件渲染

使用 wx:if="" 来判断是否需要显示该代码块


xxx.js 文件中:

    data: {

        name:'tom',

        age:100,

        isTrue:true

    },


xxx.wxml 文件中:

<!-- 条件渲染 if elif elif else -->

<view wx:if="{{age < 18}}">

    {{name}} 是 小孩

</view>


<view wx:elif="{{ age >=18 && age < 60}}">

    {{name}} 是 大人

</view>

<view wx:else>

    {{name}} 是 老人

</view>

10. 事件

1. 点击页面某个按钮 触发一些行为

1. 点击按钮是固定不变

2. 行为是不一样的

10.1 事件的初体验

wxml


    <!--

    1 绑定事件关键字 bind + 事件名 tap

    2 bindtap="函数名称" 可以随便起名字

    3 回到js文件中 定义 事件函数 需要做什么业务

    -->

    <view bindtap="getTime">点击 打印时间</view>

js


Page({

    // 事件函数
    getTime() {
        console.log(new Date())
    }

})

10.2 事件传递参数 --- 点击+10/+100小案例

1.分别完成+10/+100

2.使用data-num 自定义属性来实现一个方法传递不同参数;

wxml

    <view>{{num}}</view>

    <!-- <button bindtap="add" >+10</button>
    
    <button bindtap="add100">+100</button> -->

<!--
h5 有规定 如果想要自己定义一些标签的数据 建议 data- 开头
事件传递参数

1 wxml中 data-num="{{10}}"

2 js中 event.currentTarget.dataset.num
-->

<!-- data-* 属性用于存储页面或应用程序的私有自定义数据。

存储的数据能够被页面的 JavaScript 中利用,以创建更好的用户体验。 -->

<button data-num="{{10}}" bindtap="add" >+10</button>

<!-- 注意:会变成字符串拼接 -->
<button data-num="100" bindtap="add">+100</button>

js


Page({

    data: {
        num: 0
    },

    // add(){

        // 获取到data中num的值
        // var num = this.data.num;

        // 对num进行加法计
        // num = num + 10;

        // 把num增加后的值重新设置回data中
        // this.setData({
            // num:num
        // })

    // },

    add(e) {

        // 事件源对象 存放点击事件触发的时候的一些信息
        // 你点击的是谁 button标签 标签上有什么数据 data-add=10

        // 获取要增加的数量的值
        console.log(e);

        var data = +e.currentTarget.dataset.num

        this.setData({
            num: this.data.num + data
        })

    }

})