微信小程序

787 阅读8分钟

app.json

app.json配置文件app.json 是当前小程序的全局配置,包括了小程序的所有页面路径、窗口外观、界面表现、底部tab 等。Demo 项目里边的 app.json 配置内容如下:

pages :用来记录当前小程序所有页面的路径 window :全局定义小程序所有页面的背景色、文字颜色等 style :全局定义小程序组件所使用的样式版本

sitemapLocation :用来指明 sitemap.json 的位置 usingComponents : 全局自定义组件

project.config.json 配置文件

project.config.json 是项目配置文件,用来记录我们对小程序开发工具所做的个性化配置 setting保存了编译相关的配置 projectname保存的是项目名称 appid保存的是小程序的账号 ID 同学们这里需要将 project.config.json 和 app.json 配置文件的作用区分开来, project.config.json 更多的是对微信开发者工具的配置, 而 app.json 是对项目代码功能层面上的配置.

sitemap.json 配置文件-是否被索引

微信现已开放小程序内搜索,效果类似于 PC 网页的 SEO 。 sitemap.json 文件用来配置小程序 页面是否允许微信索引。

当开发者允许微信索引时,微信会通过爬虫的形式,为小程序的页面内容建立索引。当用户的搜索 关键字和页面的索引匹配成功的时候,小程序的页面将可能展示在搜索结果中。

默认开启-可关闭

注意: sitemap 的索引提示是默认开启的,如需要关闭 sitemap 的索引提示,可在小程序项目配置文 件 project.config.json 的 setting 中配置字段 checkSiteMap 为 false

页面的 .json 配置文件

小程序中的每一个页面,可以使用 .json 文件来对本页面的窗口外观进行配置,页面中的配置项会覆 盖 app.json 的 window 中相同的配置项, 当然, 这指的是当前页面被展示出来的时候

常用组件

view text image

常用事件

在页面的 .js 文件中定义对应的事件处理函数,事件参数通过形参 event (一般简写成 e ) 来接 收,

注意,事件处理函数需要和 data 平级

<button bindtap="事件名">点我试试</button>

在js 中访问 data 中的数据

在 js 代码中, 如果想要访问 data中 的数据, 是通过 this.data.xxx 的方式进行访

js 中修改 data 中的数据

通过调用 this.setData(dataObject) 方法,可以给页面 data 中的数据重新赋值,示例如下:

onAddHandle: function () { 
    this.setData({ 
    count: this.data.count + 1 // 在原来值基础上+1 
    })
}

事件传参

小程序中的事件传参比较特殊,不能在绑定事件的同时为事件处理函数传递参数。

传参

<button bindtap="onBtnString" data-info="2">事件传参-拼接字符串</button>
最终:
info 会作为名字存储在事件对象的 target 中的 dataset 中, 2 会被解析为值
在事件处理函数中,通过 event.target.dataset.info 即可获取到值,示例代码如下:
// 事件传参-拼接字符串 
onBtnString (e) {
    this.setData({ // this.data.count就是旧值 
    count: this.data.count + e.target.dataset.info 
    }) 
}

bindinput 的使用-双向绑定

<input value="{{ msg }}" bindinput="inputHandle" class="ipt2" type="checkbox"></input>

// 实现input的数据和data数据同步 
inputHandle(e) { 
        this.setData({ 
        msg: e.detail.value 
        })
     }

条件渲染 v-if

wx:if wx:else-if wx:else 条件渲染

<!-- wx:if wx:else-if wx:else 条件渲染 --> 
<view wx:if="{{ type === 1 }}" class="text"></view>
<view wx:elif="{{ type === 2 }}" class="text"></view>
<view wx:else>保密</view>

wx:if 与 hidden 的对比

① 运行方式不同

wx:if 以动态创建和移除元素的方式,控制元素的展示与隐藏 hidden 以切换样式的方式( display: none/block; ),控制元素的显示与隐藏

② 使用建议

频繁切换时,建议使用 hidden 控制条件复杂时,建议使用 wx:if 搭配 wx:elif 、 wx:else 进行展示与隐藏的切换

样式导入

定义在 app.wxss 中的样式为全局样式,作用于每一个页面。

@import "/icon/icon.wxss";

tabBar

tabBar tabBar 是移动端应用常见的页面效果,用于实现多页面的快速切换。小程序中通常将其分为:

底部 tabBar

顶部 tabBar

注意:

tabBar 中只能配置最少 2 个、最多 5 个 tab 页签 当渲染顶部 tabBar 时,不显示 icon ,只显示文本

 "tabBar": {
    "selectedColor": "#C00000",
    "list": [{
        "pagePath": "pages/home/home",
        "text": "首页",
        "iconPath": "static/tab_icons/home.png",
        "selectedIconPath": "static/tab_icons/home-active.png"
      }
    ]
  },

网络数据请求

onTapGet () {
        wx.request({ 
            // 请求地址,必须是以https://开头 // 必须是配置在request合法域名 
            url: 'https://www.escook.cn/api/get', 
            // 请求方式 
            method: 'GET', 
            // 请求参数 
            data: { name: 'zs', age: 22 },
            // 请求成功的回调 
            success: (res) => { 
                console.log(res) 
                }     
           })

导航

声名式导航(标签方式)

open-type 是导航的方式

跳转
        <!-- 声明式导航 --> <!--导航到 tabBar页面的方法: 
        url必须以“/”根路径开头 
        并且必须配置open-type属性值为switchTab --> 

        <navigator url="/pages/message/message" open-type="switchTab">导航到消息页面</navigator>
后退

如果要后退到上一页面或多级页面,则需要指定 open-type 属性和 delta 属性,

其中: open-type 的值必须是 navigateBack ,表示要进行后退导航

delta 的值必须是数字,表示要后退的层级

<navigator open-type="navigateBack" delta="1">后退</navigator>

编程式导航(js方式)

跳转至tabBar页面
        <!--编程式导航 跳转至tabBar页面 --> 
    <button bindtap="gotoMessage">跳转到messae页面</button> 
    /*通过编程式导航 跳转至tabBar页面 message页面 */
    gotoMessage () { 
        wx.switchTab({ 
        // 代表要跳转的路径 
        url: '/pages/message/message', 
        }) 
    },
跳转至非 tabBar页面
        <!-- 编程式导航 跳转至非 tabBar页面 --> 
        <button bindtap="gotoInfo">跳转到Info页面</button> 
                /*通过编程式导航 跳转至非tabBar页面 Info页面 */
            gotoInfo () {
                wx.navigateTo({
                url: '/pages/info/info',
        }) 
       },
后退导航

调用 wx.navigateBack(Object object) 方法,可以返回上一页面或多级页面。

后退事件

            tabBar 页面是不能实现后退的效果的
        goBack () { 
                //如果不传递参数就是返回上一页 
                // 如果要传递参数则是传递 delta数字型, 代表返回的层级。 
                wx.navigateBack() 
            },

注意 tabBar 页面是不能实现后退的效果的. 因为, 当我们跳转到 tabBar 页面,会关闭其他所有非 tabBar 页面,所以当处于 tabBar 页面时, 无页面可退

wxs

语法参考 es5 js语法 为了降低 wxs ( WeiXin Script )的学习成本, wxs 语言在设计时借大量鉴了 JavaScript 的语 法。但是本质上, wxs 和 JavaScript 是完全不同的两种语言!

外联的方法

// 1.定义方法 
        function toLower(str) { 
            return str.toLowerCase() 
            }
            // 2.暴露成员 
        module.exports = { 
            toLower: toLower 
            }
<!-- 1.使用外联式引入外部的wxs文件 --> 
        <wxs module="m2" src="../../utils/tools.wxs"></wxs>
       使用 <view>{{ m2.toLower(country) }}</view>     

组件

① 在项目的根目录中,鼠标右键,创建 components -> test 文件夹

② 在新建的 components -> test 文件夹上,鼠标右键,点击“新建 Component ”

③ 键入组件的名称之后回车,会自动生成组件对应的 4 个文件,后缀名分别为 .js , .json , .wxml 和 .wxss

注意:为了保证目录结构的清晰,建议把不同的组件,存放到单独目录中.

局部引用

在页面的 .json 配置文件中引用组件的方式,叫做“局部引用”。示例代码如下:

{ 
        "usingComponents": { 
        "my-test1": "/components/test/test" 
    } 
}

全局引用

在 app.json 全局配置文件中引用组件的方式,叫做“全局引用”。

示例代码如下:

"usingComponents": { 
    "my-test2": "/components/test2/test2" 
    }

注意事项

默认情况下,自定义组件的样式只对当前组件生效,不会影响到组件之外的 UI 结构 组件样式的隔离性的好处有:

① 防止外界的样式影响组件内部的样式

② 防止组件的样式破坏外界的样式 app.wxss 中的全局样式对组件无效

只有 class 选择器会有样式隔离效果, id 选择器、属性选择器、标签选择器不受样式隔离的影响

有时,我们希望在外界能够控制组件内部的样式,此时,可以通过 styleIsolation 修改组件的样 式隔离选项,用法如下

// 在组件的.js 文件中新增加如下配置 
        Component({ 
            options: { 
            // 默认值isolated: 代表启动样式隔离 
            //apply-shared: 代表页面wxss样式将影响自定义组件 
            //shared: 代表双向的影响 s
            tyleIsolation: 'isolated'
            }
       })
            
            // 或在组件的.json 文件中新增加如下配置 
            { 
                "styleIsolation": "isolated" 
              }

properties 属性

properties: { 


      // 完整定义 属性的方式【当需要指定属性默认值时,建议使用此方式】 
        max: {// 属性值的数据类型 
            type: Number, // 属性值的默认值 
            value: 10 },
            
            
      // 简化定义 属性的方式 
            max: Number 
            }

数据监听器

数据监听器用于监听和响应任何属性和数据字段的变化,从而执行特定的操作。

它的作用类似于 vue 中的 watch 侦听器。

在小程序组件中,数据监听器的基本语法格式如下:

Components({ // observers: 观察者 
        observers: { 
            '字段A, 字段B': function(字段A的新值, 字段B的新值) { 
            // do something 
            } 
})
通配符方式, 监听对象中所有属性的变化
observers: { 
        '_rgb.**': function (obj) { 
            this.setData({ 
                fullColor:`${obj.r}, ${obj.g}, ${obj.b}`
            }) 
    }
}

纯数据字段

纯数据字段指的是那些不用于界面渲染的 data 字段。 在 Component 构造器的 options 节点中,指定 pureDataPattern 为一个 正则表达式 ,字段名符合这个正则

Component({ 
    options: { // 指定所有_开头的数据字段为 纯数据字段 
        pureDataPattern: /^_/ },

    data: { 
        a: true, // 普通数据字段 
        _b: true // 纯数据字段 } })

父子兄弟传值

父传子

<my-text name='{{name}}'>

  properties: {
    name: String,
  },

子传父

 methods: {
    age() {
      this.triggerEvent('sync', {
        value: this.data.age
      })
    }
  }

<my-text bind:sync="addAge">

addAge(e) {
    this.setData({
      age: e.detail.value
    })
  },


兄弟传值

可在父组件里调用 this.selectComponent("id或class选择器") ,获取子组件的实例对象,从而直接访问子组件的任意数据和方法。调用时需要传入一个选择器,例如 this.selectComponent(".my-component") 。

父组件的wxml文件

使用 bind:自定义事件名称(推荐: 结构清晰
<my-test class="cusstomA" id="cA" count="{{count}}
"bind:sync="syncCount"></my-test>
<button bindtap="getChild">获取子组件实例</button>
//父组件的js文件 按钮的tap事件处理函数
getChild() {
// 切记下面的参数不能传递标签选择器,不然返回的是null
// 也可以传递ID选择器
const child = this.selectComponent('.customA')
// 调用子组件的setData方法,修改count的值,
child.setData({ count: this.data.count + 1 })
child.addCount() // 直接调用子组件的addCount方法,该方法在child实例对象的__proto__上可以访问到该方法

}

// 这里的代码其实有点问题, 因为count的数据是属于父组件的, 并且由父组件通过自定义属性传递

给了子组件, 如果想修改这个count的值, 直接在父组件中修改即可, 子组件自动就能更新

.

完全没有

必要再这种场景下去修改子组件中count的值