uni-app 富文本編輯器使用

主要是記錄下
<style>
	@import "../../static/css/editor-icon.css";
</style>

<template>
	<view class="warp">
		<view class="container">
			<view class="page-body">
				<view class='wrapper'>
					<view class='toolbar' @tap="format" style="margin-left: 30rpx;">
						<view :class="formats.bold ? 'ql-active' : ''" class="iconfont icon-zitijiacu" data-name="bold"></view>
						<view :class="formats.italic ? 'ql-active' : ''" class="iconfont icon-zitixieti" data-name="italic"></view>
						<view :class="formats.underline ? 'ql-active' : ''" class="iconfont icon-zitixiahuaxian" data-name="underline"></view>
						<view :class="formats.strike ? 'ql-active' : ''" class="iconfont icon-zitishanchuxian" data-name="strike"></view>
						<view :class="formats.align === 'left' ? 'ql-active' : ''" class="iconfont icon-zuoduiqi" data-name="align"
						 data-value="left"></view>
						<view :class="formats.align === 'center' ? 'ql-active' : ''" class="iconfont icon-juzhongduiqi" data-name="align"
						 data-value="center"></view>
						<view :class="formats.align === 'right' ? 'ql-active' : ''" class="iconfont icon-youduiqi" data-name="align"
						 data-value="right"></view>
						<view :class="formats.align === 'justify' ? 'ql-active' : ''" class="iconfont icon-zuoyouduiqi" data-name="align"
						 data-value="justify"></view>
						<view :class="formats.lineHeight ? 'ql-active' : ''" class="iconfont icon-line-height" data-name="lineHeight"
						 data-value="2"></view>
						<view :class="formats.letterSpacing ? 'ql-active' : ''" class="iconfont icon-Character-Spacing" data-name="letterSpacing"
						 data-value="2em"></view>
						<view :class="formats.marginTop ? 'ql-active' : ''" class="iconfont icon-722bianjiqi_duanqianju" data-name="marginTop"
						 data-value="20px"></view>
						<view :class="formats.previewarginBottom ? 'ql-active' : ''" class="iconfont icon-723bianjiqi_duanhouju"
						 data-name="marginBottom" data-value="20px"></view>
						<view class="iconfont icon-clearedformat" @tap="removeFormat"></view>
						<view :class="formats.fontFamily ? 'ql-active' : ''" class="iconfont icon-font" data-name="fontFamily" data-value="Pacifico"></view>
						<view :class="formats.fontSize === '24px' ? 'ql-active' : ''" class="iconfont icon-fontsize" data-name="fontSize"
						 data-value="24px"></view>

						<view :class="formats.color === '#0000ff' ? 'ql-active' : ''" class="iconfont icon-text_color" data-name="color"
						 data-value="#0000ff"></view>
						<view :class="formats.backgroundColor === '#00ff00' ? 'ql-active' : ''" class="iconfont icon-fontbgcolor"
						 data-name="backgroundColor" data-value="#00ff00"></view>

						<view class="iconfont icon-date" @tap="insertDate"></view>
						<view class="iconfont icon--checklist" data-name="list" data-value="check"></view>
						<view :class="formats.list === 'ordered' ? 'ql-active' : ''" class="iconfont icon-youxupailie" data-name="list"
						 data-value="ordered"></view>
						<view :class="formats.list === 'bullet' ? 'ql-active' : ''" class="iconfont icon-wuxupailie" data-name="list"
						 data-value="bullet"></view>
						<view class="iconfont icon-undo" @tap="undo"></view>
						<view class="iconfont icon-redo" @tap="redo"></view>

						<view class="iconfont icon-outdent" data-name="indent" data-value="-1"></view>
						<view class="iconfont icon-indent" data-name="indent" data-value="+1"></view>
						<view class="iconfont icon-fengexian" @tap="insertDivider"></view>
						<view class="iconfont icon-charutupian" @tap="insertImage"></view>
						<view :class="formats.header === 1 ? 'ql-active' : ''" class="iconfont icon-format-header-1" data-name="header"
						 :data-value="1"></view>
						<view :class="formats.script === 'sub' ? 'ql-active' : ''" class="iconfont icon-zitixiabiao" data-name="script"
						 data-value="sub"></view>
						<view :class="formats.script === 'super' ? 'ql-active' : ''" class="iconfont icon-zitishangbiao" data-name="script"
						 data-value="super"></view>
						<view class="iconfont icon-shanchu" @tap="clear"></view>
						<view :class="formats.direction === 'rtl' ? 'ql-active' : ''" class="iconfont icon-direction-rtl" data-name="direction"
						 data-value="rtl"></view>

					</view>

					<editor id="editor" class="ql-container" placeholder="開始輸入..."
					 @statuschange="onStatusChange" :read-only="readOnly" @ready="onEditorReady">
					 <!-- <editor id="editor" class="ql-container" placeholder="開始輸入..." showImgSize showImgToolbar showImgResize
					 @statuschange="onStatusChange" :read-only="readOnly" @ready="onEditorReady"> -->
					</editor>
				</view>
			</view>

		</view>
	</view>
</template>

<script>
export default {
	data() {
		return {
			readOnly: false,
			formats: {},
			describe:'',
		}
	},
	onLoad(option) {
		uni.loadFontFace({
			family: 'Pacifico',
			source: 'url("https://sungd.github.io/Pacifico.ttf")'
		})
		this.describe = option.describe;
	},
	methods: {
		//初始化、賦值
		initEditor: function(){
			var html = this.describe;
			this.editorCtx.setContents({
				html:html,
				success:(res)=> {
				},
				fail: (res) => {
				},
				complete:(res) => {
				}
			});
		},
		//確定
		save:function(){
			this.editorCtx.getContents({
				success:(res)=> {
					console.log(res)
					
					//把參數傳到上一個頁面
					var pages = getCurrentPages();
					// var currPage = pages[pages.length - 1]; //當前頁面
					var prevPage = pages[pages.length - 2]; //上一個頁面
					//直接修改上一頁的data中的參數
					prevPage.$vm.form.describe = res.html;
					uni.navigateBack({
						delta:1,
					})
				},
				fail: (res) => {
					console.log(res)
				}
			})
		},
		
		readOnlyChange() {
			this.readOnly = !this.readOnly
		},
		onEditorReady() {
			uni.createSelectorQuery().select('#editor').context((res) => {
				this.editorCtx = res.context
				this.initEditor();
			}).exec();
		},
		undo() {
			this.editorCtx.undo()
		},
		redo() {
			this.editorCtx.redo()
		},
		format(e) {
			let {
				name,
				value
			} = e.target.dataset
			if (!name) return
			// console.log('format', name, value)
			this.editorCtx.format(name, value)
		},
		onStatusChange(e) {
			const formats = e.detail
			this.formats = formats
		},
		insertDivider() {
			this.editorCtx.insertDivider({
				success: function() {
					console.log('insert divider success')
				}
			})
		},
		clear() {
			this.editorCtx.clear({
				success: function(res) {
					console.log("clear success")
				}
			})
		},
		removeFormat() {
			this.editorCtx.removeFormat()
		},
		insertDate() {
			const date = new Date()
			const formatDate = `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`
			this.editorCtx.insertText({
				text: formatDate
			})
		},
		insertImage() {
			uni.chooseImage({
				count: 1,
				success: (res) => {
					let that = this;
					
					const token = uni.getStorageSync('wsplus_auth_tokenId');
					const uploadUrl = url_config + 'web/upload/app/img';
					uni.showLoading({ mask: true });
					uni.uploadFile({
						url: uploadUrl, //僅爲示例,非真實的接口地址
						filePath: res.tempFilePaths[0],
						name: 'file',
						fileType: 'image',
						formData: {
							uploadpath: 'file',
							filename: 'file'
						},
						header: {
							currentUserToken: token
						},
						success: res => {
							console.log(res);
							let uploadRes = JSON.parse(res.data);
							uni.hideLoading();
					
							this.editorCtx.insertImage({
								src:  uploadRes.url,
								alt: '圖像',
								success: function() {
									console.log('insert image success')
								}
							})
						},
						fail: uploadFileRes => {
							console.log(uploadFileRes);
						}
					});
				}
			})
		},
	},
}
</script>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章