【超详细】手搓一个微信日记本

news2024/12/22 17:37:47


🎀 文章作者:二土电子

🌸 关注公众号获取更多资料!

🐸 期待大家一起学习交流!


  这里对之前的微信记事本小程序进行了重新编写,增加了更加详细的步骤描述,将全部图片都改成了本地图片,针对一些细节进行了补充,本文完整工程可关注文末公众号获取。

实现效果

文章目录

  • 一、安装开发工具
  • 二、新建小程序项目
  • 三、文件夹详解
  • 四、新建/删除页面
    • 4.1 删除页面
    • 4.2 添加页面
  • 五、新建图标文件夹
  • 六、全局配置
  • 七、index页面设计
    • 7.1 设置页面背景
    • 7.2 添加日记本图标
    • 7.3 点击图标跳转
  • 八、list页面设计
    • 8.1 添加日记按钮
    • 8.2 显示全部日记
    • 8.3 删除日记
  • 九、add页面设计
    • 9.1 添加文本输入框
    • 9.2 添加保存按钮
  • 十、details页面设计
    • 10.1 跳转实现
    • 10.2 详情页面实现
  • 十一、注意事项

一、安装开发工具

注册这里就不再赘述了,可以直接到微信公众平台注册账号。注册完成后进入页面,点击左侧的“开发工具”,下载自己所需的版本即可。


下载开发工具

二、新建小程序项目

新建时我们选择不使用云服务,选择TS-基础模板。

新建项目

三、文件夹详解

第二步点击确定后,我们就进入了微信小程序开发的页面。其中有许多文件夹,这里我们简单介绍一下各个文件夹的作用。

微信小程序开发文件夹

  • pages
    存放所有的小程序页面,这里只有两个页面,分别是index和logs。
  • utils
    用来存放工具性质的模块,比如时间格式化。
  • app.json
    小程序的全局配置文件。
  • app.ts
    小程序的全局逻辑文件
  • app.wxss
    小程序的全局样式文件

除了上述描述的文件,每一个页面都有自己的.jison、.ts、.wxml和.wxss文件

  • .jison
    jison是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色。值得注意的是,.jison文件中不能添加注释。
  • .wxml
    类似于.html,我们看到的一些控件都是在这里添加的。
  • .ts
    逻辑文件,一些功能的函数实现。
  • .wxss
    样式文件,用来调整整体页面一些控件或文字的样式。

四、新建/删除页面

我们要设计的记账本主要有个页面

  • index
    引导页面,有一个日记本图标,点击可进入下一个页面。
  • list
    全部日记列表页面,可在本页面点击添加日记、删除日记或者进入日记详情。
  • add
    添加日记页面。
  • details
    日记详情页面。

我们首先需要删除掉原先自带的logs页面,然后新建其他几个页面。

4.1 删除页面

删除比较简单,我们选中logs页面的文件夹,右键删除即可,但是不要忘记,我们还需要在app.jison文件中将logs页面的路径删掉。

删除页面

4.2 添加页面

添加页面也非常简单,并不需要我们手动新建文件夹,添加文件夹下面的其他文件。我们只需要在app.jison文件中写入我们想要添加的页面,保存之后就会自动在pages文件夹中生成页面文件夹,非常的方便。这里给大家演示一下。

添加页面

五、新建图标文件夹

此次设计的日记本,使用的是本地图标,因此这里介绍的是如何添加本地图标,当然也可以自己去网上找一些网页图片添加进来,这里就不再做详细介绍了。

如果想使用本地图标,我们需要给所有的图标准备一个文件夹,这里我们直接新建到微信小程序工程文件所在的文件夹里。

新建图标文件夹

六、全局配置

首先我们简单的对我们小程序全局进行简单的美化,实际也就是在app.jison文件中,修改窗口的一些参数。

我们修改了导航栏的背景颜色,导航栏的文字和字体颜色。
导航栏配置

这里贴一下程序,方便复制粘贴

  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#c8b4eb",
    "navigationBarTitleText": "ertu电子",
    "navigationBarTextStyle": "white"
  },

七、index页面设计

7.1 设置页面背景

我们上面说了,本次使用的图片全部是本地图片,这里准备了一个背景图片,存放在images文件夹,添加进来即可。

.wxml文件程序

<view>
  <image class="bg-image" src="/images/background.jpg"></image>
</view>

.wxss文件程序

/* 背景图片样式 */
.bg-image{
  width: 100%;
  height: 100%;
  position: fixed;
  z-index: -1;   /* 放在最底层 */
}

至此,背景图片添加完成,可以看一下效果。

添加背景图片

7.2 添加日记本图标

添加日记图标与上面的操作类似,下载好图标后,创建样式,添加到页面。程序如下

.wxml程序

<image class="appicon" src="/images/diaryicon.png"></image>

.wxss程序

/* App图标样式 */
.appicon{
  margin: 5%;   /* 设置上、下、左、右间距 */
  width: 100rpx;
  height: 100rpx;
  position: fixed;
}

实现效果如下

添加日记图标

为了提示该图标功能为日记本,这里添加一个文字提示,.wxml文件添加下面的程序

  <text style="color: white; font-size: medium; position: relative; left: 36rpx; top: 145rpx">日记本</text>

7.3 点击图标跳转

接下来我们需要实现,点击日记本图标,跳转到日记列表页面。实际就是给日记本图标添加一个点击事件的处理函数。

首先修改.wxml文件程序,给图片的点击事件添加一个处理函数。

<image class="appicon" src="/images/diaryicon.png" bind:tap="gotolistpage"></image>

然后在.ts文件中编写详细的函数实现。

  gotolistpage(){
    wx.navigateTo({
      url: '../list/list'   //跳转链接
    })
  }
})

实现效果如下

点击图标跳转

八、list页面设计

8.1 添加日记按钮

首先按照上面介绍的方法,修改list页面的背景,添加一个添加日记的图标,给图标的点击事件添加一个跳转功能,跳转到添加日记页面。实现效果如下

添加日记跳转

8.2 显示全部日记

显示全部日记首先需要在.wxml文件中添加一个滚动的控件用来显示全部日记列表,程序如下

  <!--底部滚动-->
  <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>

通过上面的程序我们可以看出,我们给每一条日记增加了一个点击事件处理函数和长按事件处理函数,功能会在后面介绍。

然后在.ts文件中,实现获取当前本地缓存的全部日记功能。首先在.ts文件中添加用到的数据

  data: {
    id: '',
    totalDiaryConcent: []   // 全部日记
  },

然后实现获取全部本地缓存日记功能

  // 全部日记显示
  onShow: function () {
    // 获取当前全部日记内容
    // 必须要新定义一个再赋值才能正常显示,原因未知
    var arryTemp = wx.getStorageSync('totalDiaryConcent');
    this.setData({
      totalDiaryConcent: arryTemp
    })
  },

8.3 删除日记

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

首先说一下如何知道用户选择的哪一条日记,这里利用data-将用户选中的日记ID传给.ts文件。

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

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

  // 删除日记内容
  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
        })
      }
    })
  },

九、add页面设计

下面我们来设计一下添加日记的页面。

9.1 添加文本输入框

.wxml程序如下

  <!-- 输入长度默认限制为140,maxlength为-1时表示不限制最大长度 -->
  <textarea class= "the-textarea"  bindinput="getInputText" style="  margin: 5%;width: 90%;height: 90%" maxlength="-1">
  </textarea>

文本输入框的输入时间由函数“getInputText”来处理,用来回去输入的内容,函数实现在.ts文件。

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

9.2 添加保存按钮

  <!-- 保存按钮 -->
  <button class="the-btn" bindtap="saveButton">保存心情</button>

保存按钮的点击事件由“saveButton”函数来处理,函数实现在.ts文件,注释比较明确,这里就不再赘述了。

  // 保存按钮
  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({
    })
  },

在.ts文件中,需要先定义好用到的数据

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

至此,我们来看一下目前实现的效果

实现效果

十、details页面设计

最后我们来设计日记详情页面,也就是点击日记,会跳转到日记详情。

10.1 跳转实现

在日记列表也就是list页面,点击日记我们应该能够跳转到日记详情页面。所以我们给每一条日记都增加一个点击函数“diary_detail”,函数实现是在list的.ts文件中。

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

10.2 详情页面实现

日记详情显示较为简单,需要解决的问题主要有两个,一个是如何确定用户想要查看的是哪条日记内容,这个在删除日记中已经解决。第二个就是如何将用户想要查看的日记详情显示出来,这里说白了就是如何实现页面间的传值,将获取到的日记内容从主页传递到详情页面,然后把它渲染到页面就好啦。

.wxml文件程序如下

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

.wxss文件程序如下

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

.ts文件中加入获取日记内容的函数

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

十一、注意事项

  • 本地图片路径中不要有中文!
  • 当前的一些样式布局是根据IPhon5布局,对于其他机型某些地方可能会出现比例失调或者错位的情况,可以自行根据需要修改。
  • 本程序中的日记全部存储在本地缓存中,只能本机看到,其他用户无法看到。

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (142)-- 算法导论12.1 2题

二、用go语言&#xff0c;二叉搜索树性质与最小堆性质(见 6.1 节)之间有什么不同?能使用最小堆性质在 O(n)时间内按序输出一棵有 n 个结点树的关键字吗?可以的话&#xff0c;请说明如何做&#xff0c;否则解释理由。 文心一言&#xff1a; 在二叉搜索树&#xff08;Binary …

openEuler 22.03 LTS x86_64 cephadm 部署ceph18.2.0 未完成 笔记

环境 准备三台虚拟机 10.47.76.94 node-1 10.47.76.95 node-2 10.47.76.96 node-3 下载cephadm [rootnode-1 ~]# yum install cephadm Last metadata expiration check: 0:11:31 ago on Tue 21 Nov 2023 10:00:20 AM CST. Dependencies resolved. Package …

6 个有效且可用的顶级 Android 数据恢复工具

经过测试 42 种数据恢复软件产品&#xff0c;发现奇客数据恢复安卓版是 Android 设备的最佳选择。 过去几十年来&#xff0c;我一直在科技行业工作&#xff0c;经常帮助人们应对计算机灾难&#xff0c;包括丢失数据。 Android 数据恢复应用程序不在您的设备上运行&#xff0c…

教育+AIGC开局之年:教育派作业帮、科技派科大讯飞同路不同道

配图来自Canva可画 与往年相比&#xff0c;今年的双11显得格外冷清&#xff0c;GMV&#xff08;商品交易总额&#xff09;数据和增长数据无人提及&#xff0c;京东、淘宝天猫、抖音、快手等平台的火药味都淡了。一片祥和有序的双11氛围中&#xff0c;昔日的K12教育企业与科技企…

OpenMLDB SQL 开发调试神器 - OpenMLDB SQL Emulator

今天为大家介绍一款来自 OpenMLDB 社区的优秀独立工具 - OpenMLDB SQL Simulator&#xff08;https://github.com/vagetablechicken/OpenMLDBSQLEmulator&#xff09; &#xff0c;可以让你更加高效方便的开发、调试 OpenMLDB SQL。 为了高效的实现时序特征计算&#xff0c;Op…

芯片设计—低功耗isolation cell

&#xff08;一&#xff09;低功耗isolation cell的目的 低功耗架构设计需要前后端拉通规划&#xff0c;前端设计有PMU功耗管理单元&#xff0c;比如A模块电压常开&#xff0c;B模块电压可关断&#xff0c;那么请思考&#xff0c;当B模块关断电压后&#xff0c;B模块输出到A模…

美国服务器在大陆连不上怎么回事?

​  在租用任何美国服务器之前&#xff0c;都需要先搞清楚一些使用问题&#xff0c;毕竟服务器能够不间断地访问也是站在们所期望的。但有时&#xff0c;美国服务器网站或许也会突然出现在大陆打不开的情况&#xff0c;在面临这种情况时&#xff0c;我们应该怎么做? 查看连不…

第98步 深度学习图像目标检测:SSD建模

基于WIN10的64位系统演示 一、写在前面 本期开始&#xff0c;我们继续学习深度学习图像目标检测系列&#xff0c;SSD&#xff08;Single Shot MultiBox Detector&#xff09;模型。 二、SSD简介 SSD&#xff08;Single Shot MultiBox Detector&#xff09;是一种流行的目标检…

鼠标点击位置获取几何体对象_vtkAreaPicker_vtkInteractorStyleRubberBandPick

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题&#xff1a;框选或者点选某一区域&#xff0c;并获取区域prop3D对象&#xff08;红线内为有效区域&#xff0c;polydata组成的3d几何对象&a…

精益制造中的周转箱和工具柜优势

制造业&#xff08;Manufacturing industry&#xff09;是指机械工业时代利用某种资源&#xff08;物料、能源、设备、工具、资金、技术、信息和人力等&#xff09;&#xff0c;按照市场要求&#xff0c;通过制造过程&#xff0c;转化为可供人们使用和利用的大型工具、工业品与…

杰发科技AC7801——EEP内存分布情况

简介 按照文档进行配置 核心代码如下 /*!* file sweeprom_demo.c** brief This file provides sweeprom demo test function.**//* Includes */ #include <stdlib.h> #include "ac780x_sweeprom.h" #include "ac780x_debugout.h"/* Define …

技术前沿探索:人工智能与大数据融合的未来

技术前沿探索&#xff1a;人工智能与大数据融合的未来 摘要&#xff1a;本博客将探讨人工智能与大数据融合领域的最新技术趋势、前沿研究方向以及挑战与机遇。通过介绍相关技术和案例&#xff0c;我们希望激发读者对这一领域的兴趣&#xff0c;并为其职业发展提供有益参考。 一…

nvm-切换node版本工具安装-方便好用

去官网下载&#xff1a; https://github.com/coreybutler/nvm-windows#installation--upgrades 网站进去后点击下载&#xff0c;点击那个exe文件就下载本地&#xff0c;然后双击安装 安装nvm 就直接按照窗口提示的下一步就行&#xff0c;如果改了某些地方会不成功&#xf…

论文笔记——FasterNet

为了设计快速神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,作者观察到FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运算(FLOPS)效率低下。 为了实现更快的网络,作者重新回顾了FLOPs的运算符,并证明了如此低的FLOPS主要是由…

如何在Simulink中使用syms?换个思路解决报错:Function ‘syms‘ not supported for code generation.

问题描述 在Simulink中的User defined function使用syms函数&#xff0c;报错simulink无法使用外部函数。 具体来说&#xff1a; 我想在Predefined function定义如下符号函数作为输入信号&#xff0c;在后续模块传入函数参数赋值&#xff0c;以实现一次定义多次使用&#xf…

Python,FastAPI,mLB网关,无法访问/docs

根源就是js和ccs文件访问路由的问题&#xff0c;首先你要有本地的文件&#xff0c;详情看https://qq742971636.blog.csdn.net/article/details/134587010。 其次&#xff0c;你需要这么写&#xff1a; /unicontorlblip就是我配置的mLB网关路由。 app FastAPI(titleoutpaint…

【Unity细节】Unity中为什么用字符串加载对象,检查多便都加载不出来—(命名细节)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

【Linux】关系运算符、shell判断脚本执行时是否有传参、判断文件/文件夹是否存在、判断字符串是否相等、判断上个命令执行是否正常、判断字符串是否为空

&#x1f984; 个人主页——&#x1f390;个人主页 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01;&…

做外贸的你崩溃过吗

某日&#xff0c;孔先生问我&#xff0c; 前几天的那个单子怎么样了&#xff1f;看你一会找工厂拍照片&#xff0c;一会找办公室录制视频&#xff0c;半夜还在拿着手机和客户打电话&#xff0c;现在怎么也不提这个进展了&#xff0c;我回答道&#xff1a;黄了。 此时孔先生一股…

静态链表的结构设计与主要操作功能的实现(初始化,头插,尾插,判空,删除,输出,清空,销毁)

目录 一.静态链表的结构设计 二.静态链表的结构设计示意图 三.静态链表的实现 四.静态链表的总结 一.静态链表的结构设计 typedef struct SNode {int data;//数据int next;//后继指针(下标) }SNode,SLinkList[MAXSIZE]; 二.静态链表的结构设计示意图 0:有效数据链的头节点;…