3.uniapp项目中引入小程序ui -vant weapp组件

项目需求:

  • 使用uniapp开发微信小程序
  • 在uniapp项目中使用小程序ui-vant weapp组件

想要知道如何在uniapp项目中引入使用小程序ui-vant weapp组件,首先得了解如果在uniapp项目中使用小程序组件

uniapp对小程序自定义组件支持

微信小程序组件需要放在项目特殊文件夹 wxcomponents

  • HBuilderX 建立的工程 wxcomponents 文件夹在 项目根目录下。
  • vue-cli 建立的工程 wxcomponents 文件夹在 src 目录下。
image.png

使用方式
image.png

在 pages.json 对应页面的 style -> usingComponents 引入组件:

{
    "pages": [{
        "path": "index/index",
        "style": {
            // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-QQ
            "usingComponents": {
                "custom": "/wxcomponents/custom/index"
            },
            // #endif
            "navigationBarTitleText": "uni-app"
        }
    }]
}

在页面中使用

<!-- 页面模板 (index.vue) -->
<view>
    <!-- 在页面中对自定义组件进行引用 -->
    <custom name="uni-app"></custom>
</view>
  • 注意数据和事件绑定的差异,组件使用时应按照 vue 的数据和事件绑定方式
    • 属性绑定从 attr="{{ a }}",改为 :attr="a";从 title="复选框{{ item }}" 改为 :title="'复选框' + item"
    • 事件绑定从 bind:click="toggleActionSheet1" 改为 @click="toggleActionSheet1",目前支付宝小程序不支持 vue 的事件绑定方式,具体参考:支付宝小程序组件事件监听示例
    • 阻止事件冒泡 从 catch:tap="xx" 改为 @tap.native.stop="xx"
    • wx:if 改为 v-if
    • wx:for="{{ list }}" wx:key="{{ index }}" 改为v-for="(item,index) in list"

uniapp官网上有一句话:

当需要在 vue 组件中使用小程序组件时,注意在 pages.jsonglobalStyle 中配置 usingComponents,而不是页面级配置。

我对这句话的理解是:

  • 如果你是在页面中使用小程序组件,可以按照上面介绍的方式,在注册此页面的时候,在配置的style.usingComponents对象中注册页面中要使用的小程序组件
  • 如果你是想在封装的vue组件A中使用小程序组件,既然A被封装为组件,那就代表它可能在所有的页面或组件中被使用,则A中使用的小程序组件就可能被用在整个项目任何地方,这次就必须全局注册此小程序组件

而我们想在uniapp项目中使用vant weapp微信小程序组件的诉求,其实是想在项目中任何位置都可以使用vant组件,所以我们需要全局注册vant小程序组件

在uniapp项目中全局注册vant微信小程序组件

1.打开vant weapp小程序官网,点击顶部导航右边的git图标,进入在git上的地址

https://vant-contrib.gitee.io/vant-weapp/#/quickstart

image.png

https://github.com/youzan/vant-weapp
image.png

2.执行下面命令把vant weapp源码下载下来后,

git clone https://github.com/youzan/vant-weapp.git

3.把dist目录下的文件,拷贝到wxcomponents目录下

image.png

4.全局注册在uniapp项目中使用到的vant微信小程序组件

{
  "pages": [
    //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
    {
      "path": "pages/index/index",
      "style": {
        "navigationBarTitleText": "uni-app"
      }
    }
  ],
  "globalStyle": {
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "uni-app",
    "navigationBarBackgroundColor": "#F8F8F8",
    "backgroundColor": "#F8F8F8",
    "usingComponents": {
      "van-button": "/wxcomponents/button/index",
      "van-field": "/wxcomponents/field/index",
      "van-switch": "/wxcomponents/switch/index",
      "van-search": "/wxcomponents/search/index",
      "van-cell-group": "/wxcomponents/cell-group/index",
      "van-cell": "/wxcomponents/cell/index",
      "van-radio": "/wxcomponents/radio/index",
      "van-radio-group": "/wxcomponents/radio-group/index",
      "van-checkbox": "/wxcomponents/checkbox/index",
      "van-checkbox-group": "/wxcomponents/checkbox-group/index",
      "van-picker": "/wxcomponents/picker/index",
      "van-popup": "/wxcomponents/popup/index",
      "van-grid": "/wxcomponents/grid/index",
      "van-grid-item": "/wxcomponents/grid-item/index",
      "van-row": "/wxcomponents/row/index",
      "van-col": "/wxcomponents/col/index",
      "van-count-down": "/wxcomponents/count-down/index",
      "van-icon": "/wxcomponents/icon/index",
      "van-tab": "/wxcomponents/tab/index",
      "van-tabs": "/wxcomponents/tabs/index",
      "van-divider": "/wxcomponents/divider/index",
      "van-dialog": "/wxcomponents/dialog/index",
      "van-toast": "/wxcomponents/toast/index",
      "van-stepper": "/wxcomponents/stepper/index",
      "van-slider": "/wxcomponents/slider/index",
      "van-tag": "/wxcomponents/tag/index",
      "van-loading": "/wxcomponents/loading/index",
      "van-overlay": "/wxcomponents/overlay/index",
      "van-collapse": "/wxcomponents/collapse/index",
      "van-collapse-item": "/wxcomponents/collapse-item/index",
      "van-dropdown-item": "/wxcomponents/dropdown-item/index",
      "van-dropdown-menu": "/wxcomponents/dropdown-menu/index",
      "van-empty": "/wxcomponents/empty/index",
      "van-notice-bar": "/wxcomponents/notice-bar/index",
      "van-image": "/wxcomponents/image/index",
      "van-datetime-picker": "/wxcomponents/datetime-picker/index",
      "van-uploader": "/wxcomponents/uploader/index"
    }
  }
}


并不需要注册所有的,你使用那个组件注册那个就行

5.在App.vue中引入UI样式

image.png

6.使用微信小程序组件

<template>
  <view class="wrapper">
    <van-dialog id="van-dialog" />
    <van-toast id="van-toast" />
    <nav-bar
      :title="id ? '修改客户' : '新增客户'"
      :showBack="true"
      :backgroundColor="'transparent'"
    ></nav-bar>
    <scroll-view
      :refresher-enabled="false"
      :refresher-triggered="triggered"
      @refresherrestore="onRestore"
      scroll-y="true"
      class="page-container"
      :style="{ height: `calc(${getScrollViewHeight(false)})` }"
    >
      <view class="main-wrap">
        <view class="common-cell-wrap">
          <van-cell-group class="common-cell-group" :border="false">
            <van-field
              class="common-cell"
              :value="params.customerName"
              required
              placeholder="请输入名称"
              placeholder-style="color:#969CAC"
              :title-width="'112rpx'"
              @input="inputChange($event, 'customerName')"
            >
              <view slot="label" class="color-dark font14">名称</view>
            </van-field>
            <van-field
              class="common-cell"
              :value="params.custContactName"
              placeholder="请输入联系人"
              placeholder-style="color:#969CAC"
              :title-width="'112rpx'"
              @input="inputChange($event, 'custContactName')"
            >
              <view slot="label" class="color-dark font14">联系人</view>
            </van-field>
            <van-field
              class="common-cell"
              :value="params.custContactPhone"
              type="number"
              placeholder="请输入联系方式"
              placeholder-style="color:#969CAC"
              :title-width="'112rpx'"
              @input="inputChange($event, 'custContactPhone')"
            >
              <view slot="label" class="color-dark font14">联系方式</view>
            </van-field>
            <van-field
              class="common-cell"
              :value="params.address"
              placeholder="请输入联系地址"
              placeholder-style="color:#969CAC"
              :title-width="'112rpx'"
              @input="inputChange($event, 'address')"
            >
              <view slot="label" class="color-dark font14">联系地址</view>
            </van-field>
            <van-field
              class="common-cell"
              :value="params.credit"
              type="digit"
              placeholder="请输入信用额度"
              placeholder-style="color:#969CAC"
              :title-width="'112rpx'"
              @input="inputChange($event, 'credit')"
            >
              <view slot="label" class="color-dark font14">信用额度</view>
            </van-field>
          </van-cell-group>
        </view>
      </view>
      <view class="mt25">
        <van-button :disabled="disabled" round color="#4475FD" @click="submit"
          >确定</van-button
        >
      </view>
    </scroll-view>
  </view>
</template>
<script>
import { navBar } from "@/component/nav-bar";
import { addCustomer, editCustomer, getCustomerDetail } from "@/api/client";
export default {
  name: "AddClient",
  components: { navBar },
  data() {
    return {
      params: {
        custContactName: "",
        address: "",
        credit: "",
        customerName: "",
        custContactPhone: "",
      },
      disabled: false,
      id: null, //id有值,说明是编辑页面,无值说明是新增页面
    };
  },
  onLoad(option) {
    if (option.id) {
      this.id = option.id;
      this.getDetail();
    }
  },
  methods: {
    async getDetail() {
      const res = await getCustomerDetail({ customerId: this.id });
      this.params = res.data;
      delete this.params.balance;
      delete this.params.createTime;
    },
    inputChange(e, field) {
      this.params[field] = e.detail;
    },
    validate() {
      if (!this.params.customerName) {
        this.toast("请输入名称");
        return false;
      }
      if (this.params.credit && !this.$U.isSave2(this.params.credit)) {
        this.toast("信用额度最多两位小数");
        return false;
      }
      if (
        this.params.custContactPhone &&
        !this.$U.isTel(this.params.custContactPhone)
      ) {
        this.toast("手机号格式不正确");
        return false;
      }
      return true;
    },
    async submit() {
      const validateResult = this.validate();
      if (validateResult) {
        console.log("submit");

        if (this.disabled) return;
        try {
          this.disabled = true;
          if (this.id) {
            //编辑

            await editCustomer({ ...this.params });
          } else {
            //新增
            await addCustomer({ ...this.params });
          }

          this.toast.success(this.id ? "修改客户成功!" : "新增客户成功!");
          setTimeout(() => {
            uni.navigateBack();
          }, 500);
        } catch (error) {
          // this.toast(this.id ? "修改客户失败!" : "新增客户失败!");
        } finally {
          this.disabled = false;
        }
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.wrapper {
  .page-container {
    box-sizing: border-box;
    background: #f6f7fb;
    padding: 20rpx;
    .main-wrap {
      box-sizing: border-box;
      border-radius: 10rpx;
      background: #fff;
      padding: 20rpx;
      .righticon {
        width: 12rpx;
        height: 12rpx;
      }
      .cell-righticon {
        display: flex;
        align-items: center;
        justify-content: flex-end;
        img {
          width: 12rpx;
          height: 12rpx;
        }
      }
      .flex-center {
        display: flex;
        align-items: center;
        justify-content: space-around;
      }
    }
    .flex {
      display: flex;
    }
    .mr18 {
      margin-right: 36rpx;
    }
    .mt25 {
      margin-top: 50rpx;
    }
    .mt15 {
      margin-top: 30rpx;
    }
  }
}

/deep/ .van-icon-cross {
  color: #969cac;
}
// 按钮大小
/deep/ .van-button {
  width: 100%;
}
</style>


注意事项:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容