微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

news2025/1/18 7:31:56

 

  <!--富文本接收的位置-->
  <view class="white-box">
    <view class="title">
      <view class="yellow-fence"></view>
      <view class="v1">教研记录</view>
    </view>
    <view class="add-btn" bindtap="addRecords">添加新的教研记录</view>
    <view wx:for="{{records}}" class="rich-text-box" wx:key="index">
      <!-- <mp-html content="{{item}}" selectable="true" show-img-menu="true" /> -->
      <rich-text nodes="{{item}}" data-index="{{index}}" bindtap="echoRecordsData"></rich-text>
    </view>
  </view>

  <view class="white-box">
    <view class="title">
      <view class="yellow-fence"></view>
      <view class="v1">研究成果</view>
    </view>
    <view class="add-btn" bindtap="addAchievement">添加研究成果说明</view>
    <view wx:for="{{achievement}}" class="rich-text-box" wx:key="index">
      <!-- <mp-html content="{{item}}" selectable="true" show-img-menu="true" /> -->
      <rich-text nodes="{{item}}" data-index="{{index}}" bindtap="echoAchievementData"></rich-text>
    </view>
  </view>

以上是富文本的值返回接收的地方 下面是富文本的html

  <!--富文本编辑器弹窗-->
  <view class="container" style="height:100vh;" wx:if="{{showEidter}}">
    <view class="save-box">
      <view class="v1" bindtap="cancelEidter">取消</view>
      <view class="v2" bindtap="saveEditer">确定</view>
    </view>
    <editor id="editor" class="ql-container" placeholder="{{placeholder}}" bindstatuschange="onStatusChange" bindready="onEditorReady" bindfocus="onFocus" bindinput="onBlur">
    </editor>
    <view class="toolbar" catchtouchend="format">
      <i class="iconfont icon-charutupian" catchtouchend="insertImage"></i>
      <i class="iconfont icon-format-header-2 {{formats.header === 2 ? 'ql-active' : ''}}" data-name="header" data-value="{{2}}"></i>
      <i class="iconfont icon-format-header-3 {{formats.header === 3 ? 'ql-active' : ''}}" data-name="header" data-value="{{3}}"></i>
      <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--checklist" data-name="list" data-value="check"></i>
      <i class="iconfont icon-youxupailie {{formats.list === 'ordered' ? 'ql-active' : ''}}" data-name="list" data-value="ordered"></i>
      <i class="iconfont icon-wuxupailie {{formats.list === 'bullet' ? 'ql-active' : ''}}" data-name="list" data-value="bullet"></i>
    </view>
  </view>
Page({
  data: {
    /*富文本-start*/
    formats: {},
    readOnly: false,
    placeholder: '开始输入...',
    isClickImg: false,

    records: [], //教研记录列表    
    isRecordsEidt: false, //是否编辑的是教研记录
    recordsEidtIndex: null, //教研记录编辑的是哪一条

    achievement: [], //研究成果列表
    isAchievementEidt: false, //是否编辑的是研究成果
    achievementEidtIndex: null, //研究成果编辑的是哪一条

    showEidter: false,
    editData: '',
    /*富文本-end*/    
  },

  onLoad(options) {},

  /*富文本编辑器-start*/
  //编辑教研记录列表
  echoRecordsData(e) {
    const that = this
    let oidx = e.currentTarget.dataset.index
    this.setData({
      isRecordsEidt: true,
      showEidter: true,
      recordsEidtIndex: oidx,

      isAchievementEidt: false, //是否编辑的是研究成果
      achievementEidtIndex: null, //研究成果编辑的是哪一条
    })
    //console.log(that.data.records[oidx])
    // 修改时,反显数据
    this.createSelectorQuery().select("#editor")
      .context((res) => {
        res.context.setContents({
          html: that.data.records[oidx],
        });
      })
      .exec();
  },
  echoAchievementData(e) {
    const that = this
    let oidx = e.currentTarget.dataset.index
    this.setData({
      isAchievementEidt: true,
      showEidter: true,
      achievementEidtIndex: oidx,

      isRecordsEidt: false, //是否编辑的是教研记录
      recordsEidtIndex: null, //教研记录编辑的是哪一条
    })
    //console.log(that.data.records[oidx])
    // 修改时,反显数据
    this.createSelectorQuery().select("#editor")
      .context((res) => {
        res.context.setContents({
          html: that.data.achievement[oidx],
        });
      })
      .exec();
  },
  //重置
  cancelEidter() {
    this.setData({
      isRecordsEidt: false,
      showEidter: false,
      recordsEidtIndex: null,
      isAchievementEidt: false,
      achievementEidtIndex: null,
      editData: ''
    })
  },
  saveEditer() {
    //如果是教研记录新增
    let recordsEidtIndex = this.data.recordsEidtIndex
    let achievementEidtIndex = this.data.achievementEidtIndex
    if (this.data.isRecordsEidt) {
      let odata = this.data.records
      if (recordsEidtIndex || recordsEidtIndex === 0) {
        //编辑
        odata[recordsEidtIndex] = this.data.editData
      } else {
        //新增
        odata.push(this.data.editData)
      }
      this.setData({
        records: odata
      })
      //console.log(this.data.records)
      this.cancelEidter()
    } else if (this.data.isAchievementEidt || achievementEidtIndex === 0) {
      let odata = this.data.achievement
      if (achievementEidtIndex) {
        //编辑
        odata[achievementEidtIndex] = this.data.editData
      } else {
        //新增
        odata.push(this.data.editData)
      }
      this.setData({
        achievement: odata
      })
      //console.log(this.data.records)
      this.cancelEidter()
    }
  },

  addRecords() {
    this.setData({
      isRecordsEidt: true,
      showEidter: true
    })
  },
  addAchievement() {
    this.setData({
      isAchievementEidt: true,
      showEidter: true
    })
  },
  readOnlyChange() {
    this.setData({
      readOnly: !this.data.readOnly
    })
  },

  onEditorReady() {
    const that = this
    wx.createSelectorQuery().select('#editor').context(function (res) {
      //console.log(res)
      if (res.context) {
        that.editorCtx = res.context
      }
    }).exec()
  },
  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.setData({
      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() {
    this.setData({
      isClickImg: true
    })
    const that = this
    wx.chooseImage({
      count: 1,
      success: function (res) {
        that.editorCtx.insertImage({
          src: res.tempFilePaths[0],
          data: {
            id: 'abcd',
            role: 'god'
          },
          width: '80%',
          success: function () {
            console.log('insert image success')
          }
        })
      }
    })
  },
  onFocus() {
    this.setData({
      isClickImg: false
    })
  },
  onBlur(e) {
    //console.log(this.data.isClickImg)
    //防止上传的图片直接失焦 保存内容的问题    
    if (!this.data.isClickImg) {
      //console.log(e.detail.html)
      this.setData({
        editData: e.detail.html
      })
    }
    //this.oneEditor.blur()
  },
  /*富文本编辑器-end*/
  
})
/*富文本编辑器-start*/
.container {
  position: fixed; 
  top: 0; 
  right: 0;
  bottom: 0;
  left: 0; 
  z-index: 999;  
  display: flex;
  flex-direction: column;
  background: #fff;
}
.ql-container {
  flex: 1;
  padding: 10px 10px 50px 10px;
  box-sizing: border-box;
  font-size: 16px;
  line-height: 1.5;
}

.ql-active {
  color: #22C704;
}

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

.toolbar {
  position: fixed;
  left: 0;
  right: 100%;
  bottom: 0;
  padding: 0 10px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  height: 50px;  
  box-sizing: border-box;    
  background: #fff;
  border-top: 1rpx solid #f2f2f2;
}
.save-box{ margin: 10rpx 10rpx 0 0; display: flex; justify-content: flex-end;}
.save-box .v1,.save-box .v2{ font-size: 28rpx; width: 100rpx; height: 60rpx; text-align: center; line-height: 60rpx; border-radius: 12rpx;}
.save-box .v1{ margin-right: 10rpx; background: #ddd; color: #fff;}
.save-box .v2{ background: #ffb81c; color: #fff;}
.rich-text-box{ margin-bottom: 20rpx;}
/*富文本编辑器-end*/

记录一下使用方法 也可以参考一下怎么使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言基础知识——结构体和共用体

1. 结构体 1.1 初识结构体 C语言的结构体是一种自定义的 数据类型&#xff0c;它允许你将不同类型的数据组合在一起&#xff0c;形成一个新的数据类型&#xff0c;以便更方便地管理和操作这些数据。结构体可以包含多个成员&#xff08;也称为字段或属性&#xff09;&#xff0…

使命、愿景、价值观到底有什么区别

以前的企业都是在发展到一定成熟阶段&#xff0c;才开始考虑这三个问题。但今天人们越来越多的意识到&#xff0c;哪怕在企业发展的初期&#xff0c;对于创业企业来说&#xff0c;确定公司的使命、愿景和核心价值观也是非常重要的。 明确的使命、愿景和核心价值观对于企业的好…

搭建k8s集群!!!

注意 k8s集群第一次搭建的话是麻烦且又繁琐的,大家不要着急,静下心来,一步一步搭建即可 linux网关及虚拟机下载不会弄的问题请详细看 linux的搭建及网关配置 这篇文章【也在此专栏】 环境规划 硬件环境 cpu 至少2核 内存 至少3G 硬盘 至少40G 软件环境 操作…

从录取成绩的角度来看,浙大MPA面试的客观公正性是有一定依据的

时间即将来到八月份&#xff01;不知道目前考生们今年的备考情况怎么样了&#xff0c;度过比较煎熬的三伏天&#xff0c;距离考研冲刺的时间越来越近&#xff01; 提前批面试申请对于不同的项目以及不同的考生意义都不一样。比如真正的学霸人物对于提面的申请与不申请一般差别不…

自建HTTP代理池的四大优势

对于爬虫技术人员来说&#xff0c;使用http代理ip可以解决网页访问受限的问题。有人会直接购买成品的HTTP代理池&#xff0c;也有很多人会自己搭建http代理ip进行使用&#xff0c;自建HTTP代理池具有许多特点&#xff0c;为爬虫技术人员提供了有别于使用第三方代理服务的优势。…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Unity 引擎做残影效果——2、屏幕后处理方式

Unity实现残影效果 大家好&#xff0c;我是阿赵。 这里继续介绍Unity里面做残影的方法。之前介绍了BakeMesh的方法做残影&#xff0c;这一期介绍的是用屏幕后处理的方法做残影。 一、原理 之前的BakeMesh方法&#xff0c;是真的生成了很多个网格模型在场景里面。如果用后处理做…

Linux学习之周期性计划任务cron和crontab

crontab -e可以编辑周期性计划任务。在使用此命令编辑的时候&#xff0c;需要要注意每一行有六个字段&#xff0c;使用空格或者Tab键进行隔开&#xff1a; Min Hour Day Month Day_Week commandToExecute - - - - - | | | | | | | | | --…

optee支持哪些密码学算法

GP规范强制要求 GP规范定义可选实现的 optee os实现的 参考:optee_os-3.20.0/lib/libutee/include/tee_api_defines.h 206 /* Algorithm Identifiers */ 207 #define TEE_ALG_AES_ECB_NOPAD 0x10000010 208 #define TEE_ALG_AES_CBC_NOPAD

【面试题】位图

文章目录 位图如何添加数据如何删除数据代码实现给100亿个整数&#xff0c;如何找到只出现一次的数字代码实现给两个文件&#xff0c;分别有100亿个整数&#xff0c;但只有1g内存&#xff0c;如何找到文件的交集&#xff1f;1个文件有100亿个int&#xff0c;1G内存&#xff0c;…

如何使用ArcGIS Pro制作建筑立体效果

虽然ArcGIS Pro已经将二三维场景融合于一个软件之中&#xff0c;但是在某些使用场景下&#xff0c;我们只需要看到建筑的立体效果就行&#xff0c;不用实际的三维建筑效果&#xff0c;毕竟三维的效果对硬件的要求更高&#xff0c;地图的加载效率也没有二维好&#xff0c;所以这…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板6

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

住宅小区门禁管理,居然还能这样做!

安全是我们生活中最重要的一环。而在现代社会&#xff0c;门禁监控系统成为了保障居民安全的重要措施之一。 门禁系统利用先进的人脸识别技术&#xff0c;为小区居民带来了更高效、更安全的出入管理体验&#xff0c;更为居民创造了便捷、智能的生活方式。 客户案例 东莞市某花…

Flask项目打包为exe(附带项目资源,静态文件)

1.在项目根目录创建my_app.spec文件&#xff0c;内容如下&#xff1a; # -*- mode: python ; coding: utf-8 -*-block_cipher Nonea Analysis([server.py], # flask入口pathex[],binaries[], datas[("E:/**/templates","/templates"),("E:/**/s…

SpringBoot3 整合Prometheus + Grafana

通过Prometheus Grafana对线上应用进行观测、监控、预警… 健康状况【组件状态、存活状态】Health运行指标【cpu、内存、垃圾回收、吞吐量、响应成功率…】Metrics… 1. SpringBoot Actuator 1. 基本使用 1. 场景引入 <dependency><groupId>org.springframew…

大数据之Hadoop(一)

目录 一、准备三台服务器 二、虚拟机间配置免密登录 三、安装JDK 四、关闭防火墙 五、关闭安全模块SELinux 六、修改时区和自动时间同步 一、准备三台服务器 我们先准备三台服务器&#xff0c;可以通过虚拟机的方式创建&#xff0c;也可以选择云服务器。 关于如何创建虚…

fatal error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译

问题 默认情况下&#xff0c;对象文件最多可存放 65,536 (2^16) 个可寻址的节。 /bigobj将该地址容量增加至 4,294,967,296 (2^32)。大多数模块将从来不会生成包含数超过 65,536 的 .obj 文件。 但是&#xff0c;计算机生成的代码或大量使用模板库的代码可能需要可存放更多节的…

python爬虫(五)_urllib2:Get请求和Post请求

本篇将介绍urllib2的Get和Post方法&#xff0c;更多内容请参考:python学习指南 urllib2默认只支持HTTP/HTTPS的GET和POST方法 urllib.urlencode() urllib和urllib2都是接受URL请求的相关参数&#xff0c;但是提供了不同的功能。两个最显著的不同如下&#xff1a; urllib仅可以…

人工智能技术

目录 1.什么是人工智能 2.人工智能的由来 3.人工智能的代表作 4.人工智能给人类带来的福利 1.什么是人工智能 人工智能 (Artificial Intelligence, AI) 是一门研究计算机如何模拟、模仿以及执行人类智能活动的科学与技术领域。它涉及了构建智能代理体系&#xff0c;使其能够…

电脑怎么设置密码?简单4招,轻松给电脑上锁!

“新买了部电脑&#xff0c;最近在使用时保存了一些比较重要的文件&#xff0c;想给电脑设置个密码以防文件泄露。电脑怎么设置密码呢&#xff1f;求答案&#xff01;” 电脑对我们的生活越来越重要&#xff0c;我们会将很多重要的文件数据等都保存在电脑中。如果电脑没有设置密…