微信小程序是一种快速构建应用的平台,其基础语法主要包括以下几个方面:
在微信小程序中,可以通过在 WXML 中使用标签和属性,设置页面的结构和样式;在 JS 中编写逻辑和事件处理函数,实现页面的交互和动态效果;在 JSON 中配置小程序的全局信息和页面的配置信息,如页面路径、标题栏颜色等。同时,微信小程序也提供了一些内置组件和 API,可以方便地实现各种功能和效果,如音频、视频、地图、扫码等。
小程序由配置代码JSON文件、模板代码 WXML 文件、样式代码 WXSS文件以及逻辑代码 JavaScript文件组成。
小程序代码主要由四个部分组成:
以上三个部分分别对应小程序的结构层、样式层和行为层,它们共同组成了小程序的整体代码。此外,小程序还可以使用JSON文件来配置一些全局信息,如窗口标题、页面路径等。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有易于理解、读写和解析等特点,广泛应用于Web应用、移动应用等领域。在小程序中,JSON被用于配置小程序的各种属性和信息。
小程序的 JSON 配置包括两部分:
JSON 配置的作用主要有以下几个方面:
通过配置小程序的 JSON 文件,开发者可以控制小程序的外观和行为,从而提升小程序的用户体验。
让我们来看一个小程序的 JSON 配置示例:
{ "pages": [ "pages/index/index", "pages/about/about" ], "window": { "navigationBarTitleText": "小程序示例", "navigationBarBackgroundColor": "#ffffff", "navigationBarTextStyle": "black" }, "tabBar": { "color": "#999999", "selectedColor": "#000000", "backgroundColor": "#ffffff", "list": [ { "pagePath": "pages/index/index", "text": "首页", "iconPath": "images/home.png", "selectedIconPath": "images/home-active.png" }, { "pagePath": "pages/about/about", "text": "关于", "iconPath": "images/about.png", "selectedIconPath": "images/about-active.png" } ] }}
在这个示例中,我们定义了小程序的三个部分的配置信息:
以上三个部分的配置信息都是以JSON格式呈现的,小程序可以通过读取这些配置文件,来确定小程序的结构、样式和行为等方面的信息。
WXML(WeiXin Markup Language)是一种类似HTML的标记语言,是小程序开发中的一部分。它用于描述小程序的结构和组件,可以像HTML一样编写静态页面。
WXML模板的优点在于:
通过WXML模板,开发者可以轻松创建小程序的页面结构和布局,并实现小程序的各种功能和交互效果。
以上是 WXML 模板中常用的标签,当然还有其他的标签和属性,可以根据具体需求进行选择使用。
在 WXML 模板中,<view> 和 <block> 都是容器标签,用于包裹其他组件或元素,但是它们在渲染和表现上有一些区别:
综上所述,<view> 和 <block> 都是容器标签,具有类似的功能,但是它们在渲染、样式和使用场景上可能有一些区别,开发者可以根据具体需求进行选择和使用。
下面是一个简单的 WXML 模板示例:
<!-- index.wxml --><view class="container"> <view class="title">Hello World!</view> <image src="../../images/avatar.png" class="avatar"></image> <view class="description">This is a demo for WXML template.</view> <button class="button" bindtap="onTap">Click Me</button></view>
在这个示例中,<view> 标签表示一个视图容器,可以嵌套其他标签。<image> 标签表示一个图片标签,用于显示图片。<button> 标签表示一个按钮,用于触发事件。
WXML 模板中,可以使用 wx:if 条件渲染标签,实现根据条件显示不同内容的效果。下面是一个 WXML 模板条件示例:
<!-- index.wxml --><view class="container"> <view wx:if="{{isShow}}" class="title">Hello World!</view> <view wx:if="{{!isShow}}" class="title">Goodbye World!</view> <button class="button" bindtap="onToggle">Toggle</button></view>
在这个示例中,我们定义了一个 isShow 数据项,用于控制显示不同的标题。在 WXML 中,我们使用 wx:if 条件渲染标签,根据 isShow 的值来判断显示哪个标题。
在 JavaScript 文件中,我们定义了一个 onToggle 函数,用于切换 isShow 的值。当用户点击按钮时,isShow 的值会发生变化,从而实现标题的切换效果。
// index.jsPage({ data: { isShow: true }, onToggle: function() { this.setData({ isShow: !this.data.isShow }) }})
在 JavaScript 文件中,我们使用 setData 函数来更新 isShow 的值,从而触发模板的重新渲染。
通过使用 wx:if 条件渲染标签,我们可以方便地实现根据条件显示不同内容的效果,从而增强小程序的交互性和可用性。
WXML 模板中,除了使用 wx:if 条件渲染标签,还可以使用 wx:else 标签来实现条件判断的 else 分支。下面是一个 WXML 模板条件 if/else 示例:
<!-- index.wxml --><view class="container"> <view class="title">Welcome to My Page!</view> <view wx:if="{{isVIP}}" class="subtitle">VIP User</view> <view wx:else class="subtitle">Normal User</view></view><!--elif--><view wx:if="{{view == 'WEBVIEW'}}"> WEBVIEW </view><view wx:elif="{{view == 'APP'}}"> APP </view><view wx:else="{{view == 'MINA'}}"> MINA </view>
在这个示例中,我们定义了一个 isVIP 数据项,用于控制显示不同的用户类型。在 WXML 中,我们使用 wx:if 和 wx:else 标签,根据 isVIP 的值来判断显示不同的用户类型。
在 JavaScript 文件中,我们定义了一个 onLoad 函数,用于初始化 isVIP 数据项。
// index.jsPage({ data: { isVIP: true }, onLoad: function () { }})
在 JavaScript 文件中,我们可以使用各种方式来初始化数据项,例如从服务器获取数据、从本地缓存获取数据、从用户输入获取数据等等。
通过使用 wx:if 和 wx:else 标签,我们可以方便地实现条件判断的 else 分支,从而增强小程序的可用性和交互性。
WXML 模板中,可以使用 wx:for 列表渲染标签,实现根据数据循环渲染列表的效果。下面是一个 WXML 模板循环示例:
<!-- index.wxml --><view class="container"> <view class="title">List:</view> <view wx:for="{{list}}" wx:key="id" class="item">{{item.name}}</view></view>
在这个示例中,我们定义了一个 list 数据项,它是一个数组,包含了一些对象。在 WXML 中,我们使用 wx:for 列表渲染标签,遍历 list 数组中的每个对象,然后根据对象的属性渲染列表项。
在 JavaScript 文件中,我们定义了一个 onLoad 函数,用于初始化 list 数据项。
// index.jsPage({ data: { list: [ { id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }, { id: 3, name: 'Item 3' } ] }, onLoad: function () { }})
在 JavaScript 文件中,我们可以使用各种方式来初始化数据项,例如从服务器获取数据、从本地缓存获取数据、从用户输入获取数据等等。
通过使用 wx:for 列表渲染标签,我们可以方便地实现根据数据循环渲染列表的效果,从而增强小程序的可用性和交互性。
WXSS(WeiXin Style Sheets)是小程序的样式语言,用于控制小程序界面的外观和布局。它是一种 CSS 扩展语言,具有类似 CSS 的语法,但也有一些自己的特点和限制。
WXSS 支持大部分 CSS 语法和特性,如选择器、盒模型、浮动、定位、字体、背景、颜色、动画等等。目前支持的选择器有:
选择器 | 样例 | 样例描述 |
.class | .intro | 选择所有拥有 class="intro" 的组件 |
#id | #firstname | 选择拥有 id="firstname" 的组件 |
element | view | 选择所有view 组件 |
element, element | view, checkbox | 选择所有文档的 view 组件和所有的 checkbox 组件 |
::after | view::after | 在 view 组件后边插入内容 |
::before | view::before | 在 view 组件前边插入内容 |
全局样式与局部样式:
如果您想要在多个页面或组件中使用相同的样式,可以使用小程序提供的全局样式(global style)或公共样式(common style)功能。具体来说,您可以在 app.wxss 中定义全局样式或在一个独立的wxss文件中定义公共样式,然后在页面或组件的样式标签中引用它们。
定义全局样式的方法是在 app.wxss 中定义样式类,这些类可以在整个小程序中使用。例如:
/* app.wxss */.global-text { font-size: 16px; color: #333;}
然后,您可以在任何页面或组件中使用这个样式类:
/* 页面或组件的样式标签 */<view class="global-text">这是全局样式中定义的文本样式</view>
定义公共样式的方法是在一个独立的wxss文件中定义样式类,然后在页面或组件的样式标签中引用它们。例如:
/* common.wxss */.common-button { background-color: #00c2ff; color: #fff; padding: 10px 20px;}/* 页面或组件的样式标签 */<view class="common-button">这是公共样式中定义的按钮样式</view>
请注意,如果使用公共样式,您需要在页面或组件中引入该文件。例如,在页面的config对象中设置 usingComponents 字段:
/* 页面的js文件 */Page({ config: { usingComponents: { 'common-style': '/path/to/common.wxss' } }})
然后在页面或组件的样式标签中使用 @import 语句引入该文件:
/* 页面或组件的样式标签 */@import 'common-style';<view class="common-button">这是公共样式中定义的按钮样式</view>
除了支持 CSS 语法和特性之外,WXSS 还有一些自己的特点和扩展,例如:
通过使用 WXSS,我们可以方便地控制小程序界面的外观和布局,从而实现各种视觉效果和交互效果。
以下是一个基本的WXSS样式示例:
/* 定义样式 */.page { background-color: #fff; color: #333; font-size: 14px; padding: 10px;}.title { font-weight: bold; font-size: 18px; margin-bottom: 10px;}.subtitle { font-weight: bold; font-size: 16px; margin-bottom: 8px;}.text { line-height: 1.5; margin-bottom: 10px;}.link { color: #00c2ff; text-decoration: none;}.link:hover { text-decoration: underline;}/* 使用样式 */<view class="page"> <view class="title">这是标题</view> <view class="subtitle">这是副标题</view> <view class="text">这是文本内容</view> <a class="link" href="https://www.example.com">这是链接</a></view>
在这个示例中,定义了一些基本样式,如背景色、字体大小、边距和颜色等,并分别给不同的元素应用了不同的样式类。在使用样式时,只需要在对应的元素上添加对应的类名即可。
微信小程序中的JS主要用于实现页面的逻辑交互和数据处理等功能。以下是一些常见的JS交互方式:
总之,微信小程序中的JS主要用于实现页面的逻辑交互和数据处理,可以通过数据绑定、事件绑定、API调用、生命周期函数、自定义组件等方式来实现不同的功能。需要注意的是,为了提高小程序的性能和体验,应尽量减少不必要的操作和网络请求,同时避免频繁更新页面数据。
下面是一个简单的微信小程序JS逻辑交互的示例:
1、WXML文件
<view>{{message}}</view><button bindtap="changeMessage">点击我修改消息</button>
2、JS文件
Page({ data: { message: 'Hello World' }, changeMessage: function () { this.setData({ message: '你好,世界!' }) }})
这个示例中,我们在WXML中定义了一个 view 元素和一个 button 元素。view 元素用于显示一个消息,button 元素用于触发一个事件。在JS文件中,我们定义了一个名为 changeMessage 的事件处理函数,当用户点击按钮时,会触发这个事件处理函数。changeMessage 函数使用 setData 方法来更新 message 数据,将其改为“你好,世界!”。由于 message 数据已经被绑定到view元素中,所以当数据更新后,页面上的消息也会相应地更新。
在这个示例中,我们演示了数据绑定、事件绑定和API调用的基本用法。其中,setData方法用于更新页面数据,可以在changeMessage事件处理函数中实现数据更新;bindtap用于绑定点击事件,可以在button元素上使用该属性来绑定事件处理函数。
微信小程序生命周期函数的执行顺序如下:
以页面为例,可以在.js文件中定义相应的生命周期函数:
Page({ // 页面的初始数据 data: { message: 'Hello World!' }, // 生命周期函数--监听页面加载 onLoad: function (options) { console.log('页面加载完成') }, // 生命周期函数--监听页面初次渲染完成 onReady: function () { console.log('页面初次渲染完成') }, // 生命周期函数--监听页面显示 onShow: function () { console.log('页面显示') }, // 生命周期函数--监听页面隐藏 onHide: function () { console.log('页面隐藏') }, // 生命周期函数--监听页面卸载 onUnload: function () { console.log('页面卸载') }, // 页面相关事件处理函数--监听用户下拉动作 onPullDownRefresh: function () { console.log('用户下拉刷新') }, // 页面上拉触底事件的处理函数 onReachBottom: function () { console.log('页面上拉触底') }, // 用户点击右上角分享 onShareAppMessage: function () { console.log('用户点击分享') return { title: '小程序分享', path: '/pages/index/index' } }})
在组件中也可以使用相应的生命周期函数进行配置。需要注意的是,在小程序中,组件的生命周期函数会受到父组件的影响,具体的执行顺序会受到组件的嵌套关系的影响。
在微信小程序中,事件函数是指在小程序中发生事件时所执行的函数,例如用户点击按钮、滑动页面、输入内容等。事件函数可以通过wxss样式表中的bind或catch属性和wxml模板中的event对象来绑定和触发。
微信小程序中常见的事件函数有:
bindtap和catchtap都是用来绑定点击事件的属性,它们之间的区别在于事件冒泡的处理方式不同。
具体来说:
- bindtap是捕获型事件,触发事件后先执行当前元素的事件函数,再向上冒泡执行父元素的事件函数。如果父元素也绑定了bindtap事件,那么该事件也会被触发执行。- catchtap是冒泡型事件,触发事件后先执行父元素的事件函数,再向下捕获执行当前元素的事件函数。如果当前元素绑定了catchtap事件,那么该事件会阻止冒泡,不会继续向上执行父元素的事件函数。
除了以上常见的事件函数外,微信小程序还提供了很多其他的事件函数,具体可以参考微信小程序开发文档。
在编写事件函数时,需要注意以下几点:
需要注意的是,事件函数的触发顺序与绑定的先后顺序有关,即先绑定的事件函数先执行。同时,在一个元素上绑定多个事件函数时,需要使用 bind 和 catch 来区分冒泡事件和非冒泡事件。
微信小程序支持双向绑定的方式是通过使用 <input>、<textarea> 等表单元素的 value 属性实现的。当用户在表单元素中输入内容时,value 属性会自动更新绑定的数据,反之,当数据更新时,表单元素的值也会随之更新。
以下是一个示例,演示了如何在微信小程序中实现双向绑定:
<!-- 在 wxml 文件中 --><view class="container"> <input type="text" value="{{inputValue}}" bindinput="onInput" /> <text>输入的内容是:{{inputValue}}</text></view>
js 文件
// 在 js 文件中Page({ data: { inputValue: '' }, onInput: function(e) { this.setData({ inputValue: e.detail.value }) }})
在这个示例中,<input> 元素的 value 属性与 inputValue 数据进行了双向绑定。当用户在输入框中输入内容时,onInput 方法会被调用,并通过 setData 更新 inputValue 数据的值。这个过程中,value 属性会自动更新,以反映 inputValue 数据的当前值。同时,在页面中也会展示出用户输入的内容。
微信小程序的目录结构如下:
├── app.js // 小程序逻辑├── app.json // 小程序公共配置├── app.wxss // 小程序公共样式├── pages // 页面目录│ ├── index // index页面目录│ │ ├── index.js // index页面逻辑│ │ ├── index.wxml // index页面结构│ │ └── index.wxss // index页面样式│ └── ...├── components // 组件目录│ ├── my-component // my-component组件目录│ │ ├── my-component.js // my-component组件逻辑│ │ ├── my-component.wxml // my-component组件结构│ │ └── my-component.wxss // my-component组件样式│ └── ...├── images // 图片目录├── utils // 工具目录├── package.json // 项目配置文件└── README.md // 项目说明文件
其中说明:
基础库 1.6.3 开始支持,低版本需做兼容处理。
微信小程序中,Page 构造器和 Component 构造器都是用来创建页面或组件的工具,但是它们的使用方式和作用有所不同。
Component 代码示例:
Component({ data: { text: "This is page data." }, methods: { onLoad: function(options) { // 页面创建时执行 }, onPullDownRefresh: function() { // 下拉刷新时执行 }, // 事件响应函数 viewTap: function() { // ... } }})
下面我将通过一个简单的示例来看一下。
假设我们要创建一个包含一个输入框和一个按钮的组件,当点击按钮时,将输入框中的内容显示在页面上。
首先,我们可以使用 Component 构造器来创建这个组件,代码如下:
// index.wxml<custom-input bindinput="onInput"></custom-input>// custom-input.wxml<view class="input-container"> <input bindinput="onInput" placeholder="请输入内容"></input> <button bindtap="onTap">显示内容</button></view>// custom-input.jsComponent({ methods: { onInput(event) { this.setData({ value: event.detail.value }) }, onTap() { this.triggerEvent('show', { value: this.data.value }) } }})
在这个示例中,我们使用 Component 构造器创建了一个名为 custom-input 的组件。该组件包含一个输入框和一个按钮,当输入框内容发生变化时,将会触发 onInput 方法,将输入框的值保存在组件数据中。当按钮被点击时,将会触发 onTap 方法,通过 triggerEvent 方法触发自定义事件 show,并将输入框的值作为参数传递给该事件。
接下来,我们可以在一个页面中使用这个组件,代码如下:
// index.wxml<custom-input bind:show="onShow"></custom-input>// index.jsPage({ data: { inputValue: '' }, methods: { onShow(event) { this.setData({ inputValue: event.detail.value }) } }})
在这个示例中,我们使用 Page 构造器创建了一个名为 index 的页面。该页面引用了 custom-input 组件,并监听了它的 show 事件。当该事件触发时,将输入框的值保存在页面数据中。
可以看到,Page 构造器用于创建页面,可以在页面中引用和使用自定义组件。而 Component 构造器用于创建组件,可以在多个页面中复用。这是两者的主要区别。
总的来说,Page 构造器和 Component 构造器都是用来创建小程序中的不同类型的对象,它们的作用和使用方式略有不同。Page 构造器用来创建页面,而Component 构造器用来创建组件。
微信小程序有两种生命周期,一种是应用生命周期,另一种是页面生命周期。
应用生命周期指的是整个小程序从打开到关闭的过程中的生命周期,包括小程序的启动、进入前台/后台、退出等事件。小程序的应用生命周期包括以下事件:
页面生命周期指的是小程序中每个页面的生命周期,包括页面的创建、显示、隐藏和销毁等事件。每个页面都有自己的生命周期函数,可以在这些函数中执行相应的操作。下图说明了页面 Page 实例的生命周期。
以下是小程序页面生命周期函数的执行顺序:
除了上述五个生命周期函数外,还有一些其他的生命周期函数,例如:
需要注意的是,不同的页面可能具有不同的生命周期,具体的生命周期函数触发顺序和触发次数也会因页面类型的不同而不同。
微信小程序的页面路由是指在小程序中切换页面的过程。小程序中有两种方式可以进行页面路由:
小程序中可以使用 <navigator> 标签实现声明式导航,类似于 HTML 中的超链接。通过设置 url 属性,可以指定要跳转的页面路径,例如:
<navigator url="/pages/index/index">跳转到首页</navigator>
也可以通过 open-type 属性指定跳转类型,例如:
<navigator url="/pages/index/index" open-type="navigateTo">跳转到首页</navigator>
注意事项
小程序中也可以使用编程式导航进行页面路由,通过调用 wx.navigateTo()、wx.redirectTo()、wx.switchTab()、wx.reLaunch()等 API 实现。例如:
wx.navigateTo({ url: '/pages/index/index'})
【注意】在小程序中使用编程式导航时,需要在 app.json 文件中声明要跳转的页面路径。
{ "pages": [ "pages/index/index", "pages/about/about", "pages/contact/contact" ]}
小程序中还可以通过 getCurrentPages() API 获取当前所有页面栈,通过 getCurrentRoute() API 获取当前页面路径,以及通过 onRouteChange 生命周期函数监听页面路由变化事件。
const pages = getCurrentPages()const currentRoute = getCurrentRoute()wx.onRouteChange(function(route) { console.log('当前路由变化为:', route)})
微信小程序有许多事件可以触发,以下是一些常见的事件:
以上只是微信小程序事件的一部分,开发者还可以自定义事件,实现更多复杂的交互逻辑。
下面我用一个简单的微信小程序示例来讲解事件处理。
假设我们现在要实现一个功能,在页面上显示一个按钮,点击按钮后弹出一个提示框,提示框上显示一段文本内容。
1、在 WXML 文件中添加一个按钮元素:
<view> <button bindtap="showModal">点击我</button></view>
这里我们使用了 <button> 元素来创建一个按钮,它有一个 bindtap 属性,用来绑定 tap事件,并调用 showModal 函数来处理事件。
2、在 JS 文件中添加 showModal 函数:
Page({ showModal: function() { wx.showModal({ title: '提示', content: 'Hello, world!' }) }})
这里我们使用了 wx.showModal 函数来创建一个提示框,它有两个参数:title 和 content,分别用来设置提示框的标题和内容。在 showModal 函数中,我们直接调用了 wx.showModal 函数,并传入了相应的参数。
3、在微信开发者工具中预览页面,点击按钮,即可看到弹出的提示框,上面显示着 Hello, world! 这段文本内容。
以上就是一个简单的微信小程序事件处理示例,通过绑定 tap 事件,并调用相应的函数来处理事件,实现了按钮点击后弹出提示框的功能。开发者可以根据自己的需求来编写相应的事件处理函数,实现更复杂的交互效果。
篇幅有点长,就先到这里了,剩余的内容会放到下篇文章继续讲解,有任何疑问欢迎给我留言哦,也可关注我的公众号【大数据与云原生技术分享】加群交流或私信沟通~