Taro+dva环境搭建

2020-02-24  本文已影响0人  limbo_lyn

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

上一篇下一篇

猜你喜欢

热点阅读