vue列表渲染中的key

vue列表渲染中的key,第1张

当页面循环列表中有 input 标签,用户填写信息后,删除中间某一项。

例如:页面中循环列表长度为3,并含有input标签,将input中填入信息,删除中间第二项。

删除后

点击删除后

key 可以作为VNode的唯一标识,vue通过diff算法,加快查询节点的速度,删除对应的dom节点。

如果 index 作为key,删除后

当第二项删除的时候,第三项的下标2会变成1,index在改变,没有办法准确定位到需要删除的 DOM 节点。

vue 官方文档:

>

先部署好整体的逻辑样式,点击收藏变红心,未收藏是灰色

。将收藏状态缓存到localstorage里面,这样的话,刷新状态依然是收藏。

每个商家的页面url应该是有不同商家的id作为url参数的,我们要通过一个方法去拿到url

将方法抽离为公共函数,将url 的参数部分解析成一个对象,里面包含key:value这样的值

拿到url参数的方法:windowlocationsearch

使用正则表达式解析url参数为对象

拓展属性的方法: Objectassign()

方法:

1在一开始获取seller的时候,通过一个立即执行函数获取id。

APPvue

2定义公共方法urlParse

decodeURIComponent

正则 >

v-for循环中的key属性

使用v-for更新已渲染的元素列表时,默认用就地复用策略,列表数据修改的时候,他会根据key值去判断某个值是否修改,如果修改,则重新渲染这一项,否则复用之前的元素;我们在使用的时候经常会使用index(即数组的下标)来作为key,但其实这是不推荐的一种使用方法;

key值的使用其实是和vue响应式以及虚拟DOM有关。

这样vue就会分析到其他的数据都不需要改变,只需要在新增一个DOM节点,然后添加新增的数据就可以了。

但是,如果输入我们是在数组中间插入的数据就会不一样了。

即后面的节点会不断的更新,这样做就会很没效率。

所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

key的作用主要是为了高效的更新虚拟DOM,另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

建议尽可能在使用v-for时提供key,除非遍历输出的DOM内容非常简单,或者刻意依赖默认行为以获取性能上的提升。

这里我定义了一个列表数据,我将通过三个不同的按钮来控制列表数据。

调用方法:Vueset( target, key, value )

target:要更改的数据源(可以是对象或者数组)

key:要更改的具体数据

value :重新赋的值

<!DOCTYPE html><html><headlang="en"><metacharset="UTF-8"><title></title></head><body><divid="app2"><pv-for="item in items":key=" itemid ">{{itemmessage}}</p><buttonclass="btn"@click="btn2Click()">动态赋值</button>

<buttonclass="btn"@click="btn3Click()">为data新增属性</button></div><scriptsrc="//dist/vueminjs"></script><script>var vm2=new Vue({ el:"#app2", data:{ items:[ {message:"Test one",id:"1"}, {message:"Test two",id:"2"}, {message:"Test three",id:"3"} ] }, methods:{ btn2Click:function(){ Vueset(thisitems,0,{message:"Change Test",id:'10'}) }, btn3Click:function(){ var itemLen=thisitemslength; Vueset(thisitems,itemLen,{message:"Test add attr",id:itemLen}); } }});</script></body></html>

最近vue项目中遇到了一个比较棘手的问题: 例如第一个页面是列表,通过选中一行进入第二个页面展示选中内容的详细信息,这个时候选中的信息保存在vuex可是这个时候就出现了一个问题,我不能在第二个页面通过浏览器刷新,否则vuex数据清空,则第二个页面将会不知道展示什么内容了,显然这一是严重的bug!  前端开发众所周知在浏览器保存数据使用session或者cookie,这当然是可行的,不过如果每一条需要存储的信息都去执行存储到session然后在通过session的数据赋值到项目对应的数据下则导致项目看起来过于臃肿了

所以通过各种百度找出来vuex的 plugins ,可以很好的解决我遇到的问题, vuex 的用法就不介绍了,请参考官方文档

以下步骤是plugins的用法

LStoragegetItem(key): 通过key可以获取sessionStorage的value

LStoragesetItem(key, val): 存储数据

LStorageclear(): 清除所有的session记录

LStorageremoveItem(key): 删除制定的session记录

myPlugins函数里边的每次页面刷新的时候会先获取session的数据通过commit方法保存到vuex

storesubscribe方法是在关联store的commit事件,也就是只要你通过commit在修改vuex的数据这里的函数就会监听到,并且执行里边的内容保存数据到session

vuex添加plugins, myPlugins的参数可以根据自己的需要调整

好了关于这个问题就这样解决了,如果有什么不对的地方欢迎指正,献丑了O(∩_∩)O ~~

以上就是关于vue列表渲染中的key全部的内容,包括:vue列表渲染中的key、vue.js中如何获取data中map的value、vue实现收藏功能2018-10-17等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10129022.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存