微信小程序开发笔记—记事本

简介: 本文介绍了如何实现记事本功能,有全部代码、详细设计思路以及踩坑点。


🎀 文章作者:二土电子
🐸 期待大家一起学习交流!


一、前言

其实在一开始本人就想做一个类似日记本的功能,但是碍于最开始能力有限,而且发现上网搜索到的一些相关资料较少,看到做有其他博主做,但是使用的云开发,本人暂时只想做一个简单的无后台的,所以没有参考。其次也搜到一些其他内容,真的是看了超多文章,这里贴出个人觉得帮助最大的文章记事本vx小程序,虽然博主只做了一些简单的功能,并未完善,但是却给了我一个知之甚少的初学者一个实现思路。

二、实现效果

按照惯例,先贴实现效果,目前只有添加日记和删除的功能,也像之前的天气功能一样,是通过主页点击图标进入,点击图标跳转具体如何实现可以看天气获取显示的文章,当然这里下面也会介绍一种新的跳转方式,放在下面说啦。

eaa5d232536995905af88576dd228d7d_80cff78340324eaa80144de4ae3c0334.png

点击上图图标即可进入记事本功能主页面。

358c21c9f2bf3c272eabf5be9031b5cb_1f7fb5bfb1fe4b7888b89879cfab7832.png

1、添加日记

点击“+”可以进入日记编辑页面,添加日记。

a3cdf4cc6dfef331284c91f03a3736c7_3bf4c03ecad54e33a83ef3b3dfc47d03.png

2、保存日记

点击保存心情后会自动将输入内容保存下来,然后跳转回记事本功能主页面,并且会显示已经添加过的日记。

11b8671eeb64297ab0e896ffb5f9e356_e52d7d265336458299d626627b21bee8.png

3、查看日记详情

点击对应日记可以进入详情页。

8011864bb9eef15a2613d8b2a5d18119_a5a53b1b7f7a440988b7e33ebcbae2fe.png

4、删除日记

长按选中日记可以删除。

059182edd73a591ca10325b02f4c7ab1_1b62e4c356374842b582f37d8b88fe20.png

三、程序实现

还是按照惯例,先上代码,这里把所有代码都贴出来了,希望大家可以点个赞和收藏哟。

1、日记主页面程序

1.1、.wxml文件

<!-- 背景图片 -->
<!-- 放在最上面,否则无法显示 -->
<!-- 加本地背景图片容易导致代码包大小超限,可以选择网络图片 -->
<image class="bg-image" mode="scaleToFill" src="https://img.zmtc.com/2019/0805/20190805044036603.jpg"></image>

<!--底部滚动-->
<scroll-view class="des-scr" scroll-y="true">
  <!--循环显示所有日记内容-->
  <block wx:for="{
    
    {totalDiaryConcent}}">
  <!-- 利用data-将当前的索引传递到删除或者打开详情的函数 -->
      <view class="des-view" bindtap="diary_detail" bindlongtap="delet" data-content="{
    
    {item}}" data-saveid="{
    
    {index}}">
        <text class="des-text">{
    
    {
    
    item.des}}</text>
        <text class="des-tiemText">{
    
    {
    
    index + 1}}</text>
      </view>
    <!-- </navigator> -->
  </block>
</scroll-view>

<!--添加按钮-->
<navigator url="../lin_diary_add/lin_diary_add">
    <button class="new-btn" 
    style="width: 220rpx; height: 93rpx; display: block; box-sizing: border-box; left: 466rpx; top: 1171rpx; position: absolute">+</button>
</navigator>

1.2、.wxss文件


page{
  height: 100%;
}

.des-image{
  position:absolute;
  width: 100%;
  height: 100%;
}

.des-scr{
  width: 100%;
  height:100%;
}

.des-view{
  margin: 5%;
  width: 90%;
  height: 180rpx;
  border:1px solid #fff;
  color: #8B4513;
}

.des-text{
    display: block;
    margin:20rpx;
    height: 80rpx;
    overflow: hidden;
}

.des-tiemText{
  display: block;
  margin-right: 20rpx;
  margin-bottom: 20rpx; 
  height: 40rpx;
  text-align: right;
}

.new-btn{
  width: 245rpx; 
  height: 97rpx; 
  display: block; 
  box-sizing: border-box; 
  left: 400rpx; 
  top: 1169rpx; 
  position: absolute;
  background: #FFFAFA;
  color: #8B4513;
  border-radius: 100%;
  font-size: 50rpx;
  line-height:60rpx;
}

.bg-image{
  width: 100%;
  height: 100%;
  position: fixed;
  z-index: -1;
}

1.3、.ts文件

// index.ts
// 获取应用实例
const app = getApp<IAppOption>()

Page({
  data: {
    id: '',
    totalDiaryConcent: []   // 全部日记
  },
  // 全部日记显示
  onShow: function () {
    // 获取当前全部日记内容
    // 必须要新定义一个再赋值才能正常显示,原因未知
    var arryTemp = wx.getStorageSync('totalDiaryConcent');
    this.setData({
      totalDiaryConcent: arryTemp
    })
  },
  // 删除日记内容
  delet:function(e:any){
    // 进行作用域外部指向
    let that = this;
    wx.showModal({
      title: '温馨提示',
      content: '是否要删除这条日记?',
      // 点击确定后删除掉对应缓存
      success (res) {
        if (res.confirm) {
          // 获取传递过来的索引
          var curId = e.currentTarget.dataset.saveid;
          // 获取全部日记内容
          var arryTemp = wx.getStorageSync('totalDiaryConcent');
          // 设置一个新的数组
          var newDiaryContent = [];
          // 利用for循环将不需要删除的存储起来
          for (var i = 0;i < arryTemp.length;i ++) {
            if (i != curId) {
              newDiaryContent.push(arryTemp[i])
            }
          }
          // 重新更新全部日记内容,其中不包含要删除的日记
          // 一定注意这里不要将新的日记内容用单引号引起来,否则会出现删除一条日记后冒出来很多条空日记
          // 而且之后也不能再添加新日记
          wx.setStorageSync('totalDiaryConcent',newDiaryContent);
        }
        // 利用onShow中同样的方法重新渲染页面
        var arryTemp = wx.getStorageSync('totalDiaryConcent');
        that.setData({
          totalDiaryConcent: arryTemp
        })
      }
    })
  },

  // 查看日记详情
  diary_detail:function(e:any){
    // 获取点击的日记的内容
    var item = e.currentTarget.dataset.content
    // 将点击到的日记的内容传递到下一个页面
    var url = '/pages/diary_detail/diary_detail?des=' + item.des
    wx.navigateTo({
      url: url,
    })
  },
})

2、添加日记页面程序

2.1、.wxml文件

<!--输入框-->
<view class="the-view">
  <!-- 输入长度默认限制为140,maxlength为-1时表示不限制最大长度 -->
  <textarea class= "the-textarea"  bindinput="getInputText" style="  margin: 5%;width: 90%;height: 90%" maxlength="-1">
  </textarea>
  <!-- 保存按钮 -->
  <button class="the-btn" bindtap="saveButton">保存心情</button>
</view>

2.2、.wxss文件

.the-text{
  position:absolute;
  left: 5%;
  top: 3.5%;
  font-size: 28rpx;
  text-align: left;
}

.the-btn{
  font-size: 32rpx;
  text-align: center;
  line-height:54rpx;
  height: 80rpx;
  width: 3%;
  bottom: -6%;
  background: #fedcbd;
  color: #8B4513;
}

.the-view{
  position:absolute;
  width: 100%;
  height: 90%;
  background-color: #feeeed;
}

.the-textarea{
  overflow:hidden;
}

2.3、.ts文件

// logs.ts
// const util = require('../../utils/util.js')

Page({
  data: {
    inputText: '',   // 存储输入内容
    diaryid: ''
  },

  // 文字输入框
  getInputText(e:any) {
    //记录输入的文字   
    this.setData({
      inputText: e.detail.value
    })
  },

  // 保存按钮
  saveButton() {
    // 如果输入是空
    if (this.data.inputText.length == 0) {
      return;
    }
    // 输入内容不为空
    else {
      // 获取本地缓存的之前的所有日记内容
      var diaryContent = wx.getStorageSync('totalDiaryConcent');

      // 如果之前有日记内容
      if (diaryContent != null && diaryContent != '') {
        // 获取当前日记总条数
        var curTotalNum = wx.getStorageSync('totalDiaryNum');
        // 日记总条数加1作为下一条日记id
        var nextDiaryId = curTotalNum + 1;
        // 添加新日记,id为之前日记总条数加1
        diaryContent.push({ 'des': this.data.inputText, 'diaryid': nextDiaryId });
        // 存储新日记总条数
        wx.setStorageSync('totalDiaryNum', 'nextDiaryId');
      }
      // 之前没有日记内容,是第一条日记
      else {
        diaryContent = [{ 'des': this.data.inputText, 'diaryid': 0 }];
        // 保存第一条日记
        wx.setStorageSync('totalDiaryNum', '0');
        this.setData({
          id: '0'
        })
      }
    }
    // 将输入内容存入缓存
    wx.setStorageSync('totalDiaryConcent', diaryContent);
    // 跳转回上一页面
    wx.navigateBack({
    })
  },
})

3、日记详情页页面程序

3.1、.wxml文件

<view class="diary-detail">
    <text>{
    
    {
    
    showContent}}</text>
</view>

3.2、.wxss文件

.diary-detail{
    font-size: large;
    color: #8B4513;
    /* 多文本自动换行 */
    word-break:break-all;
}

3.3、.ts文件

// pages/diary_detail/diary_detail.ts
Page({

  /**
   * 页面的初始数据
   */
  data: {
  },

  /**
   * 生命周期函数--监听页面加载
   * 获取点击的日记内容
   */
  onLoad(options) {
    this.setData({
      showContent: options.des
    })
  }
})

四、详细设计

1、添加日记

1.1、获取输入文字

获取输入文字较为简单,这里在添加日记页面用了一个textarea组件,大家可以到微信开放文档查看关于textarea的详细介绍。给这个组件绑定一个函数用来获取输入文字内容,方法也比较简单,.ts文件中这部分的程序如下:

// 文字输入框
  getInputText(e:any) {
    //记录输入的文字   
    this.setData({
      inputText: e.detail.value
    })
  },

但是需要注意的是,在textarea的属性中要配置maxlength为-1,否则会发现文本输入框只能输入140个字符内容就不能再输入了。

1.2、保存输入内容

由于未使用云开发等功能,不具备后台,所以输入的全部内容只能保存在本地缓存中。这里本的缓存中共有两部分内容,分别是totalDiaryConcent:全部日记内容和totalDiaryNum全部日记条数。

// 如果输入是空
    if (this.data.inputText.length == 0) {
      return;
    }

当编辑完日记点击保存时,会先检测输入内容的长度,如果是0,则说明未输入内容,不会保存跳转。如果检测到有输入内容,则会将本地缓存中全部的日记内容提取出来,方法也比较简单,利用wx.getStorageSync实现,具体可以到微信开发文档查找,这里就不再贴出链接了。

提取出全部本地缓存的日记内容后会检测是否为空,也就是是否还没有添加过日记,如果是就会新添加一条日记,ID为0。

 // 之前没有日记内容,是第一条日记
      else {
        diaryContent = [{ 'des': this.data.inputText, 'diaryid': 0 }];
        // 保存第一条日记
        wx.setStorageSync('totalDiaryNum', '0');
        this.setData({
          id: '0'
        })
      }

如果之前已经存在日记,则从本地缓存中提取出当前日记总条数,然后总条数加1作为当前日记ID存入缓存。

// 如果之前有日记内容
      if (diaryContent != null && diaryContent != '') {
        // 获取当前日记总条数
        var curTotalNum = wx.getStorageSync('totalDiaryNum');
        // 日记总条数加1作为下一条日记id
        var nextDiaryId = curTotalNum + 1;
        // 添加新日记,id为之前日记总条数加1
        diaryContent.push({ 'des': this.data.inputText, 'diaryid': nextDiaryId });
        // 存储新日记总条数
        wx.setStorageSync('totalDiaryNum', 'nextDiaryId');
      }

1.3、跳转回记事本主页面

这里用wx.navigateBack实现跳转回上一个页面,关于本函数的详细介绍大家移步微信开放文档,这个函数中不需要添加任何内容,默认跳转回上一页面。

wx.navigateBack({
    })

2、删除日记

2.1、弹出提示框

利用wx.showModal弹出提示框,询问是否要删除本条日记,点击确定会触发删除功能。整体框架如下

wx.showModal({
      title: '温馨提示',
      content: '是否要删除这条日记?',
      // 点击确定后删除掉对应缓存
      success (res) {
        if (res.confirm) {
        删除日记
      }
    })

2.2、删除日记功能

点击确定后会删除对应日记,这里有两个重点问题,首先是如何知道用户选择的是哪一条日记,其次是如何删除用户选择的日记。

首先说一下如何知道用户选择的哪一条日记。

这里利用data-将用户选中的日记ID传给.ts文件,具体可以参考一下这个大佬的文章微信小程序页面之间三种传值方式。程序如下

<!-- 利用data-将当前的索引传递到删除或者打开详情的函数 -->
      <view class="des-view" bindtap="diary_detail" bindlongtap="delet" data-content="{
    
    {item}}" data-saveid="{
    
    {index}}">
        <text class="des-text">{
    
    {
    
    item.des}}</text>
        <text class="des-tiemText">{
    
    {
    
    index + 1}}</text>
      </view>

其次说一下知道了用户想要删除哪一条日记之后如何将该条日记删除掉,这里用的方法个人觉得比较巧妙。定义一个新的数组,获取到传递过来的日记ID后利用for循环将除了想要删除的日记外的之前的本地缓存日记全部重新缓存到新的数组,然后缓存到本地缓存中。

// 获取传递过来的索引
          var curId = e.currentTarget.dataset.saveid;
          // 获取全部日记内容
          var arryTemp = wx.getStorageSync('totalDiaryConcent');
          // 设置一个新的数组
          var newDiaryContent = [];
          // 利用for循环将不需要删除的存储起来
          for (var i = 0;i < arryTemp.length;i ++) {
            if (i != curId) {
              newDiaryContent.push(arryTemp[i])
            }
          }
          // 重新更新全部日记内容,其中不包含要删除的日记
          // 一定注意这里不要将新的日记内容用单引号引起来,否则会出现删除一条日记后冒出来很多条空日记
          // 而且之后也不能再添加新日记
          wx.setStorageSync('totalDiaryConcent',newDiaryContent);

但是需要注意的是,这样虽然在本地缓存中删除了想要删除的日记,但是会发现主页面中它并没有消失,此时需要我们在删除完成后重新渲染一次页面。

// 利用onShow中同样的方法重新渲染页面
        var arryTemp = wx.getStorageSync('totalDiaryConcent');
        that.setData({
          totalDiaryConcent: arryTemp
        })

但是直接写上面的代码会发现会报错,这里需要进行作用域的外部指向,也就是在函数一开始加一句

let that = this;

关于这部分内容大家可以看一下这篇大佬的文章小程序 wx.showModal 点击确定刷新页面

3、日记详情显示

日记详情显示较为简单,需要解决的问题主要有两个,一个是如何确定用户想要查看的是哪条日记内容,这个在删除日记中已经解决。第二个就是如何将用户想要查看的日记详情显示出来,这里说白了就是如何实现页面间的传值,将获取到的日记内容从主页传递到详情页,具体可以看一下这篇大佬的文章微信小程序页面之间三种传值方式

获取到日记详情内容后只需要把它渲染到页面就好啦。

这里需要注意的是,如果不在.wxss文件中添加自动换行代码,渲染到页面的日记详情内容会是一长条

.diary-detail{
    font-size: large;
    color: #8B4513;
    /* 多文本自动换行 */
    word-break:break-all;
}

五、总结

至此关于微信小程序记事本的功能介绍以及实现已经结束啦,这里简单总结一下后续优化方向,主要有两条:1、添加日记时间;2、添加后台存储。

相关文章
|
15天前
|
人工智能 小程序
【一步步开发AI运动小程序】十五、AI运动识别中,如何判断人体站位的远近?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,无需后台支持,具有快速、体验好、易集成等特点。本文介绍如何利用插件判断人体与摄像头的远近,确保人体图像在帧内的比例适中,以优化识别效果。通过`whole`检测规则,分别实现人体过近和过远的判断,并给出相应示例代码。
|
9天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十七、如何识别用户上传视频中的人体、运动、动作、姿态?
【云智AI运动识别小程序插件】提供人体、运动、姿态检测的AI能力,支持本地原生识别,无需后台服务,具有速度快、体验好、易集成等优点。本文介绍如何使用该插件实现用户上传视频的运动识别,包括视频解码抽帧和人体识别的实现方法。
|
14天前
|
人工智能 小程序 UED
【一步步开发AI运动小程序】十六、AI运动识别中,如何判断人体站位?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,本地引擎无需后台支持,具备快速、体验好、易集成等优势。本文介绍如何利用插件的`camera-view`功能,通过检测人体站位视角(前、后、左、右),确保运动时的最佳识别率和用户体验。代码示例展示了如何实现视角检查,确保用户正或背对摄像头,为后续运动检测打下基础。
|
20天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,详细解析了俯卧撑动作的检测规则构建与执行流程,涵盖卧撑和撑卧两个姿态的识别规则,以及如何通过继承`sports.SportBase`类实现运动分析器,适用于小程序开发者。
|
20天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
随着AI技术的发展,AI运动APP如雨后春笋般涌现,如“乐动力”、“天天跳绳”等,推动了云上运动会、线上健身等热潮。本文将指导你从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”,介绍运动识别原理、计量方式及运动分析器基类的使用,帮助你在小程序中实现运动计时和计数功能。下篇将继续探讨运动姿态检测规则的编写。
|
14天前
|
移动开发 小程序 PHP
校园圈子论坛系统采取的PHP语音和uni账号开发的小程序APP公众号H5是否只需要4800元?是的,就是只需要4800元
关于校园圈子论坛系统采用PHP语言和uni-app开发的小程序、APP、公众号和H5是否仅需4800元这个问题,实际上很难给出一个确定的答案。这个价格可能受到多种因素的影响
49 8
|
10天前
|
人工智能 小程序 数据处理
uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!
近期,多家康复机构咨询AI运动识别插件是否适用于肢力运动受限患者的康复锻炼。本文介绍该插件在康复锻炼中的应用场景,包括康复运动指导、运动记录、恢复程度记录及过程监测。插件集成了人体检测、姿态识别等功能,支持微信小程序平台,使用便捷,安全可靠,帮助康复治疗更加高效精准。
|
22天前
|
数据采集 人工智能 小程序
【一步步开发AI运动小程序】十、姿态动作相似度比较
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,重点讲解姿态动作相似度比较功能的运用,包括样本动作帧的采集和姿态相似度的计算方法,以及在组合运动中的应用实例。
|
16天前
|
人工智能 小程序 JavaScript
【一步步开发AI运动小程序】十四、主包超出2M大小限制,如何将插件分包发布?
本文介绍了如何从零开始开发一个AI运动小程序,重点讲解了通过分包技术解决程序包超过2M限制的问题。详细步骤包括在uni-app中创建分包、配置`manifest.json`和`pages.json`文件,并提供了分包前后代码大小对比,帮助开发者高效实现AI运动功能。
|
21天前
|
人工智能 小程序 开发者
【一步步开发AI运动小程序】十一、人体关键点跳跃追踪
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,涵盖云上运动会、健身打卡等热门应用场景。通过示例代码展示如何调用插件功能,实现动作追踪与分析,助力开发者快速上手。