uniapp 给 editor 添加简单的工具栏

前言:开发App时遇到富文本编辑,我首先的思路在uniapp官网找一下,确实官网给提供了内置组件editor。相信测试过案例时,都会发现没有工具栏。我也想如果有现成可以直接使用该多好,不过插件市场用起来也比方便,更不利于理解,所以自己写一个简单的工具栏。

注意:不要在editor的同级元素设置固定高度(用flex或padding或margin),会导致editor内容不自动向上弹起,键盘输入时看不到光标位置。

一、效果图:真机调试的时候,HBuilderX 3.7.3

实现基础功能

粗体、标题(1,2)、字体颜色、数字列表、圆点列表、勾选列表

二、代码如下

解决问题思想:

(1)重点放在editor功能上,关于图标引入先忽略,我直接用button按钮来代替。

(2)分步解决该问题,简化问题本身难度

<template>
    <view class="box">
        <view class="toolbar">
            <button @click="handleInsertImage">插入图片</button>
            <button @click="handleSetBlod">粗体</button>
            <button @click="handleSetHeader('H1')">h1</button>
            <button @click="handleSetHeader('H2')">h2</button>
            <button @click="handlePreviousStep">撤销</button>
            <button @click="handleNextStep">恢复</button>
            <button @click="handleSetColor">字体颜色</button>
            <button @click="handleList('ordered')">数字列表</button>
            <button @click="handleList('bullet')">圆点列表</button>
            <button @click="handleList('check')">勾选列表</button>
        </view>
        <editor id="editor" class="ql-container container" placeholder="开始输入..." @ready="onEditorReady"></editor>
    </view>
</template>

<script setup>
    import {ref,reactive} from "vue";
    import {onNavigationBarButtonTap} from '@dcloudio/uni-app';
    let editorCtx;
    const onEditorReady = ()=>{
        // #ifdef APP-PLUS || H5 ||MP-WEIXIN
        uni.createSelectorQuery().select('#editor').context((res) => {
          editorCtx = reactive(res.context);
        }).exec()
        // #endif
    }
    //插入图片
    const handleInsertImage = ()=>{
        uni.chooseImage({
            count: 1, //插图图片数量
            sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
            sourceType: ['album','camera'],       //从相册选择和拍照
            success: function (res) {
                //获得插入图片的临时路径(提交前,要将临时路径更换为网络路径)
                let imageSrc = res.tempFilePaths[0]; 
                editorCtx.insertImage({
                    src: imageSrc,
                    width: "100%",
                    height: "100%",
                    success: function(res){
                        console.log("成功插入图片");
                    },
                    fail: function(res){
                        console.log("插入图片失败");
                    }
                });
            }
        });    
    }
    //设置粗体
    const handleSetBlod = ()=>{
        editorCtx.format("bold");
    }
    //设置标题
    const handleSetHeader = (value)=>{
        editorCtx.format("header",value);
    }
    //设置颜色
    const handleSetColor = ()=>{
        editorCtx.format("color","red");
    }
    //设置list
    const handleList = (value)=>{
        editorCtx.format("list",value);
    }
    //撤销上一步
    const handlePreviousStep = ()=>{
        editorCtx.undo()
    }
    //恢复上一步
    const handleNextStep = ()=>{
        editorCtx.redo();
    }
    
    //点击完成时,提交内容
    onNavigationBarButtonTap(()=>{
        //第一,提交图片,将网络路径拿回来(tempSrc假设为拿回来的网络路径)
        let tempSrc = "https://img2.baidu.com/it/u=1010328615,2032873142&fm=253&fmt=auto&app=120&f=JPEG?w=1200&h=790";
        editorCtx.getContents({
            success: function(res){
                console.log(res);
                let contentArr = res.delta.ops;
                contentArr.forEach((item)=>{
                    if(item.insert.image){
                        item.insert.image = tempSrc;
                    }
                })
                console.log("重新看一下");
                console.log(res);
                editorCtx.setContents({
                    delta: res.delta,
                    success: function(res){
                        console.log("设置完成");
                    }
                });
            }
        });
    })
    
</script>

<style scoped lang="scss">
    .box{
        width: 100vw;
        height: 100vh;
        display: flex;
        flex: 1;
        flex-direction: column;
        background-color: #F0EFF4;
        .toolbar{
            // background-color: #F0EFF4;
            padding: 0 $teng-padding;
            display: flex;
            flex-wrap: wrap;
            padding-top: 16rpx;
            button{
                min-width: 96rpx;
                font-size: 28rpx;
                margin-bottom: 16rpx;
            }
        }
        .container {
            display: flex;
            flex: 0.97;
            background-color: #fff;
            padding: 0 $teng-padding;
            padding-top: 8rpx;
        }
    }
    
</style>

三、注意

关于插入的图片路径替换为网络路径的逻辑思路 ?

https://blog.csdn.net/tengyuxin/article/details/131765670

我写的另一篇文章

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 如果在使用UniApp编辑器时工具栏不显示,可能有几种可能的原因: 1. 工具栏已被隐藏:请检查您的编辑器是否已将工具栏隐藏。您可以尝试通过菜单栏中的“视图”选项来显示或隐藏工具栏。 2. 编辑器版本问题:确保您正在使用最新版本的UniApp编辑器。如果您的编辑器版本太旧,可能会导致某些功能不正常。 3. 插件冲突:如果您在编辑器中安装了其他插件,这些插件可能会与UniApp编辑器产生冲突。您可以尝试在禁用插件的情况下重新启动编辑器,以查看是否可以解决问题。 4. 屏幕分辨率问题:如果您的屏幕分辨率太低,可能会导致工具栏无法正常显示。您可以尝试将编辑器窗口的大小调整为更小,以查看是否可以解决问题。 如果以上方法都无法解决问题,建议您尝试重新安装UniApp编辑器,或者联系UniApp官方支持团队以获取更多帮助。 ### 回答2: UniApp是一种跨平台的开发框架,可以用来开发iOS、Android和Web应用程序。UniApp提供了一个编辑器工具栏,用于快速编写和调试代码。 如果UniApp编辑器工具栏不显示,可能有以下几个原因: 1. 检查插件是否已正确安装:在UniApp的插件市场中搜索并安装相应的编辑器插件,例如“uni-app vscode”或“uni-app WebStorm”,确保插件已正确安装并启用。 2. 检查编辑器设置:在编辑器的“首选项”或“设置”中,检查UniApp相关的设置选项。确保工具栏显示选项被启用,并确保其他相关的设置项正确配置。 3. 检查UniApp版本:确保使用的UniApp版本与编辑器插件版本兼容。如果插件版本过旧或过新,可能会导致工具栏无法正常显示。 4. 检查编辑器的UI布局:有些编辑器可能隐藏了工具栏,默认情况下可能需要手动展开或启用工具栏。检查编辑器的UI布局选项,确保工具栏不是被隐藏或禁用了。 如果以上方法都无效,可以尝试重新安装UniApp编辑器插件或更换编辑器,确保插件和编辑器的兼容性。如果问题仍然存在,可以在UniApp的官方论坛或社区中寻求帮助,向开发者和其他用户咨询或报告该问题,以获取更多的支持和解决方案。 ### 回答3: 如果在使用uniapp的编辑器时,工具栏不显示的话,可能是由于以下几个原因: 1. 版本不兼容:请确保你使用的uniapp编辑器版本与你当前使用的uniapp项目版本兼容。如果不兼容,可以尝试升级编辑器或降级项目版本。 2. 插件冲突:有时候,其他插件可能会与uniapp编辑器中的工具栏插件产生冲突。你可以尝试在编辑器中禁用其他插件,然后重新启动编辑器,看看是否能够解决问题。 3. 配置问题:检查一下你的工具栏配置是否正确。在uniapp编辑器中,你可以通过点击菜单栏的“视图”选项,然后选择“工具栏”来打开工具栏。如果工具栏仍然没有显示,可能是配置文件中的问题。你可以尝试删除工具栏的配置文件,然后重新启动编辑器,让它重新生成工具栏。 4. 硬件问题:有时候,一些硬件问题也可能导致工具栏不显示。你可以尝试重新连接你的硬件设备,或者尝试在另一台设备上打开编辑器,看看是否能够解决问题。 总之,如果uniapp编辑器的工具栏不显示,你可以首先确定版本兼容性和插件冲突的问题,然后检查配置文件,最后排除硬件问题。希望以上解答能够帮到你!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tengyuxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值