title: 在mpvue中使用小程序原生自定义组件

date: 2018-07-12

author: 生忘

subtitle: 以一套小程序绘图组件Painter为例,简单介绍如何在mpvue中使用小程序原生自定义组件。

tags: [小程序, 组件, mpvue]

categories: 小程序

前言

前几天把一个用于生成图片的、叫做painter的库开源了https://juejin.im/post/5b40b158e51d4518f543c7b0,然后在评论区里发现,有不少人很关心能否在wepy或者mpvue框架里也使用它。

painter是基于原生开发方式而实现的一个自定义组件(Componnets),而mpvue是可以支持使用原生自定义组件的。wepy还没有尝试过。

mpvue

目录简介

主要关心代码在编译前(vue风格)和编译后(原生开发)的变化。

可以看一下本文demo项目的整体目录:

src目录下是我们开发时用vue写的代码;dist目录下的内容是最后运行的代码,是原生开发形式的。可以看到dist里面的内容分为:

  • pages。这一部分存放的是页面文件,即在src中被编译后的每个页面的wxml, js, wxss, json文件。但是这些文件不直接包含重要代码,而是通过import和require语句导入。json文件例外,它直接使用我们写在mpvue中的main.js里的config内容。

  • components里存放的是template内容,它们会通过imort语法被页面的wxml文件调用。

  • static目录。里面存放着两类内容。

第一类,是刚才说到的、页面所需要的css样式文件和js文件,它们通过import和require语法被引入页面。

第二类,原本就放置在这个文件夹中的东西,会原封不动地写入dist目录下的static,如demo中的painter组件。

在mpvue中使用painter
  1. 安装mpvue,并新建项目。http://mpvue.com/mpvue/quickstart/
  2. 编写所需要的页面:
<template>
    <div>
        <button @click="save">保存</button>
    </div>
</template>

<script>
export default {
  methods: {
    save () {
      console.log('on save click')
    }
  }
}
</script>

这是一个基础页面,只包含了一个按钮组件button。

  1. 导入原生自定义组件,放在static目录下。

    本文以painter为例,可以运行代码:

   git submodule add https://github.com/Kujiale-Mobile/PainterCore.git static/painter

也可以直接把组件放入static目录下。

  1. 在编译之后的dist/static/目录下会存在和这里导入完全相同的painter组件。现在要考虑调用它。

  2. 在demo/main.js中引入对组件的引用:

    import Vue from 'vue'
    import App from './index'
    const app = new Vue(App)
    app.$mount()
    export default {
      config: {
        navigationBarTitleText: 'demo',
        usingComponents: {
          'painter': '/static/painter/painter'
        }
      }
    }
    
  3. 在demo/index.vue中引用组件:

    <template>
        <div>
            <painter :customStyle="customStyle" :imgOK="onImgOk" :palette="template" />
            <button @click="save">保存</button>
        </div>
    </template>
       
    <script>
    export default {
      methods: {
        save () {
          console.log('on save click')
        },
        onImgOK (e) {
          console.log(e)
        }
      }
    }
    </script>
    
  4. 此时编译成功。在这里,Painter这个组件需要配合palette进行使用,palette里的代码是用来编写图片内容,具体用法可参考 https://juejin.im/post/5b40b158e51d4518f543c7b0 。在项目/src/下创建palette目录,新建card.js文件。由于palette本身是js文件的形式,所以无需放在static中。

  5. 使用palette/card.js为painter导入数据

    <template>
        <div>
            <painter :customStyle="customStyle" @imgOK="onImgOk" :palette="template" />
            <button style="margin-top:40rpx" @click="save">保存</button>
        </div>
    </template>
       
    <script>
    import Card from '../../palette/card'
    const card = new Card()
    const userInfo = {
      avatar: 'https://qhyxpicoss.kujiale.com/r/2017/12/04/L3D123I45VHNYULVSAEYCV3P3X6888_3200x2400.jpg@!70q'
    }
       
    const template = card.do(userInfo)
    const customStyle = 'margin-left:40rpx'
       
    export default {
      data () {
        return {
          customStyle: customStyle,
          template: template
        }
      },
      methods: {
        save () {
          console.log('on save click')
        },
        onImgOK (e) {
          console.log(e)
        }
      }
    }
    </script>
    

    编译后可以看到绘制的效果了。

  6. 可能出现的错误:

    • SyntaxError: Unexpected token export/import。es5用的是jsCommon,不支持import语法。开启项目设置的es6转es5即可。
    • 预览模式的真机在请求图片时网络错误,原因是预览模式下会校验域名。如果需要查看真机的效果,请使用远程调试模式,或者把图片的地址设为自己的安全域名下的地址。

本文demo地址:https://github.com/Kujiale-Mobile/Mpvue-Painter-Demo