VUE---7.事件&循环

本文详细介绍了Vue.js中的事件处理,包括事件绑定、事件修饰符(如.stop、.prevent等)以及按键修饰符的使用。同时,文章还探讨了循环(v-for)的用法,强调了在循环中使用key属性的重要性及其与Vue的diff算法的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、事件

二、按键

        1. 按键修饰符(内置)

        2. 自定义修饰符 event.key  

        3. 系统修饰符

        4. 组合修饰符  

三、循环


一、事件

         1. 绑定事件

        2. event事件对象

        3. 修饰符  

            .stop       阻止冒泡

            .prevent    阻止默认事件

            .capture    捕获阶段触发

            .self       只在自身(ev.target)触发事件,

            .once       只执行一次

            .passive    默认行为立即触发,不需等待函数执行完毕  => 感觉不成功(不怎么用)

        滚动事件,滚动条执行是等待事件函数执行完毕之后会触发

         示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            width: 200px;
            height: 300px;
            overflow: auto;
        }

        p {
            height: 150px;
        }
    </style>
</head>

<body>
    <div id="app">
        <div class="box" @scroll.passive="handlewhell">
            <p>{{name}}</p>
            <p>{{age}}</p>
            <div @click.once="handl">
                <p>1523</p>
                <button @click="handleClick">点击触发</button>
            </div>
        </div>
    </div>
   
    <script src="../vue.js"></script>
    <script>
        let vm = new Vue({
            el: "#app",
            // 存储数据位置
            data: {
                name: "pxr",
                age: 18,
                sex: "nba"
            },
            // 存储函数位置 
            methods: {
                handleClick(ev) {
                    console.log(ev);
                },
                // 父级事件
                handl(ev) {
                    console.log(ev.target);
                },
                // 滚轮事件
                handlewhell(){
                  for (let index = 0; index < 10000; index++) {
                    console.log(1);
                  }
                }

            }
        })

    </script>
</body>

</html>

二、按键

        1. 按键修饰符(内置)

            .enter

            .tab    配合keydown使用

            .delete (捕获“删除”和“退格”键)

            .esc

            .space

            .up

            .down

            .left

            .right

   

        2. 自定义修饰符 event.key  

            多个单词组成使用连接符   @keyDown.Arrow-Up="handleClick"

            示列: @keyDown.w="handleClick"

       3. 系统修饰符

            .ctrl

            .alt

            .shift

            .meta  => mac(command)

            按住其中一个 按其他键也会触发

            .exact 修饰符允许你控制由精确的系统修饰符组合触发的事件。

        4. 组合修饰符  

            根据你所学的修饰符进行组合

    补充

        1. ev.key 获取健码值

示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
      
    </style>
</head>

<body>
    <div id="app">
        <input type="text" @keyDown.up="handleClick">
      
    </div>
   
    <script src="../vue.js"></script>
    <script>
        let vm = new Vue({
            el: "#app",
            // 存储数据位置
            data: {
                name: "pxr",
                age: 18,
                sex: "nba"
            },
            // 存储函数位置 
            methods: {
                handleClick(ev) {
                    console.log(ev);
                },
                // 父级事件
                handl(ev) {
                    console.log(ev.target);
                },
                // 滚轮事件
                handlewhell(){
                  
                }

            }
        })

    </script>
</body>

</html>

三、循环

        A: 指令 v-for=""  执行迭代数据数组   循环选中的数据,

        B: 设置指令之后 根据数据进行循环次数

            第一项 数据

            第二项 下标

示例:

<div id="app">

        <div v-for="(item,index) of arr"> //谁用v-for谁循环

           <p>{{item}}---{{index}}</p>

        </div>

    </div>

 

<script>

        let vm = new Vue({

            el: "#app",

            // 存储数据位置

            data: {

                name: "pxr",

                age: 18,

                sex: "nba",

                arr: ["pxr","lisa","ylc","lusy"]

            },

            // 存储函数位置

            methods: {

               

            }

        })

     

    </script>

     C:v-for中的key

在我们开发程序时会遇到下面这种问题:

代码如下

<!DOCTYPE html> 
<html lang="zh-CN"> 
<head>
    
    <title>text</title> 
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        li{
            list-style: none;
        }
        a{
            text-decoration: none;
            color: inherit;
        }
 
    </style>
</head>
<body>
    <div id="app">
        <ul>
            <li v-for="item of arr">{{item}}<input type="text" name="" id=""></li>

        </ul>
        <button @click="handle">CLICK</button>
    </div>
    <script src="../../vue.js"></script>
    <script>
        let vm=new Vue({
            el:'#app',
            data:{
                arr:[1,2,3,4]
            },
            methods:{
                handle() {
                    this.arr.unshift(0)
                }
            }
        })
    </script>
</body>
</html>

运行结果如下

点击CLICK按钮会执行handle函数,像前面添加一个数组

 这样看似没有什么问题。。。。

但是如果返回到没有点击按钮事件之前,在第一个输入框里输入一些内容

 这个时候再点击CLICK按钮,会出现下面这种情况

这个时候就需要用到‘key’啦~

        v-for的key作用外加 diff算法的作用

        问题:  

            diff算法比较的问题, 旧虚拟dom与新虚拟dom比较有问题,

            解决添加key属性  :key="唯一值"

        key属性 => 让vue根据key属性的标识(唯一值)进行渲染

        key属性 => 默认绑定index下标

        diff算法相同节点直接引用  不相同节点删除重新创建, 内容不会比较

   这时我们在v-for后面加入key

 <ul>

            <li v-for="item of arr" :key="item">{{item}}<input type="text" name="" id=""></li>

 </ul>

我们来看一下运行结果

点击CLICK按钮

 

 这就是key的作用,会标识唯一值进行渲染!!

&lt;think&gt;嗯,用户遇到了&ldquo;Maximum call stack size exceeded&rdquo;这个错误,我需要解释清楚这个问题。首先,用户可能是在使用Vue Router时出现了无限循环的重定向。根据错误堆栈中的redirect和_createRoute反复出现,这应该是路由配置中的重定向规则导致递归了。 用户可能不太了解递归和堆栈溢出,我需要用简单的例子来说明。比如函数自己调用自己没有终止条件,导致调用栈爆满。然后联系到Vue Router的重定向设置,比如从路径A重定向到B,然后又从B重定向回A,形成循环。 接下来,要给出排查步骤。首先检查路由配置中的redirect属性,是否有循环。例如,用户可能在配置中定义了多个重定向,导致互相跳转。然后看动态路由参数是否有问题,比如path: &#39;/user/:id*&#39;这样的通配符可能意外匹配了多个路径,导致循环。还要注意嵌套路由中的重定向,可能在父路由和子路由之间形成了循环。 解决方案部分,要分步骤说明如何修改路由配置,避免循环。比如将绝对路径改为相对路径,或者在重定向时添加终止条件。同时,建议用户使用Vue Devtools检查路由跳转情况,或者添加日志来跟踪重定向过程。 可能用户对路由配置不太熟悉,所以需要具体的例子,比如展示错误的路由配置和修正后的正确配置。还要提醒用户检查是否有重复的路由定义,或者使用了带通配符的动态路由,这些都可能无意中导致问题。 最后,确保用户知道如何测试修改后的配置是否解决了问题,可能需要清除浏览器缓存或重启开发服务器。另外,如果用户有其他潜在的问题,比如导航守卫中的逻辑错误,也可能导致类似问题,但根据错误堆栈,这次的重点还是在路由配置上。&lt;/think&gt;这个错误表示代码中出现了 **无限递归调用**,常见于路由配置错误或函数循环调用。我们结合你提供的Vue-router错误堆栈来分析: --- ### **错误本质解释** `RangeError: Maximum call stack size exceeded` 表示JavaScript引擎的调用栈被填满(通常超过10,000层)。在Vue-router场景中,**路由配置的循环重定向**是典型诱因。 --- ### **错误触发原理(递归演示)** ```javascript // 典型错误示例:函数无限递归 function loop() { loop(); // 每次调用都会向调用栈压入新帧 } loop(); // 最终栈溢出 ``` --- ### **针对你案例的具体分析** 从错误堆栈可见 `redirect &rarr; _createRoute &rarr; match &rarr; redirect` 的循环,**根本原因是路由配置中存在相互跳转的死循环**,例如: ```javascript // 错误配置示例 const routes = [ { path: &#39;/a&#39;, redirect: &#39;/b&#39; }, // A跳B { path: &#39;/b&#39;, redirect: &#39;/a&#39; } // B跳A &rarr; 形成闭环 ]; ``` --- ### **分步排查与解决方案** #### **第一步:检查路由重定向配置** 1. 检查所有包含 `redirect` 属性的路由 2. 确保重定向链有**明确终点**(最终指向没有重定向的路由) 3. 典型错误模式: ```javascript // 错误:动态路径参数导致循环 { path: &#39;/user/:id*&#39;, // 通配符可能匹配意外路径 redirect: &#39;/profile/:id&#39; // 可能产生相同结构的路径 } ``` #### **第二步:检查嵌套路由配置** ```javascript // 错误示例:父路由重定向到子路由,而子路由又包含父路由路径 { path: &#39;/parent&#39;, redirect: &#39;/parent/child&#39;, // 父跳子 children: [ { path: &#39;child&#39;, redirect: &#39;/parent&#39; // 子跳父 &rarr; 形成闭环 } ] } ``` #### **第三步:验证动态路径匹配** ```javascript // 错误示例:动态参数匹配范围过大 { path: &#39;/:pathMatch(.*)*&#39;, // 通配符路由 redirect: &#39;/404&#39; // 若/404也被通配符捕获 &rarr; 循环 } ``` --- ### **修正方案** 1. **绝对路径转相对路径**: ```javascript // 修改前(危险) redirect: &#39;/absolute/path&#39; // 修改后(安全) redirect: &#39;relative-path&#39; // 相对于当前路径 ``` 2. **添加终止条件**: ```javascript { path: &#39;/user/:id&#39;, redirect: to =&gt; { // 添加逻辑判断阻止无限跳转 if (isValid(to.params.id)) return &#39;/profile/&#39; + to.params.id else return &#39;/error&#39; } } ``` --- ### **调试技巧** 1. **使用Vue Devtools** 观察路由跳转轨迹 2. **添加路由守卫日志**: ```javascript router.beforeEach((to, from, next) =&gt; { console.log(&#39;[Navigation]&#39;, from.path, &#39;&rarr;&#39;, to.path) next() }) ``` --- ### **扩展知识:调用栈工作原理** JavaScript引擎使用 **LIFO(后进先出)栈结构** 管理函数调用。每次函数调用会压入栈帧,当递归深度超过引擎限制(Chrome约1-2万层)时触发此错误。 通过上述排查和修正,应该能解决你遇到的循环重定向问题。如果问题仍未解决,建议提供具体的路由配置代码片段进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值