vue:使用不同参数跳转同一组件,实现动态加载图片和数据,以及利用localStorage和vuex持久化数据

需求:通过不同的参数复用同一组件,实现动态加载数据和图片,同时,在页面刷新时,图片依旧可以加载成功。

过程出现的bug和问题:

  1、使用params传参后,再次刷新页面,参数丢失导致数据无法再次加载

  2、改用query进行传参后,页面刷新后图片无法加载,这是由于图片的url是在created钩子函数调用查询数据api后才进行赋值,而赋值之后页面已经渲染完成,导致图片无法加载成功

解决方案:

  1、通过localStorage将数据持久化,在跳转到当前路由时,先使用localStorage将数据持久化,这里可以配合vuex进行操作

  2、页面渲染前,图片的url直接读取localStorage的值,就不会出现页面渲染完成,url还没被赋值导致图片无法加载的情况

附上代码:

  需要从 /zyview 跳转至 /viewmessage

  /zyview跳转部分:

      this.$router.push({
        // path: `/viewmessage/${this.names[index]}`,
        // 使用下列方法方法跳转路由,就不会出现点击tab后再次跳转的bug
        name: "viewmessage",
        query: {
          name: this.lists[index].m_name,   // 此为药品名称
          index: index,         // 药材索引
          mid: this.lists[index].id,  // 药材id
          // imgpath: this.lists[index].img_path
        },
      });

  触发跳转的方法:

    gotodescribe(e,index) {
      console.log(this.lists[index].id)
      console.log(this.test)
      const path = this.lists[index].img_path
      // 这里path和index是和store中actions方法里面的变量名意义对应,名字不对应无法传值
      this.$store.dispatch(‘addimagepath‘, {path,index})
      console.log("存储内容" + this.$store.state.imgpath.imgpaths[this.$route.query.index])
      this.$router.push({
        // path: `/viewmessage/${this.names[index]}`,
        // 使用下列方法方法跳转路由,就不会出现点击tab后再次跳转的bug
        name: "viewmessage",
        query: {
          name: this.lists[index].m_name,   // 此为药品名称
          index: index,         // 药材索引
          mid: this.lists[index].id,  // 药材id
          // imgpath: this.lists[index].img_path
        },
      });
    },

  这是跳转前将数据持久化的步骤:

this.$store.dispatch(‘addimagepath‘, {path,index})


以下为vuex部分,新建一个文件写此存储图片路径的模块:

const state = {
    // 图片路径
    imgpaths: [],
    // imgpaths: localStorage.getItem(imgpaths[index]),
    test: "b4b797913756456bb5ffd8d661ab79e5.jpg"
}
const getters = {

}
// 改变state状态
const mutations = {
    addimgpath(state,{path,index}){
        state.imgpaths[index] = path
        localStorage.setItem(index,path)  // 这里使用localStorage持久化数据,后面页面就直接读取localStorage中的数据
    }
}
const actions = {
    addimagepath(context,{path,index}){
        context.commit(‘addimgpath‘,{path,index})
    }
}

export default {
    state,
    getters,
    mutations,
    actions
}


   /viewmessage部分:

        <el-image
          :src="`http://image.zysuyuan.cn:8031/${this.path}`"
          style="width: 400px; height: 400px"
          :fit="fit"
          alt="药材"
        ></el-image>
  data() {
    return {
      path: localStorage.getItem(this.$route.query.index),
      .........
    }
}

  created和watch:

  created() {
    this.fetchData();
  },

  watch: {
    $route(to, from) {
      this.path = localStorage.getItem(this.$route.query.index);
      this.fetchData();
    }
  },

  

原文地址:https://www.cnblogs.com/flypig666/p/11779796.html

时间: 2024-09-30 19:45:18

vue:使用不同参数跳转同一组件,实现动态加载图片和数据,以及利用localStorage和vuex持久化数据的相关文章

asp.net向后台传参数动态加载图片

//向后台传参数动态加载图片 $(function() { $("#Button1").click(function() { var stockcode = getUrlParam("stockcode"); $.ajax({ //要用post方式 type: "Post", //方法所在页面和方法名 url: "IndustryChain.aspx/Photo", contentType: "application

EasyUI的treegrid组件动态加载数据问题的解决办法

http://www.jquerycn.cn/a_3455 —————————————————————————————————————————————————————————————————————————————————————— 最近涉及到treegrid组件的查询,需要根据查询条件动态更新EasyUI的treegrid组件的动态加载查询结果 搜遍了treegrid源码和文档发现treegrid是扩展自datagrid和tree的,不过以往利用datagrid的reload方法加参数的 方式

Vue动态加载异步组件

背景: 目前我们项目都是按组件划分的,然后各个组件之间封装成产品.目前都是采用iframe直接嵌套页面.项目中我们还是会碰到一些通用的组件跟业务之间有通信,这种情况下iframe并不是最好的选择,iframe存在跨域的问题,当然是postMessage还是可以通信的,但也并非是最好的.目前有这么一个场景:门户需要制作通用的首页和数据概览页面,首页和数据概览页面通过小部件来自由拼接.业务组件在制作的时候只需要提供各个模块小部件的url就可以了,可是如果小部件之间还存在联系呢?那么iframe是不好

vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多

一.思路分析和效果图 用vue来实现一个瀑布流效果,加载网络图片,同时有下拉刷新和上拉加载更多功能效果.然后针对这几个效果的实现,捋下思路: 根据加载数据的顺序,依次追加标签展示效果: 选择哪种方式实现瀑布流,这里选择绝对定位方式: 关键问题:由于每张图片的宽高不一样,而瀑布流中要求所有图片的宽度一致,高度随宽度等比缩放.而且由于图片的加载是异步延迟.在不知道图片高度的情况下,每个图片所在的item盒子不好绝对定位.因此在渲染页面前先获取所有图片的高度,是解决问题的关键点!这里选择用JS中的Im

ReportView动态加载带参数的RDCL文件

在vs里新建一个winform程序"ReportViewTest",在form1中添加一个reportView控件,from1的load事件如下: private void Form1_Load(object sender, EventArgs e) { DataSet ds = new DataSet(); try { ds = getDS(); } catch (Exception) { throw; } Microsoft.Reporting.WinForms.ReportDat

React-Native ListView加载图片淡入淡出效果的组件

今天练习项目中需要给listview在加载图片时增加一个淡入淡出的效果,因此干脆就自己封装了一个组件: 1 'use strict' 2 3 import React from 'react-native' 4 5 var { 6 Animated, 7 PropTypes 8 } = React 9 10 class AniImage extends React.Component { 11 static propTypes = { 12 url: PropTypes.string, 13 i

C#,动态加载DLL,通过反射,调用参数,方法,窗体

.net中常会用到动态加载DLL,而DLL中可能包含各种参数.方法.窗体,如何来调用动态加载这些参数.方法.窗体呢? 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System.Reflection命名空间 (1)   AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器 (2)   Assembly:程序集类 (3)   Module:模块类 (4)   Type:使用反射得到类型信息的最核心的类 他们之间是一种从属关系,也就是说,一个AppDomain可以

vue -- 动态加载组件

利用component及is占位符即可轻松实现动态切换加载tab栏 语法 <component :is="tabname"></component> 必须是is占位符,不能写别的,通过v-bind指令动态绑定属性 tabname就是我们要显示的组件名称 比如我们创建了三个子组件,并注册到了根组件中:one,two,three 那想要展示哪个子组件,就将组件名赋值给tabname this.tabname = one 原文地址:https://www.cnblog

vue 单文件组件中样式加载

在写单文件组件时,一般都是把标签.脚本.样式写到一起,这样写个人感觉有点不够简洁,所以就想着把样式分离出去. 采用import加载样式 在局部作用域(scoped)采用@import加载进来的样式文件,想法是美好的.以为这样加载进来的样式文件也只对当前组件有效:可现实是残酷的,这样加载进来的样式无法限制其作用域. <style scoped> @import "样式文件"; </style> 解决方案 采用 src属性加载样式. <style src=&q