A full-fledged rich-text editor for Vue.js

vue-editor

A vue rich editor component.

Installation

npm install @baoshishu/vue-editor tiptap tiptap-extensions v-tooltip prosemirror-utils

or

yarn add @baoshishu/vue-editor tiptap tiptap-extensions v-tooltip prosemirror-utils

Basic Setup

<template>
  <Editor v-model="data" :image-provider="imageProvider" />
</template>

<script>
// Import the editor
import Editor from '@baoshishu/vue-editor'

export default {
  components: {
    Editor,
  },
  data() {
    return {
      data: '',
      imageProvider: {
        name: 'qiniu', // provider name
        token:
          '-qWchT63mkZEJch0ygm3bN9h3peInHqCcSAEMtvV:9YAz4dCiB3EAdYuoDVO0YvObtqY=:eyJzY29wZSI6InRlc3QiLCJkZWFkbGluZSI6MTkwMjAyODY1NX0=', // upload token
        domain: 'cdn-testing.zanquan.net', // upload domain
        modifier: ({ width, height, url }) => {
          if (width < 750) {
            return url
          } else {
            return `${url}?imageMogr2/thumbnail/750x/`
          }
        },
      },
    }
  },
}
</script>

imageProvider could also be a function returning a Promise, thus imageProvider would be lazily resolved when user upload image first time.

function resolveProvider() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({
        name,
        token,
        domain,
      })
    }, 1000)
  })
}

{
  imageProvider: resolveProvider
}

AliOSSProvider

import Editor from '@baoshishu/vue-editor'

export default {
  components: {
    Editor,
  },
  data() {
    return {
      data: '',
      imageProvider: {
        name: 'aliyun',
        signature: 'DQdDwZMymx9SKS1HHNFxFbFauVc=',
        policy:
          'eyJleHBpcmF0aW9uIjogIjIwMjAtMDYtMTNUMDU6MTQ6MzVaIiwgImNvbmRpdGlvbnMiOiBbWyJlcSIsICIkYnVja2V0IiwgInlvdWp1YW4tc3RhZ2luZyJdXX0=',
        domain: 'your-bucket.oss-cn-hangzhou.aliyuncs.com',
        OSSAccessKeyId: 'LTAI4G3mD1eKGFqCJnrvNL',
      },
    }
  },
}

GitHub