全局数据共享 Mobox

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

npm安装及其注意事项

小程序对 npm 的支持与限制

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

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

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

npm 依赖包的安装与使用

  1. 初始化小程序生成package.json

    npm init -y
  2. 安装 npm 包

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

    npm install pageName

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

  3. 构建 npm

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

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

  5. 构建完成后即可使用 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

  1. 安装 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
})
})
```
  1. 将 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()
    }
    })
  2. 将 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 中的同名属性或方法。

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

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

微信小程序--数据共享与方法共享的更多相关文章

  1. 微信小程序数据请求方法wx.request小测试

    微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </vi ...

  2. 微信小程序开发系列教程三:微信小程序的调试方法

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 这个教程的前两篇文章,介绍了如何用下图所示的微信开发者工具自动生成一个Hel ...

  3. 微信小程序最新授权方法,getUserInfo

    20180511微信小程序正式关闭原先getUserInfo的逻辑 不再允许自动弹出授权框. 方法一: index.wxml(准备一个用于给用户授权的页面,我这里直接用了一个全屏按钮) <vie ...

  4. 微信小程序——wxParse使用方法

    wxParse是一个微信小程序富文本解析组件.现在小程序里面自带了一个<rich-text>组件也能解析富文本,但是表现不尽人意.所以我还是采用的wxParse来解析富文本的. wxPar ...

  5. 微信小程序节点查询方法:wx.createSelectorQuery()的使用场景与注意事项

    小程序由于内置于微信,这使得它有了得天独厚的宣传和使用优势,本着学习的心态,我在官网上看了一遍开发文档,大致得出小程序框架的设计模式与使用注意事项(重点来了,其实开发文档某些方面叙述的并不仔细,甚至存 ...

  6. 微信小程序特殊字符转义方法——&转义&amp;等等

    在我编写公司小程序的过程中,有一次在网页端添加了一张图片,结果在小程序端访问失败了,究其原因,竟然是因为该图片名称中有一个“&”符号,网页端添加后,自动转义成了“&”存储到了数据库.当 ...

  7. 微信小程序~生命周期方法详解

    生命周期是指一个小程序从创建到销毁的一系列过程 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面 先来看一张小程序项目结构 从上图可以看出,根目录下面有包含了app.js ...

  8. 微信小程序 weui 使用方法

      https://github.com/Tencent/weui-wxss/ 下载地址用于小程序的https://github.com/Tencent/weui   下载地址用于H5    运用示例 ...

  9. 微信小程序,全局变量方法的使用

    方法一:app.js 内设置全局变量(如屏宽,屏高的设置) 1.app.js文件,定义全局变量 /定义全局变量 globalData:{ userInfo:null, sysInfo:null, wi ...

随机推荐

  1. 01_ubantu国内软件源配置

    查找自己版本对应的软件源 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 以下为19.10版本清华大学的,个人100M的带宽,平均安装速度在600K ...

  2. JSP页面的基本结构

    一:一个JSP页面由以下基本元素组成. (1)HTML标签 (2)CSS (3)变量和方法 (4)Java代码段 (5)JSP动作和指令 (6)其他脚本元素(如Javascript) 二:JSP的基本 ...

  3. 【力扣】649. Dota2 参议院

    Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成.现在参议院希望对一个 Dota2 游戏里的改变作出决定.他们以一个基于轮为过程的投 ...

  4. 【JavaWeb】【MySQL】【edu01】jdbc.properties配置文件的编写

    前提准备 导入 mysql-connector-java-版本号 的jar包 下面为大家提供几个jar包下载地址 点击进入下载界面 >>推荐 MySQL官方 多版本选择 点击进入下载界面 ...

  5. Redis哨兵 部署和配置

    目录 一.哨兵简介 哨兵介绍 哨兵原理 二.哨兵部署 环境介绍 哨兵配置 三.使用验证 一.哨兵简介 哨兵介绍 Sentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在 ...

  6. python解释器安装指导教程

    python解释器安装指导教程 1.官网下载 进入官网https://www.python.org/,在download下选择符合操作系统的版本 在找到合适的版本后选择相应的安装文件下载 2.进行安装 ...

  7. [ZJCTF 2019]EasyHeap

    目录 逆向分析 create 函数 edit 函数 delete 函数 利用思路 exp 脚本 get flag 内容来源 逆向分析 -------------------------------- ...

  8. sublime打开中文文件乱码以及打开文件出现.dump

    一.中文乱码 原因:中文文件由gbk编码,刚安装的sublime不支持转码 解决方法:调用ctrl+shift+p,输入:install package,回车,在稍后弹出的安装包框中搜索:Conver ...

  9. jquery Ajax 不执行回调函数success的原因

    jquery Ajax 不执行回调函数success的原因: $.ajax({ type: "post", contentType: "application/json& ...

  10. npm 包发布,自己本机发布,前端内部发布,全网发布

    第一步,安装 sinopia npm install -g sinopia 开启终端一: 第二步,启动 sinopia -l 127.0.0.1:4873 开启终端二: cd 到某个指定仓库 mkdi ...