使用 Vant Weapp
Taro3 支持使用 Vant Weapp 组件库进行开发,示例仓库:taro3-vant-sample。
注意:使用原生第三方组件库进行开发的项目,不再具有多端转换的能力。
Taroify 是移动端组件库 Vant 的 Taro 版本,两者基于相同的视觉规范,提供一致的 API 接口,助力开发者快速搭建小程序应用。
但是,如果你想使用 Vant Weapp 又想拥有多端转换的能力,强烈推荐 Vant Weapp 社区衍生库 @antmjs/vantui, 它是基于 Vant Weapp 开发的多端组件库,同时支持 Taro 和 React。拥有 Taro 多端转换的能力,同时和 Vant Weapp 的 UI 和 API 高度保持一致。
使用方法
配置忽略 vant 的样式尺寸转换
如果直接使用 vant 组件,会发现样式偏小的情况,这是因为 Taro 默认将 vant 的样式尺寸从 px 转换为了 rpx,可以通过配置 selectorblacklist 来禁止转换。
配置方法:
const config = {
  // ...
  mini: {
    postcss: {
      pxtransform: {
        enable: true,
        config: {
          selectorBlackList: [/van-/],
        },
      },
    },
  },
}
配置 copy 小程序原生文件
vant 组件中包含一些小程序原生文件的依赖,目前 Taro 没有对这些依赖进行分析。因此需要配置 copy 把这些依赖移动到 dist 目录中,例如需要 copy wxs 和样式文件,部分配置如下
const config = {
  // ...
  copy: {
    patterns: [
      { from: 'src/components/vant-weapp/dist/wxs', to: 'dist/components/vant-weapp/dist/wxs' },
      { from: 'src/components/vant-weapp/dist/common/style', to: 'dist/components/vant-weapp/dist/common/style' },
      {
        from: 'src/components/vant-weapp/dist/common/index.wxss',
        to: 'dist/components/vant-weapp/dist/common/index.wxss',
      },
      {
        from: 'src/components/vant-weapp/dist/calendar/index.wxs',
        to: 'dist/components/vant-weapp/dist/calendar/index.wxs',
      },
      {
        from: 'src/components/vant-weapp/dist/calendar/utils.wxs',
        to: 'dist/components/vant-weapp/dist/calendar/utils.wxs',
      },
      {
        from: 'src/components/vant-weapp/dist/calendar/calendar.wxml',
        to: 'dist/components/vant-weapp/dist/calendar/calendar.wxml',
      },
      {
        from: 'src/components/vant-weapp/dist/calendar/components/month/index.wxs',
        to: 'dist/components/vant-weapp/dist/calendar/components/month/index.wxs',
      },
    ],
    options: {},
  },
}
引用 vant 组件
首先需要在 app 的 config 或页面的 config 文件中配置 usingComponents 字段,如:
export default {
  navigationBarTitleText: '首页',
  usingComponents: {
    'van-button': '../../components/vant-weapp/dist/button/index',
  },
}
然后在页面中便可以直接使用。
使用 vant 组件
1. 绑定属性
- React
- Vue
import React, { Component } from 'react'
import { View } from '@tarojs/components'
export default class Index extends Component {
  render() {
    return (
      <View>
        <van-button type="primary" loading loading-text="ing">
          Button
        </van-button>
      </View>
    )
  }
}
<template>
  <view>
    <van-button type="primary" :loading="true" loading-text="ing">Button</van-button>
  </view>
</template>
<script>
  export default {
    name: 'index',
  }
</script>
注意:如果组件的某些属性在 vant 文档里写着带有默认值
true,在 Taro 中使用时仍然需要显式设置为 true。
2. 绑定事件
- React
- Vue
import React, { Component } from 'react'
import { View } from '@tarojs/components'
export default class Index extends Component {
  handleClick = () => {
    console.log('click')
  }
  onAfterRead = (res) => {
    console.log(res)
  }
  render() {
    return (
      <View>
        // 对应 bind:click 事件
        <van-button type="primary" onClick={this.handleClick}>
          Button
        </van-button>
        // 对应 bind:after-read 事件
        <van-uploader fileList={[]} onAfterRead={this.onAfterRead} />
      </View>
    )
  }
}
<template>
  <view>
    <van-button type="primary" @click="handleClick">Button</van-button>
    <van-uploader :fileList="[]" @after-read="onAfterRead" />
  </view>
</template>
<script>
  export default {
    methods: {
      handleClick() {
        console.log('click')
      },
      onAfterRead(res) {
        console.log(res)
      },
    },
  }
</script>
3. Slot
- React
- Vue
import React, { Component } from 'react'
import { View, Slot } from '@tarojs/components'
export default class Index extends Component {
  render() {
    return (
      <View>
        <van-calendar poppable show>
          <Slot name="title">
            <View>Hello world</View>
          </Slot>
        </van-calendar>
      </View>
    )
  }
}
<template>
  <view>
    <van-calendar :poppable="true" :show="true">
      <slot-view :name='"title"'>
        <view>Hello world</view>
      </slot-view>
    </van-calendar>
  </view>
</template>
<script>
  export default {
    name: 'index',
  }
</script>
处理 Vant 组件默认值失效的问题
v1.0.2+ 开始支持,且需要 Taro v3.4.10+
在默认情况下,第三方自定义组件的属性会被编译为形如:<van-empty image="{{i.image}}" />。
这时自定义组件声明的默认值会失效(详情请浏览 #11575)。
Component({
  props: {
    image: {
      type: String,
      value: 'default',
    },
  },
})
所以我们需要使用 @tarojs/plugin-inject 为此属性增加默认值,把它编译为形如:<van-empty image="{{i.image===undefined?'default':i.image}}" />。
用法:
const config = {
  plugins: [
    [
      '@tarojs/plugin-inject',
      {
        thirdPartyComponents: {
          // 为 `van-empty` 组件的 image 属性设置默认值 'default'
          'van-empty': {
            image: "'default'",
          },
        },
      },
    ],
  ],
}
常见问题
Vue3
- readonly属性不生效
- 传递函数类型的属性失败:React 写法、Vue3 写法