因为我的项目须要 @谁来看的性能,所以依据官网 editor 二次封装了一个富文本编辑器,想着可能你们心愿本人定义编辑器按钮,所以把按钮组件提出来了,你能够自在更换,想着你可能更心愿基于 api 本人设计编辑器,所以把性能都给你封装到 Class Edit 类了,你只需 new Edit,外面丰盛的 api 就都是你的了。
插件地址:https://ext.dcloud.net.cn/plugin?name=lsj-edit
创作不易,若能帮到你请不要手软点亮 5 颗星~
- 此组件是对 editor 组件二次封装,减少了相似微信的 @谁来看 和 相似微博的插入 #话题等性能
- 如心愿插入话题或 @后光标不指向最初而指向话题前面,须要在 editor 组件源码退出一段代码,须要能够加 Q 群发你
- 为了不便大家更换按钮控件,我将控制器按钮和编辑器画布拆分成了两个组件
- 你齐全能够自定义编辑器,所有性能都封装到了 edit 类,不便各位调用, 查看 Edit 具体文档
-
属性 |
是否必填 |
值类型 |
默认值 / 返回值 |
阐明 |
html |
否 |
String |
– |
初始化时加载的 html,例如加载草稿 |
placeholder |
否 |
String |
开始输出 |
编辑器提示信息 |
maxCount |
否 |
Number |
0 |
最大输出字数,含空格和符号,超出最大限度时 Edit 返回 overstep:true |
readOnly |
否 |
Boolean |
false |
编辑器是否只读 |
styles |
否 |
Object |
– |
编辑器自定义款式 |
showImgSize |
否 |
Boolean |
true |
点击图片时显示图片大小控件 |
showImgToolbar |
否 |
Boolean |
true |
点击图片时显示工具栏控件 |
showImgResize |
否 |
Boolean |
true |
点击图片时显示批改尺寸控件 |
@onReady |
否 |
Function |
[Class] Edit |
编辑器初始化实现触发回调,返回 edit 实例对象 |
属性 |
是否必填 |
值类型 |
默认值 / 返回值 |
阐明 |
edit |
是 |
[Class] Edit |
– |
将 edit 对象传入和应用 |
color |
否 |
String |
#999999 |
Tab 栏字体默认色彩 |
selectedColor |
否 |
String |
#00aaff |
Tab 栏字体选中色彩 |
fontColor |
否 |
Array |
Array |
字体罕用色彩数组 |
bgColor |
否 |
Array |
Array |
字体罕用背景色数组 |
tabs |
否 |
Array |
#、@ |
Tab 栏是否须要显示 #和 @ |
emojiList |
否 |
Array |
true |
emoji 列表 |
@click |
否 |
Function |
Object {name,index} |
点击 Tab 栏时回调 |
@submit |
否 |
Function |
Class Edit |
点击 Tab 栏右侧提交按钮时回调 |
<lsj-edit
ref="lsjEdit"
placeholder="输出注释"
:maxCount="200"
@onReady="editReady">
<template v-slot:btns="data">
<edit-btns
:edit="data.edit"
@click="onTabClick"
@submit="save"></edit-btns>
</template>
</lsj-edit>
import editBtns from '@/uni_modules/lsj-edit/components/lsj-edit/edit-btns/edit-btns.vue';
export default {
components:{
// 富文本基本操作按键,可自行抉择是否应用示例的按键
editBtns
},
data() {
return {edit: null}
},
methods: {
// 编辑器初始化结束,返回 edit 对象
editReady(edit) {
// 将富文本对象寄存到以后页面,便于后续间接操作
this.edit = edit;
},
// 演示 ---- 按钮组件点击事件
onTabClick({name,index}) {switch (index){
// 插入 #话题#
case 0:
this.addLink();
break;
// @某人
case 1:
this.addLink2();
break;
default:
break;
}
},
// 演示公布
async save() {
// 获取插入的图片列表
let imgs = await this.edit.getImages()
// 判断是否容许提交
if (!this.edit.textCount && !imgs.length) {
uni.showToast({title: '请录入内容'});
}
// 将所有未上传的本地图片上传到服务器并替换到编辑器
this.edit.replaceImage(async(img)=>{
// 已上传的无需再上传
// 这里没有放到 edit 外部去过滤,因为我感觉需不需要上传得你本人决定
// 比方插入的 base64 图片是否须要上传
// img.indexOf('http') = 0 阐明这个图片曾经是网络地址,无需替换就间接跳过
if(img.indexOf('http') === 0) {return img;}
// 上传并替换图片
/*
let {data} = await uni.uploadFile({
url: 'https://www.example.com/upload', // 仅为示例,非实在的接口地址
filePath: img, // 本地图片
name: 'file',
formData: {'user': 'test'}
});
return data;
*/
// 因为演示的时候没有服务器,所以间接换个网络图不便后续演示,// 理论我的项目应应用上方正文内容
return 'https://t7.baidu.com/it/u=3406125714,2513313326&fm=193&f=GIF'
}).then(res=>{console.log('替换实现, 最终内容为',JSON.stringify(res));
// 示例我的项目可查看解析富文本演示
uni.navigateTo({url: '/pages/article/article?data='+escape(res.html)
});
});
},
// 插入话题示例
addLink() {
this.edit.addLink({
prefix: '#',
suffix: '#',
name: '有问题欢送退出 LSJ 插件交换群',
data: {
name: 'QQ 交换群',
qqGroupChatID: '667530868',
}
})
},
// @某人示例
addLink2() {
this.edit.addLink({
prefix: '@',
name: '马冬梅',
data: {userId: 10,}
})
}
}
}
- 调用 editorContext 对象的事件,如撤销 undo, 复原 redo, 清空内容 clear, 失焦 blur 等
- 调用形式:edit.tool(‘blur’)
参数 |
阐明 |
name |
editorContext 对象的事件名称,如撤销 undo, 复原 redo, 清空内容 clear 等 |
value |
editorContext 事件参数,如初始化 html 内容 edit.tool(‘setContents’,{html}), 设置文本 edit.tool(‘insertText’,{text}) |
- 批改款式, 反对的值可查看 editorContext format
- 调用形式:edit.format(‘color’,’#999999′)
- 获取编辑器内容, 返回 Promise.resolve
- 调用形式:await edit.getContents()
- 使光标进入编辑器并唤起键盘
- 调用形式:edit.upKeyboard()
- 插入 emoji 表情
- 调用形式:edit.emoji(‘😀’)
- 插入带参数的链接,如插入 #话题或 @谁
- 调用形式:edit.addLink(Object)
参数 |
必填 |
阐明 |
prefix |
否 |
在插入的内容后面增加一串字符,例如 @谁 |
suffix |
否 |
在插入的内容前面增加一串字符,例如 #话题 #的 #号 |
name |
是 |
插入的字符串 |
data |
否 |
链接附带的参数,用于解析后点击该链接返回 |
- 获取编辑器内增加的所有链接
- 调用形式:edit.getLink()
- 通过相册 / 相机抉择图片并增加到编辑器中,此时图片是本地门路,在公布前应将图片上传,具体可查看示例我的项目 index.vue 提交事件示例;
- 调用形式:edit.addImage(tempFilePaths)
参数 |
类型 |
必填 |
阐明 |
tempFilePaths |
Array |
否 |
不传参数时调起相册 / 相机抉择,传入图片数组时直接插入 |
- 获取编辑器内增加的所有图片
- 调用形式:edit.getImages()
- 替换图片,编辑器内每个图片都会触发传入的 fn, 依据须要可自行替换成新的图片地址,用于将本地图片上传到服务器
- 必须传入 Function,且必须 return 一个图片地址
- 调用形式:edit.replaceImage(fn)
参数 |
类型 |
必填 |
阐明 |
fn |
Function |
是 |
return 的图片地址将替换之前的图片 |
// 提交前将所有未上传的本地图片上传到服务器并替换到编辑器
edit.replaceImage(async(img)=>{
// 已上传的无需再上传
// 这里没有放到 edit 外部去过滤,因为我感觉需不需要替换得你本人决定
// 比方插入的 base64 图片是否须要上传
// img.indexOf('http') = 0 阐明这个图片曾经是网络地址,就跳过
if(img.indexOf('http') === 0) {return img;}
// 上传并替换图片
let {data} = await uni.uploadFile({
url: 'https://www.example.com/upload', // 仅为示例,非实在的接口地址
filePath: img, // 本地图片
name: 'file',
formData: {'user': 'test'}
});
return data;
}).then(res=>{console.log('所有图片替换实现, 返回最新的 detail',JSON.stringify(res));
});
- Edit 为您设计了观察者模式,您能够在须要的中央注册和发送事件
事件 |
阐明 |
edit:input |
编辑器内输出或删除内容时触发 |
edit:statuschange |
光标所指向的内容款式变动时触发,返回以后款式 |
edit:focus |
焦点进入时触发 |
edit:blur |
焦点来到时触发 |
- 如阐明表白还不够分明,不分明怎么应用可导入残缺示例我的项目运行体验和查看
- 欢送退出 QQ 探讨群:701468256(已满)
- 欢送退出 QQ 探讨群:469580165(已满)
- 欢送退出 QQ 探讨群:667530868
- 若能帮到你还请点亮 5 颗小星星以作激励哈~
- 若能帮到你还请点亮 5 颗小星星以作激励哈~
- 若能帮到你还请点亮 5 颗小星星以作激励哈~