Taro 3.4.7 + Dva.js + taro-ui 搭建微信小程序

前期准备

  1. 微信开发者工具
  2. 安装Node

安装 Taro

使用 npm 或者 yarn 全局安装 @tarojs/cli

# 使用 npm 安装 CLI
$ npm install -g @tarojs/cli

# OR 使用 yarn 安装 CLI
$ yarn global add @tarojs/cli

# OR 安装了 cnpm,使用 cnpm 安装 CLI
$ cnpm install -g @tarojs/cli

题主这里使用 npm install -g @tarojs/cli进行taro的安装
在这里插入图片描述

查看 Taro 全部版本信息
可以使用 npm info 查看 Taro 版本信息,在这里我们可以看到当前最新版本

npm info @tarojs/cli

在这里插入图片描述

项目初始化

使用命令创建模板项目:

$ taro init taro_demo_practise

npm 5.2+ 也可在不全局安装的情况下使用 npx 创建模板项目:

$ npx @tarojs/cli init taro_demo_practise

在这里插入图片描述
创建成功之后,我们可以选择微信开发者工具打开项目,执行npm install安装相关依赖包,再执行npm run dev:weapp即可运行项目,运行效果如下所示:

npm run dev:weapp

在这里插入图片描述

接下来就是我们的Dva的配置了。

Dva 配置

安装 react-redux ,大部分文档说安装tarojs/redux,但是这个包在taro3.x已经消失了,所以这里我们安装 react-redux

npm i --save react-redux

在这里插入图片描述

安装dva-coredva-loading,dva-core 封装了reduxredux-sage的一个插件,dva-loading 用来管理页面的loading状态

npm i --save dva-core dva-loading

dva需要挂载所有的models,所以在src目录创建models目录,并在models目录下的index.js返回项目中创建的所有model

// src/models/index.js
// dva需要挂载所有的models
import users from '../pages/index/models/indexModel'
export default [
  users, // user为项目中创建的model
];

models 的结构如下:

// src/pages/index/models/indexModel.js

export default {
    namespace: 'users',
    state: {
      title: '小辰的Taro_demo'
    },
  
    effects: {},
  
    reducers: {
      save(state, {payload}) {
        return {...state, ...payload};
      },
    },
  };

在src目录下创建utils目录,并在utils目录里创建dva.js文件

/**
 * path:src/utils/dva.js
 */
import {create} from 'dva-core';
import createLoading from 'dva-loading';

let app;
let store;
let dispatch;

function createApp(opt) {
  // 创建应用,返回dva实例
  app = create(opt);
  // 配置插件 createLoading是解决异步加载的过渡问题
  app.use(createLoading({}));
  if (!global.registered) {
    // 注册model
    opt.models.forEach(model => app.model(model));
  }
  global.registered = true;
  // 启动应用
  app.start();
  store = app._store;
  app.getStore = () => store;
  dispatch = store.dispatch;
  app.dispatch = dispatch;
  return app;
}

export default {
  createApp,
  getDispatch: () => {
    return app.dispatch;
  }
}

在入口文件 app.js 里使用 dva.js 返回的方法创建一个 app 获取 store ,并将 store 挂载到Provider 容器里面

/**
 * path:src/app.js
 */
import {Component} from 'react'
import {Provider} from "react-redux";
import './app.less'
import dva from './utils/dva';
import models from "./models";

const myDvaApp = dva.createApp({
  initialState: {},
  models
})
const store = myDvaApp.getStore();

class App extends Component {

  componentDidMount() {
  }

  componentDidShow() {
  }

  componentDidHide() {
  }

  componentDidCatchError() {
  }

  // this.props.children 是将要会渲染的页面
  render() {
    // return this.props.children
    return <Provider store={store}>
      {this.props.children}
    </Provider>
  }
}

export default App

以上,完成 dva 配置

这时,保存,我们可能遇到一个问题:
在这里插入图片描述
解决办法:再安装一次redux就好了。

npm install redux --save

验证配置的 dva 是否可用,在 pages/index/index.jsx 使用 connect 连接 model和组件,并打印this.props

import { Component } from 'react'
import { View, Text } from '@tarojs/components'
import { connect } from 'react-redux';
import './index.less';

@connect(({ users }) => ({
 users
}))
class Index extends Component {

  componentWillMount() { }

  componentDidMount() { }

  componentWillUnmount() { }

  componentDidShow() { }

  componentDidHide() { }

  render() {
    console.log(this.props);
    return (
      <View className='index'>
        <Text>小辰的Taro Demo</Text>
      </View>
    )
  }
}

export default Index;

this.props里面存在model里面的state,连接成功!
在这里插入图片描述

引入taro-ui

安装 taro-ui

npm i --save taro-ui@3.0.0-alpha.3

引入组件样式的三种方式:

  • 全局引入样式(JS中),在入口文件引入所有样式:
import 'taro-ui/dist/style/index.scss'
  • 全局引入样式(CSS中)
@import "~taro-ui/dist/style/index.scss";
  • 按需引入,在页面样式或全局样式中 import 需要的组件样式
@import "~taro-ui/dist/style/components/button.scss";
// src/app.js

import { Component } from 'react'
import { Provider } from 'react-redux'
import 'taro-ui/dist/style/index.scss'
import dva from './utils/dva'
import models from './models'
import './app.less'

const dvaApp = dva.createApp({
  initialState: {},
  models
})
const store = dvaApp.getStore();
class App extends Component {

  componentDidMount () {}

  componentDidShow () {}

  componentDidHide () {}

  componentDidCatchError () {}

  // this.props.children 是将要会渲染的页面
  render () {
    return <Provider store={store}>{this.props.children}</Provider>
  }
}

export default App

修改src/pages/index/index.jsx文件内容,测试taro-ui是否引入成功

// src/pages/index/index.jsx

import { Component } from 'react'
import { View, Text } from '@tarojs/components'
import { AtTabBar } from 'taro-ui'
import { connect } from 'react-redux'
import './index.less'

@connect(({users})=>({
  users
}))
class Index extends Component {

  componentWillMount () { }

  componentDidMount () { }

  componentWillUnmount () { }

  componentDidShow () { }

  componentDidHide () { }

  render () {
    console.log(this.props);
    return (
      <View className='index'>
        <Text>Hello world!</Text>
        <AtTabBar 
          fixed
          tabList={[
            {title: '首页', iconType: 'home'},
            {title: '我的', iconType: 'user'}
          ]}
        />
      </View>
    )
  }
}
export default Index;

效果如下所示,引入成功,开始我们的项目吧!
在这里插入图片描述

可能遇到的Bug

mapStateToProps() in Connect(Index) must return a plain object. Instead received undefined.

解决方法

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

connect我们定义的model时,外面需要包裹一层(),此处大意了,没发现,于是得到这样的bug。

参考文档

Taro 官网
源代码gitee地址
项目总结地址

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值