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


🎀 文章作者:二土电子

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

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


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

实现效果

文章目录

  • 一、安装开发工具
  • 二、新建小程序项目
  • 三、文件夹详解
  • 四、新建/删除页面
    • 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.mfbz.cn/a/183979.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware vShere download

VMware 前言 VMware vSphere 是 VMware 的虚拟化平台,可将数据中心转换为包括 CPU、存储和网络资源的聚合计算基础架构。vSphere 将这些基础架构作为一个统一的运行环境进行管理,并为您提供工具来管理加入该环境的数据中心。 vSphere 的两个核心组件是 ESXi 和 vCenter Ser…

css图片缩放属性object-fit说明

object-fit 属性可以设置以下值&#xff1a; 属性值说明例子fill填充容器&#xff0c;可能会改变图片的比例。object-fit: fill;contain保持图片的原始比例&#xff0c;确保图片完全包含在容器内。object-fit: contain;cover保持图片的原始比例&#xff0c;确保图片覆盖整个容…

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

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

将对象转成URL参数

背景 有的时候前端跳转到其他平台的页面需要携带额外的参数&#xff0c;需要将对象转成用 & 连接的字符串拼接在路径后面。 实现方法

使用 pycryptodome 代替 pycrypto 2.6.1

老板认为加班是解决bug的良方&#xff0c;我的枕头却不这么认为。在这个被数字化和快速创新的时代&#xff0c;技术问题和bug是不可避免的。 老板建议我们继续加班&#xff0c;直到找到一个解决方案。然而&#xff0c;我有一个更好的建议&#xff1a;我们应该使用pycrypt…

下一代ETL工具:微服务架构的全新数据集成平台

当前对于大型企业来说数据的整合和加工变得越来越重要。随着业务需求的不断增长&#xff0c;企业数据量越来越大&#xff0c;数据管道越来越多&#xff0c;现有的ETL&#xff08;抽取、转换、加载&#xff09;工具已不再满足实时、高性能和微服务架构等现代化需求。因此&#x…

用EasyAVFilter将网络文件或者本地文件推送RTMP出去的时候发现CPU占用好高,用的也是vcodec copy呀,什么原因?

最近同事在用EasyAVFilter集成在EasyDarwin中做视频拉流转推RTMP流的功能的时候&#xff0c;发现怎么做CPU占用都会很高&#xff0c;但是视频没有调用转码&#xff0c;vcodec用的就是copy&#xff0c;这是什么原因呢&#xff1f; 我们用在线的RTSP流就不会出现这种情况&#x…

性能优化中使用Profiler进行页面卡顿的排查及解决方式

文章目录 一、前言二、页面卡顿的排查方式1、耗时操作的监控2、页面卡顿的监控 三、参考链接 一、前言 程序的优化在做过线上bug处理&#xff0c;布局层级优化&#xff0c;项目依赖库版本更新&#xff0c;重复库合并&#xff0c;删除未使用的资源&#xff0c;删除冗余的库&…

什么手机30万?VERTU唐卡手机顶配56.8万

近日,一则新闻在社交媒体上引发了广泛关注。一名男子遗失了一部价值30万的VERTU唐卡定制款手机,而一位女士在捡到这部手机后,误以为是一部普通的老年机,引发了种种误会。30万的手机是什么牌子?VERTU唐卡手机浮出水面 据了解,这部VERTU唐卡定制款手机是一款豪华的奢侈品定制手机…

OpenMLDB v0.8.4 诊断工具全面升级

新的v0.8.4版本中&#xff0c;我们对于诊断工具进行了全面系统化的升级&#xff0c;以提供更加完整和智能化的诊断报告&#xff0c;有助于高效排查 OpenMLDB 集群问题&#xff0c;大幅提升运维效率。 相比于之前的版本&#xff0c;新的诊断工具增添一键诊断功能&#xff0c;使…

一体化污水处理设备各种材质的优缺点

一体化污水处理设备的材质有多种&#xff0c;包括不锈钢、玻璃钢、聚乙烯塑料、碳钢等。每种材质都有其独特的优点和缺点。 不锈钢材质的优点是防腐性能好&#xff0c;耐磨损&#xff0c;使用寿命长&#xff0c;且外观美观。其缺点是成本较高&#xff0c;不适合在一些特殊的环…

【力扣:421,2935】数组内最大异或对问题

思路&#xff1a;从最高位向低位构造&#xff0c;对每一位利用哈希表寻找是否存在可使此位为1的数 第一轮找1&#xff1a;清空哈希表&#xff0c;1&#xff0c;2存1&#xff0c;到3发现1^01&#xff0c;res|1<<3 第二轮找11&#xff1a;清空哈希表&#xff0c;1存10&…

会员管理系统开发

一、引言 在当今竞争激烈的商业环境中&#xff0c;建立并维护良好的客户关系是任何企业都必须重视的关键因素。为了提高客户满意度和忠诚度&#xff0c;企业需要一个功能强大、高效的会员管理系统。本文将详细介绍如何开发一个成功的会员管理系统&#xff0c;以及它对企业的重…

宣传技能培训2——《图片后期处理与制作》光影魔术师:一小时速成Lightroom图片后期软件 + 案例分析

图片后期处理与制作&#xff1a;从理论到实践 写在最前面背景介绍夜间拍摄及其后期捕捉瞬间更重要 深入探索Lightroom&#xff1a;提升图片处理效率与质量软件设置与优化图片处理与预览GPU加速导入图片到LightroomLightroom界面概览图片筛选与比较删除不需要的图片 Lightroom进…

idea git将某个分支内的commit合并到其他分支

idea git将某个分支内的commit合并到其他分支 1.打开旧分支的代码提交记录 在IDEA中切换到新分支的代码&#xff0c;点击Git打开代码管理面板&#xff0c;在顶部点击Log:标签页&#xff08;这个标签页内将来可以选择不同分支的个人/所有人的代码commit记录&#xff09;&#x…

【数据结构】二叉树概念 | 满二叉树 | 完全二叉树

二叉树的概念 二叉树在实践中用的很多。 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 或者为空&#xff1b;由一个根结点加上两棵别称为左子树和右子树的二叉树组成。二叉树最多两个孩子。 这里注意&#xff1a;二叉树并不是度为2的树。 二叉树的度最大值是…

实现外卖配送的智能化:外卖配送可视化技术解析

随着互联网技术的不断发展&#xff0c;外卖配送行业也迎来了快速发展的时代。而随之而来的是越来越多的用户对于外卖配送的质量和效率提出了更高的要求。如何让外卖配送更加可视化&#xff0c;成为了外卖配送行业亟需解决的问题。 外卖配送可视化是指通过技术手段&#xff0c;将…

编程实例,随机抽奖编程

编程实例&#xff0c;随机抽奖编程 操作步骤&#xff1a; 1、将在本店消费的会员数据导入到抽奖池&#xff0c;可以设定最近多少天内的记录。 2、点击 开始随机抽奖&#xff0c;软件将从抽奖池随机抽取9名&#xff0c;并不断变化&#xff0c;每0.02秒重新随机抽取9名显示到屏…

vue2项目从0搭建(三):配置环境变量及对应的webpack配置

前言 实际业务开发中,一个项目很可能会同时配置好几套环境。 比如:常规开发环境,开发测试环境,正式的测试环境,预发测试环境,客户甲的生产环境,客户乙的生产环境,通用生产环境,独立应用环境,微前端环境,大屏专用环境,移动端环境。 一女多嫁的实际业务场景,就需要我们进行多样…

oracle rac环境归档日志清除

文章目录 一、处理步骤1、使用终端登录上服务器查看磁盘使用状态2、使用恢复备份管理工具RMAN删除归档日志 二、详细操作步骤三、定时任务自动清归档日志1、编写删除脚本4、测试脚本运行情况5、设置定时任务每周执行一次&#xff0c;并测试运行效果 昨天单位的所有系统都连不上…
最新文章