01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

小程序

 

1,小程序简介

不需要下载安装即可使用的应用,实现了“触手可及”的梦想,用户扫一扫或者搜一下即可下载

也体现了“用完即走”的理念,用户不关心是否安装太多应用的问题

微信布局
不仅是聊天平台,更多是服务的平台:订机票,打车,订餐,但是一般还是会使用官方app,因为服务号不能满足用户的需求,所以有了应用号,但是后来改名叫小程序;因为在苹果上线的时候,里边有应用两个字,不符合规范

非技术层面体验近乎于原生app,代替了服务号,在服务平台的一个布局

技术层面:传统开发模型,就要移动操作系统之上,直接开发应用程序;微信也是基于安卓或者IOS上的一个app, 微信本身的业务会变得很小,取而代之的是小程序代替了很大的部分,

混合式应用开发:通过web开发一些web应用程序,通过cordova/phoneGap等方式运行在安卓或者IOS平台

微信开发了应用程序 通过微信提供的平台,运行在iOS或者安卓上

 

小程序能做什么?

搭建开发环境 https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

VScode 内核,和他很像

 

2. 小程序的项目结构:

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

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 可有可无

 

页面文件组成

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

 

3. 小程序下的配置

配置内容:app.json 指定项目信息,窗口颜色样式,tab栏的组成,

页面配置:page.json 会覆盖app.json中windows的内容,只是windows

标签栏的配置:app.json 下 tabBar 每个标签栏点击后的页面 ;tabBar 是一个对象,最重要的属性list:[是一个数组,指定tab栏中有多少个tab标签], 必须是两个或两个以上,五个以内的的成员才能体现出来

Sitemap 配置-了解: 小程序内搜索,建立索引,

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

 

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

    2delete 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="keywx: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="outerHandlestyle='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({ })

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

 

SetData()

改变数据

 

 

 

 

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

 

6),页面登陆案例

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

实现功能

(1)数据绑定,通过逻辑层 到 界面层:界面语法用 {{ }}语法,绑定数据,在界面发生变化时,触发 bindinput=’change’ 方法;

(2)改过的值,传给逻辑层,通过 this.setData() 把原本数据改掉,再给界面

如何做?

  1. 设计数据结构:data属性,它是一个对象,他的成员由输入框决定;用户名和密码等
  2. 将数据绑定到 指定元素上:value= ‘{{ username}}’

(3)等待用户输入,登陆点击事件(具体的登陆逻辑)bingtap=””/catchtap=’’’没有冒泡的

完成具体逻辑:

  • 先需要知道用户输入了什么?

给文本框绑定事件,bindinput=’’ usernameHandle’’;

定义这个 usernameHandle’函数,通过e.detail.value拿到用户输入的值

  • 根据用户输入的值判断
  • 根据判断的结果作出相应:输入对了 跳转,错了给一个提示等

(4)抽取共同事件处理函数

如果给每一个文本框绑定一个处理函数,代码会非常多

找共同点:函数体内部,只是属性名字不一样;你告诉我要改哪个?使用参数,但是在小程序中不可以自己传参数,要借助,setData()

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

JS属性名要用变量代替,必须是字符串,字符串必须用在索引器中,定一个对象,通过对象传递进去 var changed = { } changed[], 如果知道属性名可以用点的方式,但是用变量值做属性名,要用【】索引器的方式

可变的usename:是可变的,要借助外界传进来,怎么传进来?要想在事件中传自己自定义的参数,只能借助dataset属性:e.target.dataset[‘prop’]

改变界面的绑定:

加上data属性:

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

(5)其实,真正做的时候,不需要这样

在小程序有一个 form表单组件,不需要给文本框做什么事件绑定,给外界套上一个form标签,把按钮改成 submit按钮,点击之后,会触发提交事件,提交时候,会拿到所有input元素,要给input加上name属性

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

 

7)条件渲染

根据表达式决定我们某一个元素,或者某一些元素是否显示在界面上,WX:if =“{{ 为真,显示 }}”

切换面板展示,点击展开内容

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

Block 把元素包裹起来,写一些属性,同时控制多个元素;只是控制属性的载体,页面渲染当中没有实际意义;

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

If 和 hidden 的区别:

Hidden: 只能作用于具体的元素上;为真时隐藏,display:none;

Wx:if : 为真时 存在;这个在页面的结构中根本就不存在;当条件不存在的时候,是不会渲染它的

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

 

8)wxss vs css

Wxss: 样式,扩展:尺寸单位 rpx (responsive pixel)

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

 

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

<-- 控件

  buttontype=“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

    // 1wx.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

    })

  },

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

5.4 布局类组件(视图容器)

伸缩布局 flex

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

 

5.5 基础布局案例 – tab标签栏 选项卡

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,  

  • 页面之间跳转

使用绝对路径;

Json文件,为空,会不符合json数据格式

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

  • 页面之间值传递

?号行式:输入内容,点击按钮,跳转到下一个页面,肯定需要我们刚才填的这个内容?

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,

如何拿到这个值呢?

     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:

01【微信小程序】简介,项目结构,内容页面标签栏配置,逻辑与界面分离,数据绑定,列表渲染,事件冒泡,事件传参,单向数据流,条件渲染,