解决Vue常见的数据渲染或缓存问题

2 篇文章 0 订阅

一、vue路由加载页面时,数据返回慢的问题

          vue路由加载页面时,数据返回慢的时候页面会有闪动的效果,数据加载前和加载后的区别。(特别是el-table表格数据)

 解决方案:

       使用vue-router的 路由守卫 beforeRouteEnter,组件内直接定义以下路由导航守卫,和钩子函数的写法一样,下面列出三种路由守卫:

    beforeRouteEnter(to,from,next)0{
        // 在渲染该组件的对应路由被 confirm 前调用// 不!能!获取组件实例 `this`
        // 因为当守卫执行前,组件实例还没被创建
    }


    beforeRouteUpdate(to,from,next){
        // 在当前路由改变,但是该组件被复用时调用
        // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
        // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
        // 可以访问组件实例 `this`
    }

    beforeRouteLeave(to,from,next){
        // 导航离开该组件的对应路由时调用// 可以访问组件实例 `this`
    }

二、vue-router ---- 导致页面样式错乱,刷新又好了的问题

      解决办法:  在跳转前和跳转后页面的style上加上scoped,把公共样式写到分别写到子组件就OK了

<style scoped>
@import "../../assets/public.css";
  header{
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
  }
</style>

scoped属性(可选属性):会自动添加一个唯一的属性 (比如 data-v-21e5b78) 为组件内 CSS 指定作用域,即css样式只在当前页面加载

如果引入了外部框架,很可能用了全局css,可能会影响你的部分样式,通过审查元素去定位问题就可以了。


三、vue-router ---- 解决页面刷新和路由改变时导航条样式问题

场景问题:

  1.当我们在使用路由时,如果有导航条此时,我们在url地址栏目改变路由地址,此时路由内容更改但,导航条样式没有随着改动

  2.当页面刷新时,url导航地址栏的路由和当前页面显示的不一致

解决办法:

 1.通过watch监听路由地址的改变

 2.使用钩子函数,改变路由

  export default {
    name: 'App',
    data(){
      return {
        msg:'App.vue',
        currentRouter:'/'
      }
    },
    methods:{
     
    },
    watch:{
      '$route':function(to,from){
          this.currentRouter=to.path;
      }
    },
    beforeMount(){
        this.currentRouter=this.$route.path;
    }
  }

四、解决vuex数据页面刷新后初始化问题

       场景:在vue项目的开发中经常会用到vuex来进行数据的存储,然而在开发过程中会出现刷新后页面的vuex的state数据初始化问题!下面是我用过的解决方法

1、利用storage缓存来实现vuex数据的刷新问题 
             我们可以在mutation等vuex的方法中对于数据进行改变时,将数据同时存储进我们的本地浏览器缓存中;下面是我在mutation中写的方法; 

同步将数据的更改保存,也可以在页面调用vuex的mutation方法时同步更改;但是这种方法只能针对少量的数据需要保持不刷新,在真正的卡发中并不适用

2、利用已有的插件来进行保存新状态 
         一致的插件中,我目前使用的是vuex-along插件,该插件使用非常方便简洁。

通过 cnpm i vuex-along -D下载插件,在进行引入,在store里面通过plugin来使用,这样就能将所有的state的数据都进行保存,不回应为刷新而更改,当然如果你想仅对某些数据进行保存,也可以使用对应的插件的api来实现  

 实例:https://github.com/xlanjin/automaticRecovery


五、解决vue首屏加载慢,白屏的问题

      1、v-loading 减慢table的渲染速度

      2、使用vue的服务端渲染(ssr);ssr优点是seo优化,以及加快首屏加载 

      3、开启gzip压缩

// 以vue-cli脚手架为例  找到config下index.js文件
 
build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/index.html'),
 
    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
 
    /**
     * Source Maps
     */
 
    productionSourceMap: true,
    // https://webpack.js.org/configuration/devtool/#production
    devtool: '#source-map',
 
    // Gzip off by default as many popular static hosts such as
    // Surge or Netlify already gzip all static assets for you.
    // Before setting to `true`, make sure to:
    // npm install --save-dev compression-webpack-plugin
    // 设置生产环境gzip为true
    productionGzip: true,   
    productionGzipExtensions: ['js', 'css'],
 
    // Run the build command with an extra argument to
    // View the bundle analyzer report after build finishes:
    // `npm run build --report`
    // Set to `true` or `false` to always turn it on or off
    bundleAnalyzerReport: process.env.npm_config_report
  }

      4、路由懒加载


// 需要ES6支持
const HelloWorld = () => import('@/components/HelloWorld.vue')
export default new Router({
  routes: [
        { path: '/', name: 'HelloWorld', component: HelloWorld },
  ]
})

或

const HelloWorld = resolve => require(['@/components/HelloWorld.vue'], resolve)
export default new Router({
  routes: [
        { path: '/', name: 'HelloWorld', component: HelloWorld },
  ]
})

       5、使用webpack的externals属性把不需要打包的库文件分离出去,减少打包后文件的大小:文件压缩,js、图片压缩后返回前台,以及图片格式的选择

// index.html中引入对应的文件或使用cdn
 
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
 
 
// 在webpack基础配置中添加以下代码
 
module.exports = {
  //...
  externals: {
    jquery: 'jQuery'
  }
};

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Vue中,解决跳转同一路由后数据缓存有几种方式。 1. 使用<router-link>的replace属性:将<router-link>的replace属性设置为true,可以在跳转时替换浏览器的历史记录,这样在跳转后再返回到该路由时,不会触发数据缓存。 2. 使用<keep-alive>组件:将需要缓存数据的组件包裹在<keep-alive>标签中,<keep-alive>会缓存组件的状态,当再次访问该组件时,会直接从缓存中读取数据,而不是重新渲染。 3. 在路由配置中设置meta属性:在路由配置的meta属性中添加一个标志位,用来标记该路由是否需要缓存数据。然后在组件的created或mounted钩子函数中判断这个标志位,根据需要决定是否重新获取数据。 4. 使用beforeRouteEnter和beforeRouteUpdate守卫:在路由配置的beforeRouteEnter守卫中,可以通过to和from参数判断当前路由是否为同一路由,如果是,则可以手动调用next函数来执行组件的渲染逻辑,避免数据缓存。在beforeRouteUpdate守卫中也可以使用相同的方法来判断是否需要重新获取数据。 综上所述,Vue中可以通过设置<router-link>的replace属性、使用<keep-alive>组件、在路由配置中设置meta属性或使用守卫来解决跳转同一路由后数据缓存问题。根据具体需求选择合适的方法即可。 ### 回答2: 在Vue中,可以通过以下几种方式来解决跳转同一路由后数据缓存问题: 1. 使用key属性:在路由的<router-view>标签中添加:key=" $route.fullPath"属性。这样,每次路由切换时,Vue会重新创建组件,从而避免了数据缓存。 2. 使用$route的钩子函数:Vue的$route对象提供了多个钩子函数,可以在路由切换的不同生命周期中做一些操作。其中,beforeRouteUpdate钩子函数可以在组件复用时进行特定的逻辑处理,例如清空数据、重新获取数据、判断数据是否需要更新等。 3. 使用watch监听$route对象的变化:可以通过watch监听$route对象的变化,在路由变化时触发相应的操作,例如清空数据、重新获取数据等。 4. 使用Vuex进行数据管理:将需要缓存数据存储到Vuex中,通过mutations对数据进行更新。这样,在路由重新渲染时,可以及时从Vuex中获取最新的数据。 5. 使用keep-alive组件:将需要缓存的组件包裹在<keep-alive>标签中,这样在路由切换时,组件的状态和数据会被缓存下来,不会被销毁和重新创建,从而实现数据缓存。 综上所述,Vue提供了多种解决跳转同一路由后数据缓存的方式,可以根据实际需求选择相应的方法来解决问题。 ### 回答3: 在Vue中,可以通过使用路由导航守卫和缓存组件来解决跳转同一路由后数据缓存问题。 1. 使用路由导航守卫:在进入路由之前,可以通过beforeRouteUpdate钩子函数来检查当前路由是否与上一个路由相同。如果相同,则可以手动清除掉之前路由的数据缓存,可以使用如下代码: ``` beforeRouteUpdate(to, from, next) { if (to.path === from.path) { // 清除数据缓存的操作 } next(); } ``` 2. 使用缓存组件:可以为需要缓存的组件设置一个keep-alive标签,使组件在切换路由时保持缓存状态。例如: ``` <template> <keep-alive> <router-view></router-view> </keep-alive> </template> ``` 这样,即使跳转到同一路由,之前的数据仍然会被缓存,不会丢失。 需要注意的是,使用缓存组件时,如果希望在重新进入路由时更新数据,可以在组件中使用activated钩子函数,该钩子函数会在组件激活时调用。例如: ``` activated() { // 更新数据的操作 } ``` 综上所述,通过使用路由导航守卫和缓存组件,可以解决Vue中跳转同一路由后数据缓存问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值