连续预告了好几天,总算写到这篇了。

系列篇1:Vue 全站缓存之 keep-alive : 动态移除缓存

系列篇2:Vue 全站缓存二:如何设计全站缓存

本篇为系列篇3:Vue 全站缓存之 vue-router-then :前后页数据传递

系列篇4:Vue 全站缓存之 vue-router-then :实现原理

前言

在前文 Vue 全站缓存之 keep-alive : 动态移除缓存 和 Vue 全站缓存二:如何设计全站缓存 中,我们实现了全站缓存的基础框架,在页面之间后退或同层页面之间跳转时可以复用缓存,减少了请求频率,提升了用户体验,最赞的是,开发逻辑理论上会简单直观很多。

出现了一个新需求

在父子组件之间,数据可以通过 Prop 和 $emit 事件来互相传递数据。

在本系列里,我们研究的主题是前后页的组件缓存与复用,因为使用了 keep-alive 的缓存特性,虽然前一页在界面上已经被移出,在系统里,前后页组件对象仍然是同时存在的。

于是,一个新的需求自然而然的出现了,就是如何在前后页组件之间传递数据

store 模式和 vuex

前文也曾说过,为了在不同页面之间传递或共用数据,目前主流的方案是使用sotre模式或引入 vuex , 作为前后页面之外的公共组件,所有页面都可以直接对其存取数据。链接

这是一个很好的解决方案,可以兼容很多场景,而且很值得继续挖掘这个特性哦。

留个坑,最近在研究如何将这个Flux特性发挥到极致。

懒是人类进步的源泉

就我个人而言,我是很极端的懒,vuex 的确能解决前后页数据交流的问题,然而许多时候我仅仅只是打开一个页面选择一个客户回来而已。

如果能写成

<input v-model="searchText">
复制代码

我可不想写成:

<inputv-bind:value="searchText"v-on:input="searchText = $event.target.value"
>
复制代码

所以,还是商城的例子,如果在订单页面需要打开一个新页面去选择一个地址,我可不想从 vuex 那里绕一大圈写一堆State Mutation Action ,我希望写成下面这样:

<!-- buySomething.vue -->
<inputSelectedAddress v-model="item.addressID" v-model-link="'/select_address'"  placeholder="选择地址" /> <!-- selectAddress.vue -->
<template><ul><li @click="selectOneAddress(1)">北京路南广场东门101</li><li @click="selectOneAddress(2)">上海城下水道左边202</li></ul>
</template>
<script>methods:{selectOneAddress:function(addressID){this.$emit('input',addressID);this.$router.go(-1);}}
</script>
复制代码

打开一个地址选择页,选择好地址后,直接将地址 id 传回来,甚至直接和 v-model 兼容起来,然后该干啥干啥,这样的场景想想就很赞哇。

v-model-link

在上文的示例代码里出现了v-model-link这个自定义指令,这个指令来自插件 vue-router-then 的一个特性。链接

v-model-link的基本用法:

  • 在绑定v-model的元素上使用v-model-link指令指向一个新页面
  • 在新页面里用户互动之后,使用$emit触发一个input事件将数据传递回来即可更新v-model所对应的值。

请注意此处的场景差异:$emit本来是用来进行父子组件的事件传递的,在此处被挪用到了前后页组件之间传递事件,

原理简述:

  • v-model-link的值是一个 url 地址,在点击该指令所在的 DOM 元素后,会跳转到该 url 页面,并在新的页面里监听input事件反馈给指令所在的DOM 元素或组件。
  • 因为v-model就是一个input事件的语法糖,所以其对应的值会受input事件影响。
  • 因为缓存的存在,前一页组件没有被销毁,这才是vue-router-then这个插件成功使用的基础。
    • 所以,请注意正确设定各路由页面的层级关系,如果离开页面时组件被销毁了,可就没法玩了。

vue-router-then

vue-router-then的核心本质就是实现了在当前页操作下一页组件的功能,v-model-link只是该功能基础上的一个语法糖指令,当然也是最重要最常用的特性指令。

如何安装

npm install vue-router-then --save;
复制代码
import Vue from 'vue'
import router from './router'import routerThen from 'vue-router-then';
routerThen.initRouter(router)
Vue.use(routerThen)
复制代码

使用方法一:在当前页面操作下一页面的组件对象

该插件名为vue-router-then,顾名思义,其最大的特性是给router的方法(push,replace,go)返回了一个promise对象,并使用新页面的vm作为参数在then方法里供处理。

methods:{clickSomeOne:function(){this.$routerThen.push('/hello_world').then(vm=>{// 此处的 vm 即为新页面hello_world的组件对象console.log(vm);});},
}
复制代码

使用方法二:使用$routerThen.modelLink在当前页获得下一页面组件上报的input事件中的值

$routerThen中还新增了一个自定义方法modelLink,用来处理下一页面上报的值,该方法同样可以操控下一页面组件对象。


methods:{jumpToNextPage:function(value){this.$routerThen.modelLink('/select_price',value=>{// 此处获得select_price页面$emit出来的 input 事件中的值console.log(value);}).then(vm=>{// 此处的 vm 即为新页面select_price的组件对象console.log(vm);});},
}
复制代码

使用方法三:配合 v-model 使用自定义指令 v-model-link

<inputCustomer v-model="item.customerID" v-model-link="'/select_customer'" />
复制代码

再举个栗子

在我们的记应收这款记账APP中,有一个选择客户的页面,该页面支持搜索客户,如果搜索不到客户,则应该支持以关键字去建立一个客户并选中新客户。

也就是说涉及编辑合同->选择客户->新建客户这三个页面,其中核心代码如下:

编辑合同:

<!-- InitEditContractDetail.vue -->
<inputCustomer v-model="item.customerID" v-model-link="'/customer/select_customer'"/>
复制代码

选择客户:

<!-- InitSelectCustomer.vue -->
<template><div><input type="text" v-model="keyword" /><a @click="newCustomerJumpLink">新增</a></div>
</template>
<script>methods:{newCustomerJumpLink(){this.$routerThen.modelLink('/customer/edit',value=>{this.newCustomerAdded(value)}).then(vm=>{if (this.keyword){vm.$set(vm.item,'name',this.keyword);}});},newCustomerAdded:function(customerID){this.$emit('input',customerID);this.$router.go(-1);},}
</script>
复制代码

新增客户:

<!-- InitCustomerEdit.vue -->
<template><div><div>客户名称</div><input type="text" v-model="item.name" /><div class="btn_submit" @click="submit">提交</div></div>
</template><script>methods:{submit:function(){this.$emit('input',customerID);this.$router.go(-1);}}
</script>
复制代码

后语

到此时,应付大部分的项目场景应该没问题了。

后续还会发几篇相关文章,研究 vue-router-then 的原理,研究全站缓存这种极端情况下用户的数据又会发生什么奇怪的变化呢,又或者还能玩出哪些更有意思的花样呢。

敬请期待。

更新续篇:Vue 全站缓存之 vue-router-then 实现原理

原文来自阿星的博客:wanyaxing.com/blog/201807…

Vue 全站缓存之 vue-router-then :前后页数据传递相关推荐

  1. 七十、Vue城市页面Ajax动态渲染和兄弟组件数据传递

    2020/10/29. 周四.今天又是奋斗的一天. @Author:Runsen 写在前面:我是「Runsen」,热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的.大四弃算法转前端,需要每天的 ...

  2. vue依赖缓存_Vue SSR服务端渲染之数据缓存

    当咱们在作vue的服务器端渲染时,可能会碰到各类各样的坑,内存泄露就是其中的一种.固然,致使内存泄露的缘由有不少,不合理使用Axios也是其中一种,那下面我给你们介绍一下如何有效的避免请求中的内存泄露 ...

  3. vue可缓存的单页面多标签页

    先上传自己制作例子的截图吧,有时间的时候把重要代码片段再详细写下说明!! 源码请在下面这个地址下载 https://download.csdn.net/download/ying940718/1187 ...

  4. vue.js之定义组件和子父组件数据传递及函数的相互调用

    import Vue from 'vue'// 定义一个名称为componentOne的组件 const componentOne = {// props 用来接收父项所传递过来的数据,该数据是挂载在 ...

  5. vue中缓存当前路由的实现

    类似 这种情况 我们在分类页面查看到我们想要的 商品之后 然后我们去登陆页面登录上去 再重新返回分页页面的时候 还是显示着我们看到的效果 这样的效果我们可以使用 keep-alive 做到 用keep ...

  6. vue keep-alive 缓存 不生效解决方案

    一.作用 vue [缓存]方案,保留组件状态或避免重新渲染,能够缓存当前页面的所有数据 二.用法 与**[动态组件]**一起使用:(会缓存不活动的组件实例,而不是销毁它们) <keep-aliv ...

  7. Vue 学习(十、 Vue Router - 路由插件 和 Vue 的插件原理)

    文章目录 一.Vue Router - 路由插件 1. 安装 Vue Router 2. Vue Router 路由的基本使用 3. 设置 router-link 4. 编程式路由 5. 路由嵌套 6 ...

  8. [vue] 怎么缓存当前打开的路由组件,缓存后想更新当前组件怎么办呢?

    [vue] 怎么缓存当前打开的路由组件,缓存后想更新当前组件怎么办呢? 可以在路由meta中加入参数, 对打开的路由进行keep-alive的判断, 通过钩子active等 个人简介 我是歌谣,欢迎和 ...

  9. [vue] vue怎么缓存当前的组件?缓存后怎么更新?

    [vue] vue怎么缓存当前的组件?缓存后怎么更新? keep-alive 通过actived钩子 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 ...

  10. Vue之单文件组件的数据传递,axios请求数据及路由router

    1.传递数据 例如,我们希望把父组件的数据传递给子组件. 可以通过props属性来进行传递. 传递数据三个步骤: 步骤1:在父组件中,调用子组件的组名处,使用属性值的方式往下传递数据 <Menu ...

最新文章

  1. 用python设计学生管理系统_python+tkinter实现学生管理系统
  2. 明明安装了模块,还是出现 错误 ImportError: No module named ‘pandas‘ 原因LINUX上安装了多个python环境,将脚本中python 改为python3问题解
  3. Javascript数组操作(转)
  4. import com.sun.image.codec.jpeg.JPEGCodec不通过 找不到包
  5. java学习(131):hashtable
  6. numpy实现全连接网络进行mnist训练测试
  7. js字符串replace替换多个_汇总几大python常见字符串处理函数与用法(建议收藏)...
  8. SpringMvc 03 非注解形式下的映射器与适配器
  9. js removeEventListener删除匿名函数
  10. nginx工作笔记005---nginx配置负载均衡_在微服务中实现网关集群_实现TCP传输层协议__http协议的负载均衡
  11. java常用序列化与反序列化方法
  12. 使用electron-builder来打包
  13. python-图书管理系统2-整体 代码架构
  14. Word 2007~2010手动双面打印设置
  15. BP神经网络原理和算法推导流程(吴恩达机器学习)
  16. python期权定价代码_pythonspan data-e=6Zqc56KN/span式期权定价公式_Python_脚本语言_IT 经验_爱安网 LoveAn.com...
  17. 详解ELF可执行文件格式:读取头部信息和程序表头
  18. 保护Excel表格的4种常用方法
  19. {2018.4.12}荀(gou)彧(huo)同学的第一次考试小总结
  20. 交换机/路由器的存储介质

热门文章

  1. 第26周维生素市场最新动态
  2. Windows Phone 7(WP7)开发 获取网络状态
  3. 关于SQLServer2005的学习笔记——异常捕获及处理
  4. 漫画:什么是堆排序?
  5. Camera 初始化(Preview) 一(Framework-HAL3)
  6. SylixOS freescale powerpc p4080 pci msi 中断驱动
  7. L1- 017——024
  8. 全国日照时数空间分布数据/月度降雨量分布/月均气温分布
  9. hive 窗口函数 应用场景与实战详解
  10. python中input的用法霍格沃_欢迎来到霍格沃茨—魔法01 Python 环境安装