微信小程序如何实现数据共享与方法共享详解

目录
  • 全局数据共享 Mobox
    • npm安装及其注意事项
      • 小程序对 npm 的支持与限制
      • npm 依赖包的安装与使用
    • Mobox
  • 组件方法共享 behaviors
    • 1. 什么是 behaviors
    • 2. behaviors 的工作方式
    • 3. 创建 behavior
    • 4. 导入并使用 behavior
    • 5. behavior 中所有可用的节点
    • 6. 同名字段的覆盖和组合规则
  • 总结

全局数据共享 Mobox

原生小程序开发中我们可以通过 mobx-miniprogram 配合 mobx-miniprogram-bindings 实现全局数据共享。二者为外部依赖,我们需要npm或yarn去安装构建相关依赖,才能正常使用.

npm安装及其注意事项

小程序对 npm 的支持与限制

在小程序中已经支持使用 npm 安装第三方包,从而来提高小程序的开发效率。

  • 但是小程序中使用npm 包有如下5个限制:

    • 只支持纯 js 包,不支持自定义组件,不支持依赖于 Node.js 内置库的包
    • 必须有入口文件,即需要保证 package.json 中的 main 字段是指向一个正确的入口,如果 package.json 中没有 main 字段,则以 npm 包根目录下的 index.js 作为入口文件。
    • 测试、构建相关的依赖请放入 devDependencies 字段中避免被一起打包到小程序包中,这一点和小程序 npm 包的要求相同。
    • 不支持依赖 c++ 插件的包
    • 小程序环境比较特殊,一些全局变量(如 window 对象)和构造器(如 Function 构造器)是无法使用的。

npm 依赖包的安装与使用

初始化小程序生成package.json

npm init -y

安装 npm 包

在小程序 package.json 所在的目录中执行命令安装 npm 包:

npm install pageName

此处要求参与构建 npm 的 package.json 需要在 project.config.js 定义的 miniprogramRoot 之内。

构建 npm

点击开发者工具中的菜单栏:工具 --> 构建 npm

勾选“使用 npm 模块”选项:

构建完成后即可使用 npm 包。

js 中引入 npm 包:

const myPackage = require('packageName')
const packageOther = require('packageName/other')

使用 npm 包中的自定义组件:

{
"usingComponents": {
    "myPackage": "packageName",
    "package-other": "packageName/other"
}
}

Mobox

1. 全局数据共享

  • 共享数据是指多个进程都可以访问的数据,而全局变量是一个进程内的多个单元可共享的数据。
  • 解决组件之间数据共享的问题。
  • 开发中常用的全局数据共享方案有:Vuex、Redux、MobX、hooks等。

2. 小程序中的全局数据共享方案

  • mobx-miniprogram: 用来创建 Store 实例对象
  • mobx-miniprogram-bindings: 用来把 Store 中的共享数据或方法,绑定到组件或页面中使用

3. 使用mobx

安装 MobX 相关的包

在项目中运行如下的命令,安装 MobX 相关的包:

npm i -S mobx-miniprogram mobx-miniprogram-bindings

注意:MobX 相关的包安装完毕之后,记得删除 miniprogram_npm 目录后,重新构建 npm。

2. 创建 MobX 的 Store 实例

```
import {observable ,action} from 'mobx-miniprogram'
export const store=observable({

        <!-- 1、数据部分 -->
        num1:1,
        num2:2,

        <!-- 2、计算属性 -->
        get sum(){
            return this.num1+this.num2
        },

        <!-- 3、actions方法,用来修改store中的数据 -->
        updateNum1:action(function(step){
            this.num1+=tep
        })
    })
```

将 Store 中的成员绑定到页面中

import { createStoreBindings } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'

Page({

    data: {

    },
    onLoad: function (options) {
        this.storeBindings = createStoreBindings(this, {
        store,
        fields: ['num1', 'num2', 'sum'],
        actions: ['updateNum1']
        })
    },

    btnHandler1(e) {

        this.updateNum1(e.target.dataset.step)
    },

    onUnload: function () {
        this.storeBindings.detroyStoreBindings()
    }
})

将 Store 中的成员绑定到组件中

  • 通过storeBindingsBehavior实现自动绑定
  • store:指定要绑定的store
  • fields:置顶绑定的数据字段
    • 绑定字段方式一:numA:()=>store.num1
    • 绑定字段方式二:numA:(store)=>store.num1
    • 绑定字段方式三:numA:'num1'
  • actions:指定要绑定的方法
import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'
Component({
    behaviors: [storeBindingsBehavior],
    storeBindings: {
        // 数据源
        store,
        fields: {
            numA: 'num1',
            numB: 'num2',
            sum: 'sum'
        },
        actions: {
        updateNum2: 'updateNum2'
        }
    },
})

组件方法共享 behaviors

1. 什么是 behaviors

behaviors 是小程序中,用于实现组件间代码共享的特性,类似于 Vue.js 中的 “mixins”。

2. behaviors 的工作方式

每个 behavior 可以包含一组属性、数据、生命周期函数和方法。组件引用它时,它的属性、数据和方法会被

合并到组件中。

每个组件可以引用多个 behavior,behavior 也可以引用其它 behavior。

3. 创建 behavior

调用 Behavior(Object object) 方法即可创建一个共享的 behavior 实例对象,供所有的组件使用:

/*
    调用Behavior()方法,创建对象实例
    使用module.exports讲behevior 实例对象共享出去
*/
module.exports = Behavior({
    // 属性节点
    properties: {},
    // 私有数据节点
    data: {},
    // 事件处理函数和自定义方法节点
    methods: {}
})

4. 导入并使用 behavior

在组件中,使用 require() 方法导入需要的 behavior,挂载后即可访问 behavior 中的数据或方法,示例代码

// components/test5/test5.js
const myBehavior = require('../../behaviors/my-behavior')

Component({
  behaviors: [myBehavior],
  /**
   * 组件的属性列表
   */
  properties: {
    count: Number
  },
})

5. behavior 中所有可用的节点

可用的节点 类型 是否必填 描述
properties Object Map 同组件的属性
data Object 同组件的数据
methods Object 同自定义组件的方法
behaviors String Array 引入其它的 behavior
created Function 生命周期函数
attached Function 生命周期函数
ready Function 生命周期函数
moved Function 生命周期函数
detached Function 生命周期函数

6. 同名字段的覆盖和组合规则

组件和它引用的 behavior 中可以包含同名的字段,此时可以参考如下 3 种同名时的处理规则:

① 同名的数据字段 (data)

② 同名的属性 (properties) 或方法 (methods)

③ 同名的生命周期函数

如果有同名的数据字段 (data):

  1. 若同名的数据字段都是对象类型,会进行对象合并;
  2. 其余情况会进行数据覆盖,覆盖规则为:组件 > 父 behavior > 子 behavior 、 靠后的 behavior > 靠前的 behavior。(优先级高的覆盖优先级低的,最大的为优先级最高)

如果有同名的属性 (properties) 或方法 (methods):

  1. 若组件本身有这个属性或方法,则组件的属性或方法会覆盖 behavior 中的同名属性或方法;
  2. 若组件本身无这个属性或方法,则在组件的 behaviors 字段中定义靠后的 behavior 的属性或方法会覆盖靠前的同名属性或方法;
  3. 在 2 的基础上,若存在嵌套引用 behavior 的情况,则规则为:父 behavior 覆盖 子 behavior 中的同名属性或方法。

生命周期函数不会相互覆盖,而是在对应触发时机被逐个调用:

  • 对于不同的生命周期函数之间,遵循组件生命周期函数的执行顺序;
  • 对于同种生命周期函数,遵循如下规则:
    • behavior 优先于组件执行;
    • 子 behavior 优先于 父 behavior 执行;
    • 靠前的 behavior 优先于 靠后的 behavior 执行;
  • 如果同一个 behavior 被一个组件多次引用,它定义的生命周期函数只会被执行一次。

总结

到此这篇关于微信小程序如何实现数据共享与方法共享的文章就介绍到这了,更多相关微信小程序数据共享与方法共享内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用watch在微信小程序中实现全局状态共享

    问题 在之前开发微信小程序的时候,获取用户信息.openid还有地理位置这些信息的时候,都是采用Promise的方式异步获取,但是这样的话在页面和App.js中都获取就可能造成请求重复的问题. 比如为了在每个页面都能获取到这些共享信息,都会选择在App.js中进行获取,然后在页面级进行获取,这两次获取的时间间隔较小时就可能导致前一个请求还未获取到数据,后一个请求就会再次进行获取,这样就产生了两次请求. 还有一个问题就是书写麻烦(虽然也能通过async await简化),比如 onLoad() {

  • 微信小程序如何实现数据共享与方法共享详解

    目录 全局数据共享 Mobox npm安装及其注意事项 小程序对 npm 的支持与限制 npm 依赖包的安装与使用 Mobox 组件方法共享 behaviors 1. 什么是 behaviors 2. behaviors 的工作方式 3. 创建 behavior 4. 导入并使用 behavior 5. behavior 中所有可用的节点 6. 同名字段的覆盖和组合规则 总结 全局数据共享 Mobox 原生小程序开发中我们可以通过 mobx-miniprogram 配合 mobx-minipro

  • 微信小程序传值以及获取值方法的详解

    微信小程序传值以及获取值方法,传值有两种方法,对应也有获取值得方法, 1.设置id的方法标识跳转后传递的参数值: 2.通过使用data - xxxx 的方法来标识要传递的值 微信小程序设置id的方法标识来传值 在要跳转的item处,设置一个id并给当前的id赋值上对应的key值,比如一部电影的id(后面带着id去下一个页面查询,详细信息)如: 后我们在js的bindtap的响应事件中获取,并传递到下一个界面中: 获取到id传的值 通过e.currentTarget.id;获取设置的id值,并通过

  • 微信小程序对图片进行canvas压缩的方法示例详解

    微信小程序其实自带一个图片压缩的API wx.compressImage,但是这玩意目前感受就是个垃圾.IOS大多数情况下据说还可以,安卓有的时候降低质量压缩后体积反而变大,而且没办法控制其压缩至具体指定的大小,压缩后多大看天意.所以需要使用画布去自己实现一个图片压缩方法. 简单来讲原理就是:找个不显示在页面上的画布画上去,再取出,如果体积还是太大,缩小尺寸后再画,再取,递归下去,直到体积满足要求.(所以限制的越小,图片越大,压缩越久,递归次数越多) 第一步:新建一个zipPic.js文件(名字

  • Thinkphp5微信小程序获取用户信息接口的实例详解

    Thinkphp5微信小程序获取用户信息接口的实例详解 首先在官网下载示例代码, 选php的, 这里有个坑 官方的php文件,编码是UTF-8+的, 所以要把文件改为UTF-8 然后在Thinkphp5 extend文件夹下建立Wxxcx命名空间,把官方的几个类文件放进去(这里要注意文件夹名, 命名空间名, 类名的, 大小写,一定要一样,官方的文件名和类名大小写不一样) 然后是自己的thinkphp接口代码: <?php /** * Created by PhpStorm. * User: le

  • 微信小程序之网络请求简单封装实例详解

    微信小程序之网络请求简单封装实例详解 在微信小程序中实现网络请求相对于Android来说感觉简单很多,我们只需要使用其提供的API就可以解决网络请求问题. 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downloadFile) WebSocket通信(wx.connectSocket) 为了数据安全,微信小程序网络请求只支持https,当然各个参数的含义就不在细说,不熟悉的话可以:可以去阅读官方文档的网络请求api,当我们使用request

  • 微信小程序 页面跳转及数据传递详解

    微信小程序 页面跳转及数据传递详解 类似 Android 的 Intent 传值,微信小程序也一样可以传值: 例如:wxml 中写了一个函数跳转: <view class="itemWeight" catchtap="jumpToOverMissionList"> <view class="textStatus">已完成任务</view> <view class="containVertical

  • 微信小程序canvas开发水果老虎机的思路详解

    在这个超长假期中,无聊...,所以动手做一个早就计划要做的小玩意, 水果老虎机 ,嗯,这是一个小程序而不是小游戏... 使用结构还是canvas? 使用模板结构(view)生成水果盘的好处一是用户可自定义产出 n x n 的定制化老虎机,二是容易通过算法样式生成布局,三是通过 wx.selectQueryAll 的方法能够很方便的抓到定位数据.但,问题是动画性能过于孱弱,如图构建一个 7x7 的水果盘,动画性能估计会惨不忍睹,而且纯粹模板结构无论使用 animation 动画方法还是 css 的

  • 微信小程序换肤功能实现代码(思路详解)

    在手机.电脑使用频率如此高的当下,应用可以更换皮肤,以提升美观性,并减轻屏幕对眼睛的刺激,无疑对用户体验有很大的帮助 实现功能 要实现如上更换皮肤的效果,有几个思路: 1.准备皮肤相关的wxss,引入到app.wxss中,方便每个页面使用: 2.设置皮肤时,动态改变wxml中元素的类名或id,使页面应用对应的皮肤: 3.将选中皮肤的值保存在小程序本地缓存中,保证其他页面及下一次打开小程序时,页面展示正确的皮肤: 下面介绍一些实现的细节 wxml <view class="page"

  • 微信小程序 获取手机号 JavaScript解密示例代码详解

    当我们在开发微信小程序中,有一个常用的功能,就是获取用户的手机号,然后一键登入小程序,那么手机号如何获取呢?请认真看完本文,保证可以获取到用户的手机号. 刚开始开发微信小程序的时候,想着实现手机验证码登入,后来查阅资料得知,发给用户的短信是要自己付费的.后来想想,微信获取用户的手机号一样可以保证手机号码的真实性,因为手机号既然可以绑定微信,那么肯定是被严格核验过的,然后就开始了获取手机号之旅,网上教程有很多,但不知什么原因,都是会少一些内容,有的只有前端代码,没有后端:有的后端代码是PHP,不是

  • 微信小程序登录与注册功能的实现详解

    目录 小程序中的登录 用户注册 用户信息修改 总结 小程序中的登录 在小程序中有一个概念叫openid,这个相当于登录小程序用户的唯一标识,每个微信用户都不同.那要如何拿到用户的唯一标识呢?在微搭低代码中是通过调用系统的api来获取的 let userinfo = await app.utils.getWXContext() 我们通过这行代码的调用来获取到用户的唯一标识,获取到之后我们其他页面也需要使用,那就需要把他存起来.全局变量的作用域是所有页面都可见,所以我们需要在变量中定义一个全局变量叫

随机推荐