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