uni - app 新闻项目解析

时间:2024-12-18 07:25:08

1. 首页布局

2. 顶部导航栏

导航栏布局:

        scroll-view 内置标签,配置 scroll-x="true" 左右方向滑动,再删除滑动条

  1. <!-- 顶部导航条 -->
  2. <scroll-view scroll-x="true" class="navScroll">
  3. <view class="item" :class="index==navIndex?'active':''" @click="clickNav(index,)"v-for="(item,index) in navArr" :key="">
  4. {{}}
  5. </view>
  6. </scroll-view>
  1. // 隐藏滚动条
  2. ::-webkit-scrollbar {
  3. display: none;
  4. width: 0 !important;
  5. height: 0 !important;
  6. -webkit-appearance: none;
  7. background: transparent;
  8. }

导航栏点击高亮切换:

        v-for 中添加动态 class 判断,根据点击事件传入的 index 值,为选项卡添加上 active 样式实现高亮

  1. <view class="item" :class="index==navIndex?'active':''" @click="clickNav(index,)"
  2. v-for="(item,index) in navArr" :key=""></view>
  1. clickNav(index, id) {
  2. // 高亮切换
  3. = index
  4. },

导航栏点击切换分类数据:

        设置一个分页 page,后续获取内容分页数据的时候使用,在切换选项卡的时候清空,重新请求新数据的第一页的初始数据

        再调用函数获取数据

  1. clickNav(index, id) {
  2. // 高亮切换
  3. = index
  4. // 切换分类重置页码
  5. = 1
  6. // 切换分类重置之前分类的数据
  7. = []
  8. (id)
  9. },

3. 内容模块

获取页面数据:

        获取数据,渲染页面,触底后 page + 1 重新再次获取数据

         [...oldList,...newList] 展开之前的数据,叠加进去新数据

  1. // 获取新闻列表数据
  2. getNewsData(id = 50) {
  3. ({
  4. url: 'https://ku./dataApi/news/',
  5. success: res => {
  6. // 清除初始加载loading
  7. ();
  8. // 数据加载到底
  9. if (res.data.length == 0) {
  10. = 1
  11. ({
  12. title: '数据加载到底了~~~',
  13. duration: 1000,
  14. icon: "error"
  15. });
  16. }
  17. // 数据正常触底叠加加载
  18. = [..., ...res.data]
  19. },
  20. data: {
  21. //传给服务器,告诉它需要返回数据分类
  22. cid: id,
  23. page:
  24. }
  25. })
  26. }
  27. },

分页数据获取: 

        

        触底后 page +1 再次调用获取数据函数,叠加上第二页的数据,且添加上加载动画

  1. // 底部触底
  2. onReachBottom() {
  3. if ( == 0) {
  4. ({
  5. title: '数据加载中'
  6. });
  7. } else {
  8. ({
  9. title: '数据加载到底了~~~',
  10. duration: 1000,
  11. icon: "error"
  12. });
  13. return
  14. }
  15. new Promise(resolve => {
  16. setTimeout(() => {
  17. ++
  18. a()
  19. resolve()
  20. }, 1000)
  21. }).then(() => {
  22. ()
  23. })
  24. },

点击模块跳转详情页面:

        内容部分使用组件化, 新建的 components文件夹下创建,它会自动进行导入,可直接使用自定义组件名,组件内固定好格式,通过父组件传入数据进行渲染。

(在自定义函数上绑定点击事件,需要加上 .native 确定原生事件,不然会以为是自定义函数)

<newsbox @click.native="goDetail(item)" :item="item"></newsbox>

        跳转详情页面,携带对应点击的内容的参数

  1. // 点击跳转详情页面
  2. goDetail(item) {
  3. ({
  4. url: `/pages/detail/detail?cid=${}&id=${}`
  5. })
  6. },

4. 详情页面

传参渲染页面:

        获取传来的参数,在onLoad 小程序生命周期函数中可以获取到 Options 参数

  1. onLoad(Options) {
  2. uni.showLoading({
  3. title: '加载中'
  4. });
  5. this.options = Options
  6. this.getDetail()
  7. },

        根据传来的参数 id 等数据,去获取对应数据,更改标题,并且对其数据进行本地存储,用于后续的浏览历史的记录

  1. getDetail() {
  2. ({
  3. url: "https://ku./dataApi/news/",
  4. data: this.options,
  5. success: res => {
  6. // 加载成功取消loading
  7. ();
  8. this.detailList = res.data
  9. // 更改封面首页的标题为新闻标题
  10. ({
  11. title: this.
  12. })
  13. // 存储历史记录
  14. this.saveHistory()
  15. }
  16. })
  17. },

        本地存储历史记录 

        ('') 

        ('') 

  1. // 存储历史记录
  2. saveHistory() {
  3. // 读取已有的历史记录,读不到的话就设置空数组
  4. let historyArr = ('historyArr') || []
  5. let item = {
  6. id: ,
  7. title: ,
  8. classid: ,
  9. picurl: ,
  10. looktime: timestampToTime(Date.now() / 1000)
  11. }
  12. // 判断是否已经记录过了,找到其数据库数组中符合条件的那一个的索引号
  13. let index = (i => {
  14. return ==
  15. })
  16. if (index >= 0) {
  17. // 缓存中存在,删除掉以前存的,再加入一个最新的到前面
  18. (index, 1)
  19. }
  20. // 向前追加进新的历史记录
  21. historyArr = [item, ...historyArr]
  22. // 只运行存储最近的3个历史记录
  23. historyArr = (0, 3)
  24. // 将最新叠加后的数据重新存入本地
  25. ('historyArr', historyArr)
  26. }
  27. },

5. 个人中心

调用 ('') 获取之前本地存储的详情页面数据,进行页面渲染

清空历史记录:

        ('');

  1. // 清除历史记录
  2. cleanHistory() {
  3. uni.removeStorageSync('historyArr');
  4. this.getData()
  5. },

6. 项目打包 APP

发行 - 原生App-云打包:

使用云端证书打包:

获取App安装包:

        unpackage - release - apk - XXX 获取 App 安装包