项目介绍

Taro_Mall是一款多端开源在线商城应用程序,后台是基于litemall基础上进行开发,前端采用Taro框架编写,现已全部完成小程序和h5移动端,后续会对APP,淘宝,头条,百度小程序进行适配。Taro_Mall已经完成了 litemall 前端的所有功能

扫码体验

由于小程序没有认证,只发布了一个预览版,只能加15个人,如有需要,请点击小程序申请

小程序 h5移动端

项目架构

项目用Taro做跨端开发框架,Taro基本采用React的写法,项目集成了 redux dva 控制单向数据流,用immer来提供不可变数据,提升整体的性能,减少渲染。

初始化项目

taro init Taro_Mall

进入项目目录开始开发,可以选择小程序预览模式,或者 h5 预览模式,若使用微信小程序预览模式,则需要自行下载并打开微信开发者工具,选择预览项目根目录。

微信小程序编译和发布

yarn dev:weapp  // 编译预览
yarn build:weapp // 构建发布

h5编译和发布

yarn dev:h5  // 编译预览
yarn build:h5 // 构建发布

其它端可以查看package.json 提供的命令

到这里,我们已经把项目初始化完毕,接下来我们引入 dva-core 和 immer,引入dva-core包就可以,不需要引入dva包,dva 包是对 dva-core 和路由,请求库等做了一层封装

yarn add dva-core dva-imme --save

在src 目录下新建 dva.js 文件,文件内容如下, 在创建App的时候,我们把dva-immer插件引入其中。

import {create} from 'dva-core';
import {createLogger} from 'redux-logger';
// import createLoading from 'dva-loading';
import immer from 'dva-immer'; let app;
let store = {};
let dispatch; function createApp(opt) {
// opt.onAction = [createLogger()]; // 这里可以引入 redux-logger
app = create(opt);
// app.use(createLoading({}));
app.use(immer()); // 引入 immer if (!global.registered) opt.models.forEach(model => app.model(model));
global.registered = true;
app.start(); store = app._store;
app.getStore = () => store; dispatch = store.dispatch; app.dispatch = dispatch;
if (window) {
window.g_app = app;
}
return app;
} export default {
createApp,
getDispatch() {
return app.dispatch;
},
dispatch: store.dispatch
}

接下来在入口文件当中引入我们的 dva 文件

import dva from './dva';
import models from './models'; const dvaApp = dva.createApp({
initialState: {},
models: models,
onError(e, dispatch) {
console.log('系统出错了!');
// dispatch(action("sys/error", e));
},
});
const store = dvaApp.getStore();

我们发现dva创建的时候需要引入models,我们在src目录创建models 来存放我们的 model 文件,来管理状态, 我们看下models 文件下的入口文件

import home from './home';
...... export default [
home,demo, goods, catalog, search // 导入我们的模块
]

我们可以写一个简单的model,例如: demo.js

import delay from '../utils/delay';

export default {
namespace: 'demo',
state: {
list: [],
counter: {
num: 0,
}
},
reducers: {
add: (state, {payload}) => {
state.counter.num ++;
}, dec: (state, {payload}) => {
state.counter.num --;
} },
effects: {
*asyncAdd(_, {all, call, put}) {
yield call(delay, 2000);//增加延迟测试效果 yield put({type: 'add'});
},
}
};

接下来,我们要在taro redux的中的Provider传入 store

<Provider store={store}>
<Index />
</Provider>

接下来对请求库做下简单的封装,这里主要封装了对错误消息和统一处理,和提供了get,post方法,如需其它方法,可自行封装

import Taro from '@tarojs/taro';
import {showErrorToast} from '../utils/util'; /**
* 封封微信的的request
*/
function request(url, data = {}, method = "GET") {
return new Promise(function(resolve, reject) {
Taro.request({
url: url,
data: data,
method: method,
header: {
'Content-Type': 'application/json',
'X-Litemall-Token': Taro.getStorageSync('token')
},
success: function(res) { if (res.statusCode == 200) { if (res.data.errno == 501) {
// 清除登录相关内容
try {
Taro.removeStorageSync('userInfo');
Taro.removeStorageSync('token');
} catch (e) {
// Do something when catch error
}
// 切换到登录页面
Taro.navigateTo({
url: '/pages/auth/login/login'
});
} else if(res.data.errno == 0) {
resolve(res.data.data);
} else {
// Taro.showModal({
// title: '错误信息',
// content: res.data.errmsg,
// showCancel: false
// });
showErrorToast(res.data.errmsg);
reject(res.data.errmsg);
}
} else {
reject(res.errMsg);
} },
fail: function(err) {
reject(err)
}
})
});
} request.get = (url, data) => {
return request(url, data, 'GET');
} request.post = (url, data) => {
return request(url, data, 'POST');
} export default request;

现在我们基本就可以用我们熟悉的套路去做开发了

结束语

Taro 遵循 React 语法规范的 多端开发 解决方案。当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要。

github : Taro_Mall 如果对大家有帮助,请 star 一下

01 Taro_Mall 开源多端小程序框架设计的更多相关文章

  1. 零基础入门 实战mpvue2.0多端小程序框架

    第1章 课程快速预览(必看!!!)在这一章节中,老师讲带领你快速预览课程整体.其中,涉及到为什么要做这么一门实战课程.制作一个小程序的完整流程是怎么样的,以及如何做项目的技术选型. 第2章 30 分钟 ...

  2. 【Web技术】281- 滴滴开源小程序框架 Mpx2.0

    滴滴Mpx框架负责人@hiyuki,滴滴出行网约车webapp乘客团队的负责人,也是滴滴开源的小程序框架Mpx的负责人和核心作者 Mpx是一款致力于提高小程序开发体验和效率的增强型小程序框架,目前在滴 ...

  3. [转] 扩展微信小程序框架功能

    通过第三方 JavaScript 库,扩展微信小程序框架功能. 扩展微信小程序框架功能(1)——Promise ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.1122 ...

  4. 美团小程序框架mpvue蹲坑指南

    美团小程序框架mpvue(花名:没朋友)蹲坑指南 第一次接触小程序大概是17年初,当时小程序刚刚内侧,当时就被各种限制折腾的死去活来的,单向绑定, 没有promise,请求数限制,包大小限制,各种反人 ...

  5. iBrand 开源电商小程序 (Laravel API+ webpack + gulp + 原生小程序)

    iBrand 社交电商产品正式进入开源过程中了,我们制定了详细的开源计划,目前已经发布了 V1 的版本,后续的版本也在陆续整理完善中. 各个版本功能明细如下图: 3 个版本计划在今年春节前全部完成,可 ...

  6. 微信小程序框架探究和解析

    何为框架 你对微信小程序的技术框架了解多少? 对wepy 框架进行一系列的深入了解 微信小程序框架解析和探究 小程序组件化框架WePY 在性能调优上做出的探究 开发者培训班上海专场PPT分享:小程序框 ...

  7. 美团小程序框架mpvue入门

    mpvue 主要特性 使用 mpvue 开发小程序,你将在小程序技术体系的基础上获取到这样一些能力: 1. 彻底的组件化开发能力:提高代码复用性 2. 完整的 Vue.js 开发体验 3. 方便的 V ...

  8. Westore 1.0 正式发布 - 小程序框架一个就够

    世界上最小却强大的小程序框架 - 100多行代码搞定全局状态管理和跨页通讯 Github: https://github.com/dntzhang/westore 众所周知,小程序通过页面或组件各自的 ...

  9. 【WePY小程序框架实战四】-使用async&await异步请求数据

    [WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 [WePY小程序框架实战三]-组件传值 async await 是对promise的近一步优化,既解决了promise链 ...

随机推荐

  1. Centos内核更新

    内核更新操作后面补上.暂时记录删除多余内核操作 删除卸载多余内核 1.系统启动时,选择需要保留的内核进入系统,通过uname -a命令查看当前内核版本,以防误删 2. 使用rpm -qa | grep ...

  2. tp3中子查询 逻辑条件是or

    直接用写sql最快 $map['_string'] = 'status=1 AND score>10'; //子查询条件字段不同 $condition['platform'] = 'swap'; ...

  3. ubantu中的mysql命令

    查看mysql的安装目录:which mysql 进入mysql的运行状态:mysql -uroot -p 56..a_

  4. Ananconda常用指令

    Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项,可用于解决开发过程中遇到python版本需要切换的问题. conda有一点好处是,如 ...

  5. mysql简介/安装以及破解密码等

    1.什么是数据库: 数据库即存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的 过去人们将数据存放在文件柜里,现在数据量庞大,已经不再适用 数据库是长期存放在计算机内.有 ...

  6. 统计学方法(t-检验)

    数据出来要做几件事:首先判断数据是否符合正态分布,如果符合的话,就要进行t-检验,那么进行t-检验的作用在哪呢? t-检验主要用于样本含量较小(例如n<30),总体标准差σ未知的正态分布 htt ...

  7. javaee验证码如何使用

    首先需要导入jar包 ValidateCode.jar 110   25  为验证码框的大小  4为验证码数目 9为干扰线条数 Servlet代码如下 运行截图如下

  8. JQueryUI Chosen插件

    github地址:https://harvesthq.github.io/chosen/#change-update-events Using Chosen is easy as can be. Do ...

  9. 数据库三大范式和反范式 · oldmee

    后一个范式都是在满足前一个范式的基础上建立的. 1NF 无重复的列.表中的每一列都是不可分割的基本数据项.不满足1NF的数据库不是关系数据库.如联系人表(姓名,电话),一个联系人有家庭电话和公司电话, ...

  10. <JZOJ5912>VanUSee

    挺魔的 反正我考场上想不到233333333333333 #include<cstdio> #include<cstring> #include<iostream> ...