美文网首页
Taro+dva环境搭建

Taro+dva环境搭建

作者: limbo_lyn | 来源:发表于2020-02-24 10:43 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Taro+dva环境搭建

          本文链接:https://www.haomeiwen.com/subject/hvhmqhtx.html