Taro 3.2.8 + dva + taro-ui搭建微信小程序框架

习文

创建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

查看 Taro 全部版本信息

可以使用 npm info @tarojs/cli 查看 Taro 版本信息,在这里你可以看到当前最新版本

image.png

项目初始化

使用 taro init myApp 可以创建初始化项目

npm 5.2+ 也可在不全局安装的情况下使用 npx @tarojs/cli init myApp 创建模板项目

image.png

编译运行

使用npm run dev:weapp命令进行编译,编译好了之后,下载并打开微信开发者工具,然后选择项目根目录进行预览。

image.png

以上过程可以到Taro官网上去看。

配置dva

安装 react-redux,有很多博客上面说的是安装tarojs/redux,但是这个包在taro3.x已经没有了,所以这里安装 react-redux

cnpm i --save react-redux

安装dva-coredva-loading

cnpm i --save dva-core dva-loading

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

// src/models/index.js

import users from '../pages/index/model'

export default [
  users,
];

users为项目中创建的model

// src/pages/index/model

export default {
  namespace: 'users',
  state: {
    title: 'Hello World'
  },

  effects: {},

  reducers: {
    save(state, { payload }) {
      return { ...state, ...payload };
    },
  },
};

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

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

let app;
let store;
let dispatch;

function createApp(opt){
  app = create(opt);
  app.use(createLoading({}));
  if(!global.registered){
    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容器里面

// src/app.js

import { Component } from 'react'
import dva from './utils/dva'
import { Provider } from 'react-redux'
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

到此,配置dva完成

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

// pages/index/index.jsx

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

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

  componentWillMount () { }

  componentDidMount () { }

  componentWillUnmount () { }

  componentDidShow () { }

  componentDidHide () { }

  render () {
    console.log(this.props);
    return (
      <View className='index'>
        <Text>Hello world!</Text>
      </View>
    )
  }
}

image.png
this.props里面存在model里面的state,连接成功!

引入taro-ui

使用 cnpm i --save taro-ui@3.0.0-alpha.3 安装 taro-ui

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

  • 全局引入样式(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

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;

效果如下:
image.png

阅读 1.5k
7 声望
6 粉丝
0 条评论
7 声望
6 粉丝
文章目录
宣传栏