旅游管理App开发 第六天:技术点汇总以及遇到问题的解决办法


1.实现搜索框联想搜索功能

  1. 效果图:
    在这里插入图片描述
    代码:
watch: {
    keyword () {
      if (this.timer) {
        clearTimeout(this.timer)
      }
      this.timer = setTimeout(() => {
        const result = []
        for (const i in this.cities) {
          console.log(this.cities[i].lists)
          this.cities[i].lists.forEach((value) => {
            if (value.indexOf(this.keyword) > -1) {
              result.push(value)
            }
          })
        }
        this.list = result
      }, 100)
    }
  },

分析:

在这里插入图片描述


2. 如果没有找到城市,返回结果的处理

效果图:
在这里插入图片描述
代码:

 <ul>
   <li class="search-item" v-for="(item, index) of list" :key="index" @click="handleCityClick(item)">{{item}}</li>
   <li class="search-item" v-show="noCity">没有您想要找的城市</li>
  </ul>
computed: {
    noCity () {
      return !this.list.length
    }
  },

分析:
用到 v-show 属性 加一个计算属性 如果list数组的长度为0 才显示 没找到


2. Vuex 的基本使用 (vuex官方文档)

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension ,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

把这张图能弄明白,vuex基本没问题了

在这里插入图片描述

  1. 安装vuex框架 npm install vuex --save
  2. 在一个模块化的打包系统中,您必须显式地通过 Vue.use() 来安装 Vuex:
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

案例1: 数据共享 实现城市的同步更新,并实现刷新网页时,城市数据会保存,犹如cookie

在这里插入图片描述

代码:

src文件夹下创建store文件夹 ,并在store中创建三个js文件 index.js,state.js, mutations.js

  • index.js:
import Vue from 'vue'
import Vuex from 'vuex'
import state from '@/store/state'
import mutations from '@/store/mutation'

Vue.use(Vuex)

export default new Vuex.Store({
  state,
  // actions: { 可以省去 action 直接 commit 到 mutation
  //   changeCity (ctx, city) {
  //     ctx.commit('changeCity', city)
  //   }
  // },
  mutations
})

  • state.js:
let defaultCity = '上海'

// 利用 try catch (e) {} 捕捉异常错误  避免用户关闭本地存储功能或者隐身模式 导致代码异常报错 整个页面瘫痪
try {
  if (localStorage.city) {
    defaultCity = localStorage.city
  }
} catch (e) {}

export default {
  city: defaultCity
}
  • mutations.js:
export default {
  // 和上面的 changecity 不是同一个方法
  changeCity (state, city) {
    state.city = city
    try {
      localStorage.city = city
    } catch (e) {}
  }
}

localStorage的优势:
1、localStorage拓展了cookie的4K限制
2、localStorage会可以将第一次请求的数据直接存储到本地,这个相当于一个5M大小的针对于前端页面的数据库,相比于cookie可以节约带宽,但是这个却是只有在高版本的浏览器中才支持的
3、localStorage的浏览器支持情况:
在这里插入图片描述
localStorage的局限:
1、浏览器的大小不统一,并且在IE8以上的IE版本才支持localStorage这个属性
2、目前所有的浏览器中都会把localStorage的值类型限定为string类型,这个在对我们日常比较常见的JSON对象类型需要一些转换
3、localStorage在浏览器的隐私模式下面是不可读取的
4、localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡
5、localStorage 不能被爬虫抓取到

localStorage与sessionStorage的唯一一点区别就是localStorage属于永久性存储,而sessionStorage属于当会话结束的时候,sessionStorage中的键值对会被清空

小技巧:

  1. 利用 try catch (e) {} 捕捉异常错误 避免用户关闭本地存储功能或者隐身模式 导致代码异常报错 整个页面瘫痪

  2. import store from './store' 或者 import store from './vuex/store'

(这里说明下:如果你在src下创建的文件夹是store/index.js,那么在main.js中引入store时可以写成import store from './store',它等同于:import store from './store/index'; 即,如果文件夹名是store,那么index.js可以省略不写;如果你在src下创建的文件夹是vuex/store.js,那么在main.js中引入store时必须写成:import store from './vuex/store'😉

  1. 键名和值相同时,可以直接写键名,简写

案例2:点击city组件的城市卡片能自动跳转到home组件,代码的优化简写, 引入 mapState , mapMutations

import { mapState, mapMutations } from 'vuex'

export default {
  name: 'CityList',
  props: ['allCities', 'hotCities', 'letter'],
  methods: {
    handleCityClick (city) {
      // this.$store.commit('changeCity', city)
      this.changeCity(city)
      this.$router.push('/')// 利用路由,点击就返回home组件
    },
    ...mapMutations(['changeCity'])// 简化代码 不用写成 this.$store.commit
  },
  computed: {
    ...mapState(['city']) //不用再写 this.$store.state.city 直接写 this.city
  },
}

3. keep-alive介绍与使用

keep-alive是一个抽象组件:它自身不会渲染一个DOM元素,也不会出现在父组件链中;使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

使用场景

用户在某个列表页面选择筛选条件过滤出一份数据列表,由列表页面进入数据详情页面,再返回该列表页面,我们希望:列表页面可以保留用户的筛选(或选中)状态

keep-alive就是用来解决这种场景。当然keep-alive不仅仅是能够保存页面/组件的状态这么简单,它还可以避免组件反复创建和渲染,有效提升系统性能。总的来说,keep-alive用于保存组件的渲染状态

用法

  • 在动态组件中的应用
<keep-alive :include="whiteList" :exclude="blackList" :max="amount">
     <component :is="currentComponent"></component>
</keep-alive>

  • 在vue-router中的应用
<keep-alive :include="whiteList" :exclude="blackList" :max="amount">
    <router-view></router-view>
</keep-alive>

include定义缓存白名单,keep-alive会缓存命中的组件;exclude定义缓存黑名单,被命中的组件将不会被缓存;max定义缓存组件上限,超出上限使用LRU的策略置换缓存数据。

内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。

案例:

在这里插入图片描述解决方法:

App.vue 组建中

<template>
  <div id="app">
  <keep-alive>
    <router-view/>
  </keep-alive>
  </div>
</template>

注意: 这样并没有结束,逻辑存在问题

在这里插入图片描述
使用到 keep-alivez自带的生命周期钩子activated

在vue对象存活的情况下,进入当前存在activated()函数的页面时,一进入页面就触发;可用于初始化页面数据等

在这里插入图片描述

代码:home.vue组件中

在这里插入图片描述

import { mapState } from 'vuex'

data () {
    return {
      lastCity: ''
    }
  },
computed : {
    ...mapState(['city'])
  },
activated () {
    if (this.lastCity !== this.city) {
      this.lastCity = this.city
      this.getHomeInfo() // ajax请求函数
    }
  }

在这里插入图片描述
逻辑问题解决。


4. 其他

小问题:

在这里插入图片描述
解决办法:
在当前div的class中把width改成min-width即可
在这里插入图片描述


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
APP开发过程中,常见的问题解决办法如下: 1. 兼容性问题:不同设备和不同Android版本可能会导致APP的兼容性问题,如UI界面显示异常或者某些功能无法使用。解决办法是在开发过程中进行兼容性测试,及时调整代码。 2. 性能问题:APP在运行时可能出现卡顿、卡死等性能问题,影响用户体验。解决办法是优化代码,减少资源占用,尽量避免在主线程中进行耗时操作。 3. 安全问题:APP可能存在数据泄露、恶意攻击等安全问题,影响用户隐私和安全。解决办法是在开发过程中加强数据加密、身份验证等安全措施,及时更新APP版本修复安全漏洞。 4. UI设计问题:APP的UI设计可能存在不合理或不美观的地方,影响用户体验。解决办法是在开发前进行充分的UI设计和评估,及时修改设计问题。 5. 第三方库问题:在APP开发中使用第三方库可能会存在兼容性、性能、安全等问题解决办法是选择可靠的第三方库,及时更新版本,避免使用过于庞杂的库。 6. 崩溃问题:APP运行时可能会出现崩溃,导致用户数据丢失。解决办法是及时收集崩溃信息,定位问题,及时修复程序缺陷。 7. 用户体验问题:APP在使用过程中可能会存在用户体验不佳的问题,影响用户满意度。解决办法是在开发过程中注重用户体验,进行多方位的测试和评估,及时优化APP。 总之,在APP开发过程中,不断优化代码,加强测试和评估,及时修复问题,才能开发出高质量的APP。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0rta1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值