微信小程序实战之实现富文本编辑器

2023-11-07

前言

这是我参加掘金启航计划的第三篇文章,这次总结的是实现一个简单的富文本编辑器,相信阅读文章后,观众老爷们,能够实现富文本编辑器,在微信小程序中发布自己的文章,希望观众老爷们多多支持!

1. 实现效果

实现的效果如下图:

1.文本加粗、斜体、下划线,对齐方式
2.撤销、恢复、插入图片、删除功能。

2. 创建发布页面,实现基本布局

首先创建发布页面 article,在 app.json 中通过配置生成页面即可。

"pages": ["pages/article/article"] 

article.wxml 中,书写结构:

<view><!-- 文章类型 --><view><picker bindchange="bindPickerChange" model:value="{{index}}" range="{{array}}"><view class="picker">文章类型:{{objectArray[index].name}}</view></picker></view><!-- 文章标题 --><view><input name="title" class="title" placeholder="请输入文章标题" maxlength="18" model:value="{{title}}"></input></view><!-- 编辑区 --><view class="container"><view class="page-body"><view class='wrapper'><!-- 操作栏 --><view class='toolbar' bindtap="format"> <i class="iconfont icon-zitijiacu"></i><i class="iconfont icon-zitixieti"></i><i class="iconfont icon-zitixiahuaxian"></i><i class="iconfont icon-zuoduiqi"></i><i class="iconfont icon-juzhongduiqi"></i><i class="iconfont icon-youduiqi"></i><i class="iconfont icon-undo"></i><i class="iconfont icon-redo"></i> <i class="iconfont icon-charutupian"></i><i class="iconfont icon-shanchu"></i></view><!-- 文章内容区,富文本编辑器 --><editor id="editor" class="ql-container" placeholder="{{placeholder}}"showImgSize showImgToolbar showImgResize></editor><!-- 发布按钮 --><view class="button" bindtap="formSubmit">发布</view></view></view></view>
</view> 

article.wxss,书写基本的样式:

page{width: 740rpx;margin: 0 auto;background-color: #f9f9f9;

}

.title {border: 1rpx solid #f2f2f2;margin: 10rpx;height: 70rpx;line-height: 70rpx;border-radius: 10rpx;
}

.picker{padding: 10rpx;
}

.wrapper {padding: 5px;
}

.iconfont {display: inline-block;padding: 8px 8px;width: 24px;height: 24px;cursor: pointer;font-size: 20px;
}

.toolbar {box-sizing: border-box;border-bottom: 0;font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
}

.ql-container {box-sizing: border-box;padding: 12px 15px;width: 100%;min-height: 30vh;height: auto;background: #fff;margin-top: 20px;font-size: 16px;line-height: 1.5;border: 1rpx solid #f2f2f2;border-radius: 15rpx;
}

.button{width: 360rpx;height: 80rpx;line-height: 80rpx;text-align: center;margin: auto;margin-top: 50rpx;border-radius: 8rpx;font-size: 32rpx;color: white;background-color: #497749!important;
} 

这时我们会发现中间的操作栏图标不显示,我们需要在 article.wxss 中头部引入 iconfont.wxss 字体图标。

@import "./assets/iconfont.wxss"; 

3. 实现编辑区操作栏的功能

本文只实现操作栏的功能,实现富文本编辑,其他文章类型的选择,请自行实现,不难哦!

首先,我们需要获取富文本编辑器实例 EditorContext,通过 wx.createSelectorQuery 获取,我们在页面 Page 函数中,创建 onEditorReady 函数,用于获取该实例:

 onEditorReady() {const that = thiswx.createSelectorQuery().select('#editor').context(function (res) {that.editorCtx = res.context}).exec()} 

然后将该方法绑定到富文本编辑器的 bindready 属性上,随着富文本编辑器初始化完成后触发,从而获取实例。

<editor id="editor" 
class="ql-container" 
placeholder="{{placeholder}}"showImgSize 
showImgToolbar 
showImgResize 
bindstatuschange="onStatusChange" 
read-only="{{readOnly}}" 
bindready="onEditorReady"> 

3.1. 实现文本加粗、斜体、文本下划线、左对齐、居中对齐、右对齐

我们如何修改文本的样式呢?

  • 通过 EditorContext 实例提供的APIEditorContext.format(string name, string value),进行样式修改。
  • name:CSS属性;value:值。

通过查阅微信小程序开发文档可知,实现上述功能,我们需要的 namevalue的值为:

那么我们如何通过点击按钮,来修改文本样式呢?

  • 首先我们在图标 <i> 标签上绑定namevalue 属性,填上图标所对应上图的 namevalue,无 value 的不填即可。
  • 然后在父标签上绑定事件 format,通过该事件函数,使用 EditorContext.format API 进行样式修改。
 <view class='toolbar' bindtap="format"><i class="iconfont icon-zitijiacudata-name="bold"></i><i class="iconfont icon-zitixieti data-name="italic"></i><i class="iconfont icon-zitixiahuaxiandata-name="underline"></i><i class="iconfont icon-zuoduiqidata-name="align" data-value="left"></i><i class="iconfont icon-juzhongduiqidata-name="align" data-value="center"></i><i class="iconfont icon-youduiqi data-name="align" data-value="right"></i></view> 

Page 函数中的 format 函数:

 format(e) {let {name,value} = e.target.datasetif (!name) returnthis.editorCtx.format(name, value)}, 

问题:当我们点击图标时,改变了文本样式,但是图标的样式没有改变,无法提示我们文本现在的样式状态,那该怎么解决呢?

  • 这时候我们就需要动态改变字体图标的样式了,比如点击图标后,改变颜色。

通过查阅 editor 微信小程序开发相关文档后,bindstatuschange 属性绑定的方法,会在当你通过 Context 方法改变编辑器内样式时触发,会返回选区已设置的样式。

那么我们可以在 data 中,添加 formats 对象,存储点击后的样式属性。然后在点击图标按钮时,通过 bindstatuschange 绑定的方法,得到已设置的样式存储到 formats 中;在模板渲染时,在<i>class 属性上,添加 {{formats.align === 'right' ? 'ql-active' : ''}}(如文本向右),当你点击了这个图标,那么 formats 中就有这个属性了,那么就添加我们的动态类名 ql-active 改变图标颜色。

具体实现

1.对 editor 标签属性 bindstatuschange 绑定方法 onStatusChange

<editor id="editor" 
class="ql-container" 
placeholder="{{placeholder}}"showImgSize showImgToolbar showImgResizebindstatuschange="onStatusChange" 
read-only="{{readOnly}}" 
bindready="onEditorReady"> 
 onStatusChange(e) {const formats = e.detailthis.setData({formats})} 

2.在图标 <i> 标签上,添加{{formats.align === 'right' ? 'ql-active' : ''}}

 <i class="iconfont icon-zitijiacu {{formats.bold ? 'ql-active' : ''}}" data-name="bold"></i><i class="iconfont icon-zitixieti {{formats.italic ? 'ql-active' : ''}}" data-name="italic"></i><i class="iconfont icon-zitixiahuaxian {{formats.underline ? 'ql-active' : ''}}" data-name="underline"></i><i class="iconfont icon-zuoduiqi {{formats.align === 'left' ? 'ql-active' : ''}}" data-name="align" data-value="left"></i><i class="iconfont icon-juzhongduiqi {{formats.align === 'center' ? 'ql-active' : ''}}" data-name="align" data-value="center"></i><i class="iconfont icon-youduiqi {{formats.align === 'right' ? 'ql-active' : ''}}" data-name="align" data-value="right"></i> 

3.在 article.wxss 添加 ql-active

.ql-active {color: #497749;
} 

3.2. 实现撤销、恢复、插入图片、删除操作

首先在 <i> 标签上绑定相应的事件:

 <i class="iconfont icon-undo" bindtap="undo"></i><i class="iconfont icon-redo" bindtap="redo"></i> <i class="iconfont icon-charutupian" bindtap="insertImage"></i><i class="iconfont icon-shanchu" bindtap="clear"></i> 

撤销 undo

调用 EditorContext API 即可

 undo() {this.editorCtx.undo()} 

恢复 redo

同理

 redo() {this.editorCtx.redo()} 

插入图片 insertImage

同理

 insertImage() {const that = thiswx.chooseImage({count: 1,success: function (res) {wx.showLoading({title: '正在上传图片',})wx.cloud.uploadFile({cloudPath: `news/upload/${time.formatTime(new Date)}/${Math.floor(Math.random() * 100000000)}.png`, // 上传至云端的路径filePath: res.tempFilePaths[0], success: cover => {that.editorCtx.insertImage({src: cover.fileID,data: {id: cover.fileID,role: 'god'},success: function () {wx.hideLoading()}})}})}})} 

清空 clear

同理

 clear() {this.editorCtx.clear({success: function (res) {console.log("clear success")}})} 

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【点下方卡片】免费领取:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序实战之实现富文本编辑器 的相关文章

  • 如何为python换源

    如何为python换源 一 创建C Users 你的用户名 AppData Roaming pip文件夹 二 在此文件夹下创建pip ini文件 三 在文件中写入 global index url https pypi tuna tsing
  • 多尺度可形变注意力机制MultiScaleDeformableAttn

    该机制来源于Deformable DETR中的技术 https zhuanlan zhihu com p 495941788 https zhuanlan zhihu com p 520666550 https blog csdn net
  • sql外键_SQL外键

    sql外键 When a database table is designed an important factor is to make sure that the table is scalable enough and is nor
  • [Err] 1054 - Unknown column ‘xxx‘ in ‘where clause‘ 异常报错

    Err 1054 Unknown column xxx in where clause 异常报错 1 第一种情况 2 第二种情况 3 第三种情况 在mysql查询语句时运行时 控制台经常会出现 Err 1054 Unknown column
  • CelebA人脸数据集

    CeleA是香港中文大学的开放数据 包含10177个名人身份的202599张图片 并且都做好了特征标记 这对人脸相关的训练是非常好用的数据集 官网链接 网盘链接 别看只是一堆人脸 他们很贴心地做好了特征标记 也就是说 你可以找到类似下面这些

随机推荐

  • python(1): subprocess子进程交互

    个人总结 有错欢迎指出 1 单纯使用popen调用外部程序 stdin write stdout read写入 读取 这两个方法都会等到子进程结束 原因 产生这种现象的原因也非常简单 就是标准输出和标准错误有一个缓存的概念 它不会立即将程序
  • OpenCV——彩色图像添加高斯噪声

    目录 一 高斯噪声 二 C 代码 三 python代码 四 结果展示 1 原始图像 2 添加高斯噪声 一 高斯噪声 高斯分布 也称正态分布 又称常态分布 记为 N 2
  • 尝试进行输出

    今天心看到的概念 学习 认知 我对这个观念有点疑问 不如说 学习和认知有很大练习 可以说我认为 学习是认知的一部分 因此 想要提高学习能力 就可以从提高认知能力入手 所以我去查了一下认知方面的书 把 认知天性 加入到了我的kindle里 费
  • 基于 OpenVINO™ 的 AI 视觉应用基础课学习笔记(一)人工智能发展

    第一讲是概述性的内容 人工智能发展 人工智能概述 人工智能 让机器的行为看起来就像是人所表现出的智能行为一样 图灵测试 一个人在不接触对方的情况下 通过一种特殊的方式 和对方进行一系列的问答 如果在相当长的时间里 他无法根据这些问题判断对方
  • R语言和医学统计学(10):正态性和方差齐性检验

    本文首发于公众号 医学和生信笔记 完美观看体验请至公众号查看本文 医学和生信笔记 专注R语言在临床医学中的使用 R语言数据分析和可视化 文章目录 前言 正态性检验 shapiro wilk检验 kolmogorov smimov检验 方差齐
  • 使用kali破解win7密码

    虚拟机密码忘了 修改启动顺序为CD 设置虚拟机光盘镜像为kali ISO 这里用的是kali 2017 2 开启按f2进入kali live 模式 fdisk l 查看磁盘分区 找到win7虚拟机所使用的磁盘 mount dev sda1
  • 以前的windows安装文件可以删除吗_C盘里的文件夹都有何用?可以删除吗?哪些可以删除?...

    众所周知 C盘里的文件不能随意动 特别重要 那么打开C盘 我们可以在根目录下看到一些特定的文件夹 这些文件夹是干嘛用的呢 里面放着什么东西 哪些可以删除呢 今天蝈蝈就来给大家谈谈这个问题 以下是文件夹名及其介绍 不同系统 不同用户C盘里的文
  • 初识冯诺依曼体系结构

    目录 1 冯诺依曼体系结构 2 冯诺依曼体系的原理 3 数据流向 4 冯诺依曼体系的意义 1 冯诺依曼体系结构 我们常见的计算机 如笔记本 我们不常见的计算机 如服务器 大部分都遵守冯诺依曼体系 1 输入单元 包括键盘 鼠标 扫描仪 写板等
  • .NET混淆器Dotfuscator怎样利用切除和水印保护应用程序?

    Dotfuscator是一个 NET的Obfuscator 它提供企业级的应用程序保护 大大降低了盗版 知识产权盗窃和篡改的风险 Dotfuscator的分层混淆 加密 水印 自动失效 防调试 防篡改 报警和防御技术 为世界各地成千上万的应
  • Html小知识点和sublime部分用法

    主要的开发工具 chrome sublime photoshop 二 web标准有三个标准组成 1 结构标准 结构用于对网页元素进行整理和分类 我们主要学的是HTML 2 表现标准 表现用于设置网页的版式 颜色 大小等外观样式 主要指的是c
  • metaq/rocketmq入门学习

    MetaQ是一款分布式 队列模型的消息中间件 基于发布订阅模式 有Push和Pull两种消费方式 支持严格的消息顺序 亿级别的堆积能力 支持消息回溯和多个维度的消息查询 metaq是rocketmq的开源版本 rocketmq的一些文档 h
  • 创建QT项目

    经过了令人苦恼的版本选择 然后又经历了IDE熟悉以及纯C 应用的创建 接下来终于进入了激动人心的时刻 开启第一个QT项目 使用创建向导创建QT项目 文件 gt 新建文件或项目 选择应用 窗口应用 根据自己的实际情况 配置项目名称和项目保存的
  • 画流程图都可以用哪些工具?

    在日常生活中 我相信我们很多人都看到过流程图 对于设计师来说 它还需要涉及流程图来反映用户的旅程和交互方式 那么你知道哪些流行的流程图设计软件呢 作为高级设计师 我今天推荐10款流程图设计软件 你可以和我一起读这篇文章 即时设计 即时设计是
  • uni-app 从零开始第三章:底部 tabBar

    pages json 页面路由 uni app官网 一 新建 home页面 找到pages目录 新增一个home的页面 勾选上同时新建文件夹 新建完成后 pages json 中 会自动添加上刚刚新建的文件信息 二 新增tabBar数据 在
  • Seaborn做图系列①——直方图&箱型图&散点图&变量关系图&回归图&热力图&条形图

    数据可视化系列汇总 Matplotlib可视化 二维图表绘制 折线图 直方图 散点图 条形图 箱形图 Matplotlib可视化 3D绘制散点图 曲面图 折线图 等高线图 Excel数据分析高级技巧 动态图表制作 offset vlooku
  • 26_Java判断String是否以某个字符串开头或结尾

    Java判断String是否以某个字符串开头 String mobile 8618730600000 System out println mobile startsWith 86 输出true System out println mob
  • VSCode+PHPstudy配置PHP开发环境

    第一步 下载安装VSCode编辑器 第二步 下载安装PHPstudy集成环境 第三步 打开PHPstudy 选择界面左侧中的环境 第四步 点击右侧PHP运行环境下面的更多 选择适合的PHP版本 第五步 点击PHPstudy左侧环境 再点击右
  • 基于 Docker 来安装 FastDFS

    文章目录 百度百科 FastDFS 简介 FastDFS 存储策略 上传交互过程 下载交互过程 FastDFS的文件同步 FastDFS 为什么要结合 Nginx 其他资源 FastDFS 安装 环境准备 创建工作目录 docker com
  • Qt 自定义颜色下拉控件

    效果 其实 在这里之前看了许多自定义颜色控件 有的是采用继承QPushButton 点击后 直接弹出 QColorDialog 然后重写 paintEvent 函数 绘制背景为选中的颜色 但是 没有下拉选择颜色的感觉 也有的继承 QComb
  • 微信小程序实战之实现富文本编辑器

    前言 这是我参加掘金启航计划的第三篇文章 这次总结的是实现一个简单的富文本编辑器 相信阅读文章后 观众老爷们 能够实现富文本编辑器 在微信小程序中发布自己的文章 希望观众老爷们多多支持 1 实现效果 实现的效果如下图 1 文本加粗 斜体 下