基于微信小程序的一款小程序版知乎

news2024/11/18 7:41:29

从零开始开发的一款小程序,所以没有使用任何框架及UI库,记录一下本次开发中踩过的坑吧~

展示效果(界面样式设计与交互来自iOS 4.8.0版本知乎App):

项目地址:https://download.csdn.net

一、开始前的准备

  • 申请账号:根据小程序注册文档,填写信息和提交相应的资料,就可以拥有自己的小程序帐号。

  • 开发工具:微信开发者工具

  • 数据来源:

  • Easy Mock: 一个数据模拟神器,可以根据自己需要的格式自己编写返回数据,而且所有的数据都是随机生成的。

  • Mock.js: Easy Mock引入了Mock.js,但是文档中仅提供了部分语法,要想自己的mock数据写的更精简,可以在Mock.js中查看更多具体语法。

  • icon: 阿里巴巴矢量图标库

二、初始化一个小程序

  • 新建一个空文件夹

  • 打开微信开发者工具,按照“你的第一个小程序”文档中的步骤即可创建一个自己的小程序。

  • 目录结构

weChatApp
|___client
|    |___assets                 // 存储图片
|    |___pages                  // 页面
|    |    |___index // 首页
|   |        |___index.wxml  // 页面结构文件
|    |        |___index.wxss  // 样式表文件
|    |        |___index.js    // js文件
|    |___utils                 // 全局公共函数
|    |___app.js               // 系统的方法处理文件
|    |___app.json             // 系统全局配置文件
|    |___app.wxss             // 全局的样式表
|    |___config.json         // 域名等配置文件
|___project.config.json
|___README
  • 小程序配置文件app.json内容

{
    // 页面路由
    "pages": [
        "pages/index/index",              // 首页
        "pages/findMore/findMore",        // 想法页(开始起名为发现页面,后来没改/(ㄒoㄒ)/~~)
        "pages/userCenter/userCenter",    // 更多(同上,原来起名为个人中心o(╯□╰)o)
        "pages/market/market",            // 市场
        "pages/searchResult/searchResult",// 搜索结果页
        "pages/message/message",          // 消息列表页
        "pages/titleDetail/titleDetail",  // 点击标题进入的问题详情页
        "pages/contentDetail/contentDetail"// 点击内容进入的回答详情页
    ],
    // 窗口
    "window": {
        "backgroundColor": "#FFF",       // 窗口的背景色  
        "backgroundTextStyle": "dark",   // 下拉背景字体、loading 图的样式,仅支持 dark/light
        "navigationBarBackgroundColor": "#FFF",// 顶部tab背景颜色
        "navigationBarTitleText": "知小乎", //顶部显示标题
        "navigationBarTextStyle": "black", // 导航栏标题颜色,仅支持 black/white
        "enablePullDownRefresh": true      // 是否开启下拉刷新
    },
    // tab导航条
    "tabBar": {
        "backgroundColor": "#fff",  // 背景颜色
        "color": "#999",            // 默认文字颜色
        "selectedColor": "#1E8AE8", // 选中时文字颜色
        "borderStyle": "white",     // tabbar上边框的颜色, 仅支持 black/white
        
        /** 
        * tab列表,最少2个,最多5个
        * selectedIconPath: 选中时图片
        * iconPath: 默认图片
        * pagePath: 对应页面路由
        * text: 对应文案
        **/
        "list": [{
            "selectedIconPath": "assets/home-light.png",
            "iconPath": "assets/home.png",
            "pagePath": "pages/index/index",
            "text": "首页"
        }, {
            "selectedIconPath": "assets/find-light.png",
            "iconPath": "assets/find.png",
            "pagePath": "pages/findMore/findMore",
            "text": "想法"
        },
        {
          "selectedIconPath": "assets/market-light.png",
          "iconPath": "assets/market.png",
          "pagePath": "pages/market/market",
          "text": "市场"
        },
        {
          "selectedIconPath": "assets/msg-light.png",
          "iconPath": "assets/msg.png",
          "pagePath": "pages/message/message",
          "text": "消息"
        }, {
            "selectedIconPath": "assets/more-light.png",
            "iconPath": "assets/more.png",
            "pagePath": "pages/userCenter/userCenter",
            "text": "更多"
        }]
    }
}
  • 配置接口域名: 因使用的是Easy Mock模拟接口数据,因此可以在小程序管理后台-开发设置-服务器域名中将request合法域名配置为 https://www.easy-mock.com。

三、开发中的遇到的问题及解决方案

1、小程序渲染HTML片段

看了网页版知乎,接口返回的回答数据是一段HTML的代码片段,所以答案中可以在任意位置都插入图片。对,没错,就是下面酱紫的(╯°□°)╯︵┻━┻

经过反复尝试,发现原生写法不支持渲染一段HTML代码片段,因此放弃了返回HTML的代码片段的做法,所以我的回答列表中也没有图片(ಥ_ಥ)。

但在调研中发现了一个自定义组件:wxParse-微信小程序富文本解析组件,还没尝试使用,准备在下次优化项目时尝试一下。

2、首页的顶部tab切换

实现思路

每个可点击的tab分别绑定data-index,在最外层bindtap绑定的方法中获取所点击的tab的index值,再根据index的值分别显示对应的tab-content
<view class="tab-wrapper" bindtap="setActive">
        <view class="tab-item {{isActive == 0 ? 'tab-item-active' : ''}}" data-index="0">关注</view>
        <view class="tab-item {{isActive == 1 ? 'tab-item-active' : ''}}" data-index="1">推荐</view>
        <view class="tab-item {{isActive == 2 ? 'tab-item-active' : ''}}" data-index="2">热榜</view>
        <view class="tab-item-line" animation="{{animationData}}"></view>
</view>
<view class="tab-content {{isActive == 0 ? 'show' : 'hide'}}">
 // ...
</view>
<view class="tab-content {{isActive == 1 ? 'show' : 'hide'}}">
 // ...
</view>
<view class="tab-content {{isActive == 2 ? 'show' : 'hide'}}">
 // ...
</view>

3、上拉加载和下拉刷新

实现思路

上拉加载:emmmmmm......我指的上拉加载是触底后的加载更多,怕跟大家理解的不一样o(╯□╰)o。
原生方法:onReachBottom,获取到新数据后concat到原有的数据列表后。
下拉刷新:
原生方法:onPullDownRefresh,将原有的数据列表concat到获取到的新数据后。
要注意的是,每次对数组进行操作后,都要使用setData对原数组重新赋值,否则数据不会更新的啊( ⊙ o ⊙ )!

4、搜索历史的存储

实现思路

wx.setStorage、wx.getStorage和wx.removeStorage
存储搜索历史:> - 使用wx.setStorage,触发搜索时,检查搜索历史列表中是否含有该字段,如果有则忽略,如果没有则将该字段压入数组中。
显示搜索历史:> - 使用wx.getStorage,在显示搜索蒙层时,获取到搜索历史列表,循环显示,当搜索历史列表长度大于1时,显示清空搜索历史的按钮。
删除搜索历史:
单一删除:每个搜索历史都绑定删除事件,获取到改关键词的index,从渠道的搜索历史列表中删除对应index的关键词,并通过wx.setStorage重新存储。
全部删除:使用wx.removeStorage,直接移除搜索历史对应的关键字。

5、swiper轮播组件

在想法页的轮播组件中,原知乎App中的xxxx人正在讨论是嵌在轮播模块内的垂直方向的文字轮播,但是小程序中的swiper轮播组件不支持互相嵌套,因此没能实现该部分,只好换一种样式去写/(ㄒoㄒ)/~~。

6、滚动吸顶

页面中的标题栏在滚动到顶部时,吸顶展示。

实现效果

实现方案

  • 整个页面使用<scroll-view></scroll-view>包裹,并且绑定bindscroll事件,监听滚动距离。

  • 设置<scroll-view>为垂直方向时,需设置<scroll-view>的高度。

  • 复制一个相同的标题栏,添加吸顶样式的类fixed。

  • 使用wx:if判断当前页面滚动距离是否达到要求,如果达到所需距离,则渲染这个吸顶的标题栏。

<view class="find-hot-header fixed" wx:if="{{scrollTop >= 430}}">
   <view class="find-hot-title">最近热门</view>
</view>
<view class="find-hot-header">
    <view class="find-hot-title">最近热门</view>
</view>

7、展开和收起全文

展示效果

文字部分默认添加class,超出两行文字显示省略号。

.text-overflow{
  height: 85rpx;
  display: -webkit-box;
  word-break: break-all;
  text-overflow: ellipsis;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp:2;
}

点击展开全文和收起全文时对showIndex[index]的值取反,对应添加或移除该class。

<view class="find-hot-content {{!showIndex[index] ? 'text-overflow' : ''}}">
    {{item.content}}
</view>
<view wx:if="{{!showIndex[index]}}" class="find-show-all" data-index="{{index}}" bindtap="toggleShow">展开全文</view>
<view wx:if="{{showIndex[index]}}" class="find-show-all" data-index="{{index}}" bindtap="toggleShow">收起全文</view>

8、更改switch样式

switch类名如下,一定要加上父类,不然全局的都会被改掉_(:з」∠)_。

父类 .wx-switch-input{
  display: inline-block;
  position: absolute;
  top: 20rpx;
  right: 20rpx;
  width: 84rpx;
  height: 44rpx;
}
父类 .wx-switch-input::before{
  width: 80rpx;
  height: 40rpx;
}
父类 .wx-switch-input::after{
  width: 40rpx;
  height: 40rpx;
} 

四、总结

通过这次小程序的开发,学到了很多东西,虽然遇到了很多问题,但解决问题的过程让我收获的更多,动手实践才是学习的最好方式。

另外,此次项目中仍有许多功能不够完善,一些细节还可以继续优化,长路漫漫啊。

如果文章中有错误和不足欢迎批评指正。

项目地址: https://download.csdn.net
(づ。◕‿‿◕。)づ★ 想要个star

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

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

相关文章

钉钉配置事件订阅(Python)

钉钉配置事件订阅 0.需求分析 需要实现钉钉企业通讯录同步至企业微信通讯录&#xff0c;这就需要用到钉钉的事件与回调 1.配置应用 登陆开放平台 https://open-dev.dingtalk.com/去企业内部开发里面&#xff0c;先创建个应用&#xff0c;后面都借用这个应用来调接口 创建完…

自定义分库分表组件(实现分库分表的组件)——java

系列文章目录 文章目录系列文章目录前言一、所需技术二、技术总结1. ThreadLocal2.HashMap三、实现1、定义路由注解自定义注解格式要求元注解&#xff1a; 用于描述注解的注解在程序使用(解析)注解&#xff1a;获取注解中定义的属性值小例子&#xff1a;注解定义一个简单的测试…

AI算法创新赛-人车目标检测竞赛总结03

团队简介AI0000032 团队成员均为从事计算机视觉领域的企业员工&#xff0c;热爱技术&#xff0c;勇于挑战&#xff0c;致力于更通用目标检测算法的研究与落地。团队由三人组成&#xff0c;队长何正海 主要负责整体方案设计与模型的量化工作&#xff0c;余洋主要负责模型训练与调…

YOLOV5输出的txt里面有什么猫腻(用于图像分类竞赛中提升图像信息密度)

背景概括&#xff1a; kaggle最近举办了一场医学乳腺癌检测的比赛&#xff08;图像分类&#xff09; 比赛官网地址 给的数据是dcm的专业的医学格式&#xff0c;自己通过DICOM库转为png后&#xff0c;发现该图像胸部不同的患者乳腺大小不一&#xff0c;简言之乳腺的CT有效图在…

MySQL性能调优与设计——MySQL中的索引

MySQL中的索引 InnoDB存储引擎支持以下几种常见索引&#xff1a;B树索引、全文索引、哈希索引&#xff0c;其中比较关键的是B树索引。 B树索引 InnoDB中的索引自然也是按照B树来组织的&#xff0c;B树的叶子节点用来存放数据。 聚集索引/聚簇索引 InnoDB中使用了聚集索引&…

LeetCode 141. 环形链表

原题链接 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给你一个链表的头节点 headheadhead &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 nextnextnext 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的…

python编写webapi读取mdb数据使用json格式响应客户端请求

想做个自动应答机器人&#xff0c;通过webapi提供服务&#xff0c;原理&#xff1a;判断关键字&#xff0c;到数据库查询相关内容&#xff0c;以json格式反馈给客户端。 1、创建autoreply数据库&#xff0c;创建reply表&#xff0c;表中包含kename&#xff08;短文本&#xff…

积水在线监测仪——积水点、易涝点水位监测设备

一、设备概述 积水在线监测仪是一款用于城市积水点、易涝点等场景的水位监测设备&#xff0c;设备采用电池供电&#xff0c;无需另外供电&#xff0c;安装方便&#xff0c;使用简单。可以时监测水点、易涝点水位情况&#xff0c;当水位数据超过阈值后触发告警上传&#xff0c;…

MybatisPlus实现分页效果并解决错误:cant found IPage for args!

前言 早就知道MybatisPlus对分页进行了处理&#xff0c;但是一直没有实战用过&#xff0c;用的是自己封装的一个分页组件&#xff0c;虽不说麻烦吧&#xff0c;但是也不是特别简单。 写起来还是比较复杂&#xff0c;但是最近这个组件有了点小小的bug&#xff0c;我决定是时候…

2023年进入互联网行业好找工作吗?

俗话说&#xff1a;选择大于努力。年后求职小高峰&#xff0c;大家在找工作的时候选择肯定也多了。 说真&#xff0c;不是人人都有铁饭&#xff0c;普通家庭的孩子想要在2023年进入互联网行业去找工作可能吗&#xff1f; 01 有一点大家要清楚&#xff0c;2022年是进入过一个寒…

【Linux】变量定义规则、shell 格式、空格注意事项汇总

文章目录1. 空格问题号用于赋值用于比较2. 变量2.1 变量命名的格式要求2.2、shell变量中的注意事项2.3、变量的使用方法2.4、变量的类型&#xff08;1&#xff09;自定义变量&#xff08;2&#xff09;环境变量&#xff08;3&#xff09;位置变量&#xff08;4&#xff09;预定…

【高并发-用户中心】读多写少的系统如何优化

本博客纯属个人总结&#xff0c;非原创。喜欢技术交流的&#xff0c;可关注博主&#xff0c;武汉有后端开发群&#xff0c;可支持内推&#xff0c;了解武汉行情等。 如何对读多写少的系统进行高并发优化&#xff1f; 比如&#xff1a;用户中心是一个读多写少的系统&#xff0…

Linux定时备份MySql数据库

一、创建文件 cd / mkdir mysqlbackup vi mysqlbackup.sh然后将下面的代码更改后复制上去即可。 #!/bin/bash mysqldump -uroot -ppassword database > /mysqlbackup/database__$(date %Y%m%d_%H%M%S).sqlpassword指的是MySql的密码&#xff0c;database指的是所要备份的…

【C++算法】dfs深度优先搜索(上) ——【全面深度剖析+经典例题展示】

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 &#x1f4d5; ps:七八天没更新了欸&#xff0c;这几天刚搞完元宇宙&#xff0c;上午一直练&#x1f697;&#xff0c;下午背四级单词和刷题来着&#xff0c;还在忙一些学弟…

leaflet: 禁止拖拽、禁止zoom(双击、滚轮、键盘)、禁止tap(076)

第076个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中设定各种禁止状态,这里设置了禁止拖拽、禁止zoom(双击、滚轮、键盘)、禁止tap。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共73行)相关A…

linux高级命令之多进程的使用

多进程的使用学习目标能够使用多进程完成多任务1 导入进程包#导入进程包import multiprocessing2. Process进程类的说明Process([group [, target [, name [, args [, kwargs]]]]])group&#xff1a;指定进程组&#xff0c;目前只能使用Nonetarget&#xff1a;执行的目标任务名…

电商导购CPS,京东联盟如何跟单实现用户和订单绑定

前言 大家好&#xff0c;我是小悟 做过自媒体的小伙伴都知道&#xff0c;不管是发图文还是发短视频&#xff0c;直播也好&#xff0c;可以带货。在你的内容里面挂上商品&#xff0c;你自己都不需要囤货&#xff0c;如果用户通过这个商品下单成交了&#xff0c;自媒体平台就会…

【刷题笔记】--搜索二维矩阵 II

题目&#xff1a; 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16…

设计师都在看的全球设计网站,你居然还不知道!

设计师需要拥有无限的创意和熟练的技巧&#xff0c;并且对行业的前景和客户的心理有一定的了解。要能达到“陌生化”之前&#xff0c;肯定是有知识储备&#xff0c;专业能力的前提要求&#xff0c;以及创新能力。 今天为大家整理了多个优秀全球设计网站&#xff0c;这些博客内…

大家都在聊的自动化办公到底是什么?

自动化办公无非是excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些&#xff0c;下面就详细介绍一下&#xff01;文章最后分享了很不错的python学习教程&#xff0c;适合零基础初学的小伙伴&#xff0c;希望可以对你有所帮助&#xff01;&#xff01; excel自动化 我…