文章目录
其实在一开始本人就想做一个类似日记本的功能,但是碍于最开始能力有限,而且发现上网搜索到的一些相关资料较少,看到做有其他博主做,但是使用的云开发,本人暂时只想做一个简单的无后台的,所以没有参考。其次也搜到一些其他内容,真的是看了超多文章,这里贴出个人觉得帮助最大的文章记事本vx小程序,虽然博主只做了一些简单的功能,并未完善,但是却给了我一个知之甚少的初学者一个实现思路。
按照惯例,先贴实现效果,目前只有添加日记和删除的功能,也像之前的天气功能一样,是通过主页点击图标进入,点击图标跳转具体如何实现可以看天气获取显示的文章,当然这里下面也会介绍一种新的跳转方式,放在下面说啦。

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

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

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

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

长按选中日记可以删除。

还是按照惯例,先上代码,这里把所有代码都贴出来了,希望大家可以点个赞和收藏哟。
<!-- 背景图片 -->
<!-- 放在最上面,否则无法显示 -->
<!-- 加本地背景图片容易导致代码包大小超限,可以选择网络图片 -->
<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>
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;
}
// 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,
})
},
})
<!--输入框-->
<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>
.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;
}
// 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({
})
},
})
<view class="diary-detail">
<text>{{showContent}}</text>
</view>
.diary-detail{
font-size: large;
color: #8B4513;
/* 多文本自动换行 */
word-break:break-all;
}
// pages/diary_detail/diary_detail.ts
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
* 获取点击的日记内容
*/
onLoad(options) {
this.setData({
showContent: options.des
})
}
})
获取输入文字较为简单,这里在添加日记页面用了一个textarea组件,大家可以到微信开放文档查看关于textarea的详细介绍。给这个组件绑定一个函数用来获取输入文字内容,方法也比较简单,.ts文件中这部分的程序如下:
// 文字输入框
getInputText(e:any) {
//记录输入的文字
this.setData({
inputText: e.detail.value
})
},
但是需要注意的是,在textarea的属性中要配置maxlength为-1,否则会发现文本输入框只能输入140个字符内容就不能再输入了。
由于未使用云开发等功能,不具备后台,所以输入的全部内容只能保存在本地缓存中。这里本的缓存中共有两部分内容,分别是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');
}
这里用wx.navigateBack实现跳转回上一个页面,关于本函数的详细介绍大家移步微信开放文档,这个函数中不需要添加任何内容,默认跳转回上一页面。
wx.navigateBack({
})
利用wx.showModal弹出提示框,询问是否要删除本条日记,点击确定会触发删除功能。整体框架如下
wx.showModal({
title: '温馨提示',
content: '是否要删除这条日记?',
// 点击确定后删除掉对应缓存
success (res) {
if (res.confirm) {
删除日记
}
})
点击确定后会删除对应日记,这里有两个重点问题,首先是如何知道用户选择的是哪一条日记,其次是如何删除用户选择的日记。
首先说一下如何知道用户选择的哪一条日记。
这里利用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 点击确定刷新页面。
日记详情显示较为简单,需要解决的问题主要有两个,一个是如何确定用户想要查看的是哪条日记内容,这个在删除日记中已经解决。第二个就是如何将用户想要查看的日记详情显示出来,这里说白了就是如何实现页面间的传值,将获取到的日记内容从主页传递到详情页,具体可以看一下这篇大佬的文章微信小程序页面之间三种传值方式。
获取到日记详情内容后只需要把它渲染到页面就好啦。
这里需要注意的是,如果不在.wxss文件中添加自动换行代码,渲染到页面的日记详情内容会是一长条
.diary-detail{
font-size: large;
color: #8B4513;
/* 多文本自动换行 */
word-break:break-all;
}
至此关于微信小程序记事本的功能介绍以及实现已经结束啦,这里简单总结一下后续优化方向,主要有两条:1、添加日记时间;2、添加后台存储。
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU