`
wangchuanyin
  • 浏览: 32724 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

VUE v-for 和 自定义指令 模型改变指令视图没更新的解决方法

 
阅读更多
本文章来自网络,仅仅做记录。

自定义指令和v-for共用,v-for的数据发生变化时,自定义指令传的参数并没有改变,还是第一次渲染是的参数,大概是这样的:
<template>
    <ul>
        <li v-for="item in list" v-tap="item">第{{ item }}个</li>
    </ul>
</template>
<script>
    data(){
        return{
            list:[ 1,2,3,4,5 ],
            list1:[ 'a','b','c','d' ]
        }
    },
    directives:{
        tap:{
            bind:function(el,binding){
            console.log(binding.value)
            //第一次渲染时,打印的是1,2,3,4
            //当list的值变成list1的值是,没有重新打印
            //也就是说,dom没有重新渲染,指令里接收的值还是1,2,3,4
            }
        }
    }
</script>

为什么dom没有重新渲染呢,这源于v-for的就地复用机制
官方的解释是:
当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。这个类似 Vue 1.x 的 track-by=”$index” 。

这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。理想的 key 值是每项都有的且唯一的 id。这个特殊的属性相当于 Vue 1.x 的 track-by ,但它的工作方式类似于一个属性,所以你需要用 v-bind 来绑定动态值 (在这里使用简写):

<div v-for="item in items" :key="item.id">
  <!-- 内容 -->
</div>
1
2
3
简单来说就地复用就是能继续用的dom就不重新渲染,这就导致了自定义指令传参一直是第一次渲染的数据,我试了一下官方的解决方案,确实可以,dom被强制渲染了,后来我想找一种自定义指令里就可以解决的方法,还真让我找到了,自定义指令钩子函数的第三个参数vnode:Vue 编译生成的虚拟节点。
打印这个虚拟节点里面有一个key,这个key就是上面说到的key,只要给他赋一个唯一的id,就可以强制dom刷新了

directives:{
    tap:{
        bind:function(el,binding,vnode){
            console.log(vnode)
            vnode.key = '一个唯一的id'
        }
    }
}
分享到:
评论

相关推荐

    vue 入门,v-model数据绑定

    `v-model`是Vue中的一个指令,用于实现双向数据绑定,它使得视图(View)与模型(Model)之间的数据同步变得简单。这种机制让开发者能够在用户界面的表单控件上直接操作数据,同时更新视图,极大地提高了开发效率。 ...

    Vue v-for中的 input 或 select的值发生改变时触发事件操作

    在Vue.js中,`v-for`指令用于循环遍历数组或对象,生成多个DOM元素。当使用`v-for`与`input`或`select`元素结合时,我们常常需要监听这些表单元素的值变化,以便在值发生变化时执行相应的操作。本文将详细介绍如何在...

    关于前端开发框架vue中的v-model双向绑定自定义组件(第二版)

    反之,当模型改变时,视图也会实时反映这些变化。这种机制简化了数据管理,使得前端界面的交互变得更加直观和简单。 二、`v-model`在自定义组件中的应用 在Vue中,你可以为自定义组件添加`v-model`支持,以便在父...

    ppt课件-第3章 Vue指令.zip

    它们以`v-`开头,如`v-if`, `v-for`, `v-bind`等,使得开发者能够方便地控制元素的显示、循环渲染和绑定数据。 2. **v-if与v-show**:这两个指令用于条件渲染。`v-if`是基于值的真假判断,如果表达式为真,则渲染...

    vue-admin-template (集成tagsview)

    插槽用于在组件内部插入自定义内容,而指令则提供了一些预定义的特殊属性,如v-if、v-for等,简化DOM操作。 9. **Echarts图表库**: 在管理后台中,数据可视化是常见的需求。Vue Admin Template可能会集成ECharts,...

    Vue中的v-model指令的原理是什么?vue文章经典面试题vue文章经典面试题

    同时,由于 Vue 使用了响应式系统,模型的改变会立即触发视图的更新。 3. **组件间的双向绑定**: `v-model` 不仅可以用于基础的表单元素,还可以用于自定义组件。自定义组件的 `v-model` 实现需要组件内部提供 `...

    vued3treeVUE实现自定义节点的树结构

    在这个项目中,Vue将用于构建UI界面,通过声明式模板语法将数据绑定到视图,使开发者能够专注于描述应用的状态,而不用关心如何更新DOM。 D3.js,另一方面,是数据驱动文档的缩写,它提供了一组强大的工具来处理和...

    ant-design-vue-jeecg.rar

    4. **指令系统**:如v-if、v-for等,它们是Vue.js中的特殊属性,用来处理条件、循环等逻辑。 5. **计算属性和侦听器**:用于响应式地处理复杂逻辑和监听数据变化。 6. **路由管理**:Vue Router 是Vue.js的官方路由...

    浅谈 Vue v-model指令的实现原理

    Vue.js 的 `v-model` 指令是其框架中非常关键的一部分,它极大地简化了双向数据绑定,使得开发者能够方便地在视图和模型之间建立连接。在本文中,我们将深入探讨 `v-model` 的实现原理,以及如何在自定义组件中使用...

    vue源码解析,所有功能讲解(vue2.0-source-master.zip)

    6. **指令系统**:Vue 提供了如`v-if`、`v-for`等指令,用于在模板中进行条件判断和循环。源码中的`directives`模块定义了这些指令的处理逻辑。 7. **计算属性和侦听器**:计算属性基于依赖缓存,只在依赖变更时...

    05_Vue基础-v-model表单.pptx

    Vue.js 是一款流行的前端框架,它的核心特性之一是数据绑定,而 `v-model` 指令则是实现双向数据绑定的关键。在 Vue 中,`v-model` 主要用于表单元素,如 `input`, `textarea`, `select` 等,以实时同步用户输入与...

    vue-element-admin-master

    - **指令系统**: Vue 提供了一系列预定义的指令,如 `v-if`、`v-for`、`v-bind` 和 `v-on`,简化了DOM操作。 - **生命周期钩子函数**: 允许在组件的不同阶段插入自定义逻辑,如 `created`、`mounted`、`updated` ...

    后台管理平台------vue---.rar

    - **响应式数据绑定**:Vue.js的核心特性之一,通过`v-model`指令实现视图与模型数据的双向绑定。 - **指令系统**:如`v-if`, `v-for`, `v-bind`, `v-on`等,简化DOM操作。 - **组件化**:Vue.js的组件是可复用的...

    vue2电商教程itcast-shop-vue2-master.zip

    9. **响应式系统**:Vue的响应式系统确保当数据改变时,视图会自动更新。这基于依赖追踪和代理对象实现。 10. **指令与插槽**:Vue还提供了一些内置指令,如`v-model`用于双向数据绑定,`v-slot`用于自定义插槽内容...

    vue2-day7.zip

    3. **指令**:Vue提供了多种内置指令,如`v-if`(条件渲染)、`v-for`(循环渲染)、`v-on`(绑定事件监听器)和`v-bind`(绑定属性)。它们在HTML元素上以`v-`开头,帮助我们扩展HTML的功能。 4. **计算属性**:在...

    Citypicker基于vue开发的城市模拟下拉组件

    1. 双向数据绑定:Vue.js通过`v-model`指令实现了视图和模型之间的双向绑定,当数据变化时,视图会自动更新;反之,用户对视图的操作也会同步更新到数据模型。 2. 模板语法:Vue.js使用简洁的HTML模板语法,允许...

    【JavaScript源代码】vue3.0自定义指令(drectives)知识点总结.docx

    在Vue.js框架中,自定义指令(Directives)是一种强大的工具,允许开发者扩展Vue实例的能力,直接操作DOM(文档对象模型)。Vue3.0引入了一些更新和改进,使其更加灵活和高效。以下是对Vue3.0自定义指令知识点的详细...

    【JavaScript源代码】Vue 3自定义指令开发的相关总结.docx

    指令的作用在于它们提供了与Vue的数据模型紧密集成的DOM操作方式,遵循MVVM模式,确保视图(View)和模型(Model)之间的数据自动更新。在某些情况下,内置指令可能不足以满足需求,这时可以自定义指令来实现更复杂...

    vue面试题目-vue经典面试题目-vue-Vue框架的核心概念-常用的功能和特性-性能优化-面试题目-面经

    - 双向数据绑定:通过`v-model`指令实现视图和模型之间的同步。 - 组件化:将UI拆分为可重用的组件,提升代码复用性和维护性。 - 轻量级:相比于其他框架,Vue.js的体积小,加载速度快。 - 易于上手:文档丰富,...

Global site tag (gtag.js) - Google Analytics