让微信小程序页面之间的通信不在变得困难

一个开始

小程序开发者总会碰到各种页面之间的通信问题,实现方式也五花八门,比如...

场景还原

首先这是一个电商小程序。

有这样一个需求:

  1. 首页某个地方要展示购物车商品数量。
  2. 当我在其他页面加购了商品,首页数量刷新。

实现方式

  1. 方式一:onShow直接请求接口
Page({
    onShow() {
        // ...一些逻辑

        // 后端请求新的购物车数量
        this.requestCartNum();
    }
})

不足: 每次onShow都要请求接口,浪费资源。

  1. 方式二:globalData存储购物车数量,onShow中做刷新

  

// 主页.js
Page({
    onShow() {
        // 在globalData获取到购物车数据
        let num = globalData.cartNum;
        if (num !== this.data.cartNum) {
            this.setData({
                cartNum: num,
            });
        }
    }
});

// 加购页.js
Page({
    // 加购后改变globalData的值
    cartAdd(num) {
        globalData.cartNum = globalData.cartNum + num;
    }
})
  1. 方式三:加购后获取首页实例,调用首页方法
// 首页.js
Page({
    onCartAdd(num) {
        this.setData({
            cartNum: this.data.cartNum + num,
        });
    },
});

// 加购页.js
Page({
    onCartAdd(num) {
        // 加购后获取到首页的实例,调用首页onCartAdd方法
        let pages = getCurrentPages();
        let curPage = pages[0];
        curPage.onCartAdd(num);
    }
})

不足:不确定能不能准确拿到首页的实例,如果换做其他页面就很难复用

  1. 方法四:事件订阅与发布
// 首页.js
Page({
    onLoad() {
        // 首页监听事件
        this.$bus.on(‘cart_add‘, (num) => {
            this.setData({
                cartNum: this.data.cartNum + num,
            })
        })
    }
})

// 加购页.js

Page({
    // 加购成功后触发cart_add事件
    onCartAdd(num) {
        this.$bus.emit(‘cart_add‘, num);
    }
})

此方法用事件系统,订阅发布模式去做的处理。

以上几种方法中最优解决方案是方法四,利用事件的订阅与发布,逻辑清晰兼容性好。但是都不可避免的不足是:每一个需要动态显示购物数量的页面都需要添加相同的逻辑代码。

状态管理方案

单页应用中最常用的就是组件之间的通信,由此诞生了不同的状态存储方案: react用redux, vue用vuex。他们的思路都是类似的。都有一个核心 store 存储着一切要管理的状态。

那么,其他框架可以,小程序也可以。以redux为例,实现一套简单的状态管理方案。

wxdux的实现

使用前提:有redux基础

wxdux 类似与redux,以action来描述触发的行为,reducer来描述state的变化。

1. 小程序入口中注册

注册store并添加到globalData中去

import {createStore} from ‘./wxdux/index‘;
import reducer from ‘./reducer‘;

const store = createStore(reducer);

App({
    globalData: {
        store,
    },
});

2. reducer实现

写法与redux类似,功能也类似。

const userReducer = (state = {}, action) => {
    // ...
}

const postReducer = (state = [], action) => {
    // ...
};

const reducers = {
    user: userReducer,
    posts: postReducer,
};

export default reducers;

3. 页面中使用wxdux

connect方法会将小程序页面实例与wxdux连接起来,必须提供$useState方法,该方法接收state,返回该页面所需要的state

import {connect} from ‘./wxdux/index‘;

Page(connect({
    data: {
        sex: ‘男‘,
    },
    onLoad() {
        // ...
    },
    $useState(state) {
        return {
            name: state.name,
        },
    },
}))

4. wxml中使用name

<view>{{name}}</view>

5. 触发store更新

使用dispatch方法,该方法接收一个对象作为参数,该对象必须包含type字段表示action的类型,wxdux会根据此action更新state并且刷新所有使用name的视图

import {dispatch} from ‘./wxdux/index‘;

Page(connect({
    // 某点击事件触发,更新姓名为“张三”
    onClick() {
        const updateName = {
            type: ‘update_name‘,
            name: ‘张三‘
        };
        dispatch(updateName);
    }
}))

最后

github链接

原文地址:https://www.cnblogs.com/xujiazheng/p/10966194.html

时间: 2024-10-07 09:04:01

让微信小程序页面之间的通信不在变得困难的相关文章

微信小程序页面之间的跳转

wx.navigateTo(OBJECT) 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. OBJECT 参数说明: 参数 类型 必填 说明 url String 是 需要跳转的应用内非 tabBar 的页面的路径 , 路径后可以带参数.参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔:如 'path?key=value&key2=value2' success Function 否 接口调用成功的回调函数 fail Funct

微信小程序页面跳转

wx.navigateTo(OBJECT) 不销毁当前页面,仅将其隐藏,使用wx.navigateBack可以返回到原页面. wx.redirectTo(OBJECT) 销毁当前页面,跳转到应用内的其他页面. 微信小程序页面不跳转: 我们有时候会发现,其他的地方都好好的能跳转,可是为啥突然就无效那呢? 原因: 检查你要跳转的位置是否在app.js中注册过. 检查你要跳转的地址是否有误.经常都是因为少写或者多写使得跳转无效. 检查你要跳转的位置是否位于TabBar中,如果是的话,要使用wx.swi

微信小程序页面

[转]微信小程序页面-页面跳转失败WAService.js:3 navigateTo:fail url not in app.json 微信小程序新建页面的要素一是新建的文件名称和其子文件的名称最好一致,不然容易出问题,在小程序页面跳转中如果出现WAService.js:3 navigateTo:fail url not in app.json错误 要在app.json(公共文件中)建立页面跳转page.如下图 不管是跳转到哪个页面,必须在json里的pages数组里面填写路径,不然跳转失败 跳

微信小程序页面跳转方法总结

微信小程序页面跳转目前有以下方法(不全面的欢迎补充): 1. 利用小程序提供的 API 跳转: // 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. // 注意:调用 navigateTo 跳转时,调用该方法的页面会被加入堆栈,但是 redirectTo wx.navigateTo({ url: 'page/home/home?user_id=111' }) // 关闭当前页面,返回上一页面或多级页面.可通过 getCurrentPages() 获取当

微信小程序页面传值详解

我们知道,在微信小程序中,从一个页面转到另一个页面,一般情况下可以通过navigate或redirect时候的url来携带参数,然后在目标页面的onLoad函数参数中获取这些url参数.例如: // 源页面A相关代码   wx.navigateTo({   url: "/pages/mypage/mypage?a=1&b=2"   })     // 目标页面B相关代码   Page({   onLoad: function (options) {   var a = opti

微信小程序页面跳转、逻辑层模块化

一.页面的跳转 微信小程序的页面跳转函数方法有两个,另外还有两种模块跳转方式. 函数跳转: 1.wx.navigateTo(OBJECT): wx.navigateTo({ url: 'test?id=1' })//保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. //问号后面的参数为传递至指定页面onload方法内的参数.id为自定义参数名,在跳转页面获取参数值时,也是通过这个设置的参数来获取的. 2.wx.redirectTo(OBJECT): wx

微信小程序页面事件-下拉刷新,上拉加载更多

1.下拉刷新的概念及应用场景. 概念: 下拉刷新是移动端更新列表数据的交互行为,用户通过手指在屏幕上子上而下的滑动,可以触发页面的下拉刷新,更新列表数据. 应用场景: 在移动端,数据列表是常见的页面效果,更新列表数据是最基本的页面需求,相比于按钮刷新,定时刷新来说,下拉刷新的用户体验方便友好,已经成为移动端刷新列表数据的最佳解决方案. 微信小程序启动下拉刷新: 两种方式: 1.需要在app.json 的window选项中或页面配置中开启enablePullDownRefresh, 但是,一般情况

(uniapp和)微信小程序页面跳转首页报错:navigateTo:fail can not navigateTo a tabbar page

如果在这种情况下无法实现跳转并出现can not navigate to tabBar page错误, 很有可能是由于在底部tabbar里面定义乐同样连接地址的bar,如果在底部footer页面定义了相同地址的bar,则此页面无法跳转, 解决方法: 使用uniapp或微信小程序的 uni.switchTab({         url: '路径'}); wx.switchTab({         url: '路径'}); 原文地址:https://www.cnblogs.com/fanqiuz

微信小程序页面路由

一.标签跳转 页面路由: 实现路由跳转的方式通过标签或者API 标签跳转<navigator></navigator>:组件-->导航-->navigator navigator标签中的属性:(不支持跳转tabbar页面需要设置跳转方式) url:当前小程序内的跳转链接 open-type:跳转方式(有很多合法值)switchTab只支持跳转tabbar页面 <navigator url='/pages/index/index' open-type='switch