Taro+dva环境搭建

1、Taro环境搭建

参考https://nervjs.github.io/taro/docs/GETTING-STARTED.html

其中使用的工具应该保持一致,推荐使用npm,如果一致出奇怪的错误,可以尝试将

本地的/usr/local/lib/node_modules/和项目目录下的node_modules里面文件全部删除再执行

2、Dva环境搭建

Dva是redux的进阶版本,主要负责将页面和model分离,保证model的一致性

1)、安装redux:

cnpm install --save redux @tarojs/redux @tarojs/redux-h5 redux-thunk redux-logger

2)、安装dva

cnpm install --save dva-core dva-loading

3、在项目中配置Dva

1)、在src/utils/ 新建dva文件

import { create } from "dva-core";

import { createLogger } from "redux-logger";

import createLoading from "dva-loading";

let app

let store

let dispatch

let registered

function createApp(opt) {

    // redux 的日志

    opt.onAction = [createLogger()]

    app = create(opt)

    app.use(createLoading({}))

    if (!registered) {

        opt.models.forEach(model => app.model(model));

    }

    registered = true;

    app.start()

    store = app._store;

    app.getStore = () => store;

    app.use({

        onError(err) {

            console.log(err);

        }

    })

    dispatch = store.dispatch;

    app.dispatch = dispatch;

    return app;

}

export default {

    createApp,

    getDispatch() {

        return app.dispatch

    }

}

2)、在src/model下新建model控制文件

如:index.tsx,将具体业务的model引入

import videoList from '../pages/video/model';

export default [videoList];

3)、在app.tsx中

引入

import dva from './utils/dva';

获取配置

const dvaApp = dva.createApp({

  initialState: {},

  models: models,

});

const store = dvaApp.getStore();

注册全局

render() {

    return (

      <Provider store={store}>

        <Index />

      </Provider>

    )

  }


至此dva配置完成。

4、项目中使用dva

1)、新建页面的model 并实现相关的同步、异步方法,如:

import Taro from '@tarojs/taro';

import * as login from './service';

export default {

  namespace: 'login',

  state: {

    mobile: '',

    code: '',

    invitation_code: '',

    invitation_code_from: '',

    access_token: '',

    nickname: '',

    new_user: '',

    is_has_buy_card: '', // 用户是否买过卡

    smsText: '发送验证码',

    sending: 0,

    smsTime: 30,

    erroMessage: '',

    type: 4, // 1微信 2QQ 3新浪 4.微信公众号 5.支付宝生活号 6.京东 7.返利

  },

  effects: {

    *login(_, { call, put, select }) {

      const { code, mobile } = yield select(state => state.login);

      const res = yield call(login.login, { code, mobile });

      if (res.status == 'ok') {

        const userInfo = {

          access_token: res.data.access_token,

          invitation_code: res.data.invitation_code,

          mobile: res.data.mobile,

          nickname: res.data.nickname,

          new_user: res.data.new_user,

          is_has_buy_card: res.data.is_has_buy_card,

          erroMessage: '',

        };

        Taro.setStorageSync('user_info', userInfo);

        Taro.setStorageSync('access_token', res.data.access_token);

        yield put({

          type: 'common/save',

          payload: {

            access_token: res.data.access_token,

            invitation_code: res.data.invitation_code,

            mobile: res.data.mobile,

            nickname: res.data.nickname,

            new_user: res.data.new_user,

            is_has_buy_card: res.data.is_has_buy_card,

            erroMessage: '',

            code: '',

          },

        });

        yield put({

          type: 'save',

          payload: {

            access_token: res.data.access_token,

            invitation_code: res.data.invitation_code,

            mobile: res.data.mobile,

            nickname: res.data.nickname,

            new_user: res.data.new_user,

            is_has_buy_card: res.data.is_has_buy_card,

            erroMessage: '',

            code: '',

          },

        });

        Taro.showToast({

          title: '登录成功,欢迎回来~~~',

          icon: 'none',

        });

        setTimeout(() => {

          Taro.navigateBack();

        }, 1000);

      }

    },

    *sendSms(_, { call, put, select }) {

      const { mobile } = yield select(state => state.login);

      const res = yield call(login.getSms, { mobile });

      if (res.status == 'ok') {

        yield put({ type: 'save', payload: { sending: 1, erroMessage: '' } });

      } else {

        yield put({

          type: 'save',

          payload: { sending: 2, erroMessage: res.error && res.error.message },

        });

      }

    },

    *sendSmsVoice(_, { call, put, select }) {

      const { mobile } = yield select(state => state.login);

      const res = yield call(login.getSmsVoice, { mobile });

      if (res.status == 'ok') {

        yield put({ type: 'save', payload: { sending: 1, erroMessage: '' } });

      } else {

        yield put({

          type: 'save',

          payload: { sending: 2, erroMessage: res.error && res.error.message },

        });

      }

    },

  },

  reducers: {

    save(state, { payload: data }) {

      return { ...state, ...data };

    },

  },

};

其中effects中的方法是异步的,reducers的方法同步的

yield select、yield call、 yield put是关键字,分别代表

(1)、 表示从某个namesapce中拿出指定字段,如从namesapce为login中拿出 code和 mobile

(2)、 yield call 表示异步调用某个接口

(3)、 yield put 表示发出同步的action,reducers的方法会自动响应

2)、将model通过src/model下的index文件export

3)、在界面文件中绑定model和view

单个绑定

@connect(({ login }) => ({

  ...login,

}))

多个绑定

@connect(({ user, common }) => ({

  ...user,

  ...common,

}))

4)、在page中调用相关的方法

this.props.dispatch({

      type: 'login/login',

      payload: {

        code: this.props.code,

        mobile: this.props.mobile,

      },

    });


5、编译运行

目前微信小程序还只支持在微信开发平台上预览,如果使用vscode进行开发的话,执行完

npm run dev:tt

然后会在当前项目目录下生成一个dist文件夹,然后将整个项目导入到微信开发平台的工具就可以预览了,在vscode中编辑保存后,如果代码没有出错,小程序那边也会自动更新

目前出现过的错误

Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js 13.x

解决方案:

npm rebuild node-sass

5、其他

1)、vscode 关于向程序的插件

https://juejin.im/post/5dce6c5de51d453af62c30ef

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • 蚂蚁金服开源的企业级React框架,并不是UI框架 特性开箱即用,内置react、react-router ......
    hellomyshadow阅读 22,904评论 8 10
  • dva.js 简介 dva 是阿里前端架构师 sorrycc 带 team 研发的一套轻量级前端框架,其目的是尽量...
    那颗星_fcaf阅读 3,673评论 0 24
  • 笔者升级了 dva 的版本,同时新增了 umi 的使用,具体可以参考这篇文章 dva理论到实践——帮你扫清dva的...
    darrell阅读 39,872评论 8 86
  • Dva是什么? 其官方github上有详细说明,这里不再赘述,贴一下其github地址:Dva中文简介 使用方式 ...
    Zack1994阅读 1,473评论 0 0
  • Dva是什么 dva 是基于现有应用架构 (redux + react-router + redux-saga 等...
    黎贝卡beka阅读 46,361评论 2 52