Vue指令之v-on

v-on指令用于注册事件,作用是添加监听与提供事件触发后对应的处理函数。

v-on有两种语法,在提供处理函数的时候既可以直接使用内联语句,也可以提供函数的名字。

第一种语法是直接提供内联语句,如下

v-on:事件名 = "内联语句"

Tips:注意v-on:的冒号后面不要加空格,加上之后会导致事件不响应。

举个例子,要实现两个加减按钮控制显示数字的增减,可以如下编写代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
    <div id="app">
        <!-- 按钮,v-on:后别加空格 -->
        <button v-on:click="number--">-</button>
        <!-- sapn是小盒子,一行可以多个(div是大盒子,一行只能有一个) -->
        <span>{{ number }}</span>
        <button v-on:click="number++">+</button>
    </div>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                number: 100,
            }
        })
    </script>
</body>
</html>

v-on:click表示监听点击事件,而等号后面则是出现了点击事件后要执行的语句。渲染后效果如下,可以点击按钮实现数字的增减。
在这里插入图片描述
click换成其他事件同样成立,比如鼠标进入事件mouseenter

同时,v-on:可以简写成@,如下,可以实现同样的功能。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
    <div id="app">
        <!-- 按钮 -->
        <button @mouseenter="number--">-</button>
        <!-- sapn是小盒子,一行可以多个(div是大盒子,一行只能有一个) -->
        <span>{{ number }}</span>
        <button @mouseenter="number++">+</button>
    </div>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                number: 100,
            }
        })
    </script>
</body>
</html>

显然,直接写内联语句适用于一些简单的功能,而复杂的功能则最好用函数来写,因此v-on的第二种语法就是传入函数名,改函数名应在实例化Vue实例的时候由methods属性提供。

v-on:事件名 = "methods中的函数名"

在下面的例子中,我们用一个按钮来控制文本的显示/隐藏,将该功能写在methods中的函数reverse中,使得控制该文本显示的变量翻转。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
    <div id="app">
        <!-- 传入函数名reverse -->
        <button @click="reverse">display/hide</button>
        <div v-show="isShown">ShadyPi</div>
    </div>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                isShown: true,
            },
            methods: {
                reverse () {
                    //注意这里要加app.或this.,否则找不到该变量
                    this.isShown = !this.isShown
                    console.log("click button")
                }
            }
        })
    </script>
</body>
</html>

点击按钮,即可控制文本显示隐藏,同时控制台输出调试信息。
在这里插入图片描述
自然地,这个函数也可以有参数传入,比如设置多个按钮,一个+3,一个+10.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
    <div id="app">
        <div>{{ number }}</div>
        <button @click="add(3)">+3</button>
        <button @click="add(10)">+10</button>
    </div>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                number: 100,
            },
            methods: {
                add (delta) {
                    this.number += delta
                }
            }
        })
    </script>
</body>
</html>

可以实现为数字加上不同的值得功能。
在这里插入图片描述

<template> <view> <Navbar title="八股文详情"> </Navbar> <ShowTips></ShowTips> <SlidePage @loadData="loadDataNext"> <view class="question-detail"> <view class="title-info"> <QuestionItem :data="questionData" :showDetail="false"></QuestionItem> </view> <view class="question" v-if="questionData.question"> <view class="question-title">问题描述</view> <uvParse class="rich-text" :content="questionData.question" :container-style="containerStyle" ></uvParse> </view> <view class="line"></view> <view class="question-content" v-if="readMode === '1' || (readMode === '0' && showAnswer)" > <view class="title">-<text class="inner">问题解析</text>-</view> <uvParse class="rich-text" :content="questionData.answerAnalysis" v-if="questionData.answerAnalysis" :container-style="containerStyle" ></uvParse> </view> </view> </SlidePage> <Footer :objectId="questionData.questionId + ''" :collectType="1" @updateCollect="updateCollect" :haveCollect="questionData.haveCollect" > <view class="page-op"> <view class="btn btn-mode" @click="changeMode"> <text>{{ readMode == "0" ? "背题模式" : "阅读模式" }}</text> <text class="iconfont icon-exchange"></text> </view> <view class="btn show-answer" v-if="readMode === '0'" @click="showAnswerHandler" >查看答案</view > </view> </Footer> </view> </template> <script setup> import uvParse from "@/pages/components/uv-parse/components/uv-parse/uv-parse.vue"; import QuestionItem from "./QuestionItem.vue"; import { LOCAL_STORAGE_KEY } from "@/utils/Constants.js"; import { onLoad } from "@dcloudio/uni-app"; import { ref, reactive, getCurrentInstance, nextTick } from "vue"; 总结这段代码的代码功能流
03-17
<think>好的,我需要分析用户提供的Vue代码片段中的各个组件和逻辑处理函数之间的交互关系与功能实现。首先,我会逐一查看每个组件的功能,然后理解它们如何通过Vue的机制进行通信和协作。 首先看Navbar组件。它可能负责顶部导航栏,包含模式切换按钮,比如“背题模式”和“答题模式”。这里涉及到changeMode函数,当用户切换模式时,这个函数会被触发,可能通过Vuex或props来更新应用的状态,影响其他组件的显示方式,比如题目是否显示答案。 接下来是ShowTips组件,可能用于显示提示信息,比如收藏状态的变化。当用户点击收藏按钮时,updateCollect函数会被调用,这里可能通过inject获取父组件提供的方法,然后调用collectHandle。成功后,ShowTips会显示提示,比如“收藏成功”或“已取消收藏”。这说明ShowTips依赖于父组件或通过provide/inject机制获取显示内容。 SlidePage组件处理滑动翻页,监听左右滑动事件来触发loadDataNext函数,加载下一页或上一页的数据。loadDataNext可能通过API获取数据,并更新当前显示的题目数据。这里涉及到异步操作,可能需要处理加载状态和错误提示。 Footer组件显示在底部,包含收藏按钮和提交按钮。收藏按钮绑定updateCollect方法,提交按钮可能触发提交动作。Footer的显示可能通过全局状态管理,或者根据路由动态显示,如引用[3]提到的使用v-on:footer事件来控制显示。 逻辑处理函数方面,loadDataNext负责数据加载,可能使用axios或fetch进行API调用,更新数据后触发重新渲染。updateCollect处理收藏逻辑,可能通过inject获取收藏方法,如引用[1]中的inject用法。changeMode切换应用模式,影响其他组件的行为,比如是否直接显示答案。showAnswerHandler可能在答题模式下显示答案,与SlidePage中的题目展示联动。 组件间通信主要通过Vue的provide/inject机制,比如父组件提供collectHandle方法,子组件通过inject获取并调用。引用[1]提到inject的使用,说明跨组件通讯的可能。事件监听如@swipe-left和@swipe-right处理滑动,触发数据加载。引用[2]中的ref绑定可能用于获取组件实例,但需注意正确绑定以避免失败。 总结各组件的关系:Navbar控制模式切换,影响SlidePage的显示方式;SlidePage通过滑动加载数据,触发loadDataNext;Footer中的按钮触发收藏和提交,与ShowTips联动显示提示;所有组件通过状态管理和事件传递协同工作,实现完整的题目练习功能。</think>### Vue组件功能流程分析 #### 1. 组件结构及核心功能 - **Navbar**:顶部导航栏组件,包含模式切换按钮 - 通过`changeMode`实现背题/答题模式切换 - 模式状态通过Vuex或props传递到子组件[^1] - **ShowTips**:全局提示组件 - 显示收藏状态变化提示(如"收藏成功") - 通过`v-if="showTips"`控制显隐,与`updateCollect`联动 - **SlidePage**:滑动翻页组件 - 监听`@swipe-left`/`@swipe-right`事件触发`loadDataNext` - 根据`currentMode`显示答案或题目(`showAnswerHandler`) - **Footer**:底部操作栏 - 包含收藏按钮和提交按钮 - 使用`inject('isShowFooter')`控制显示逻辑[^3] #### 2. 关键交互流程 $$ \begin{cases} \text{模式切换} \xrightarrow{changeMode} \text{更新currentMode} \xrightarrow{watch} \text{SlidePage重渲染}\\ \text{滑动操作} \xrightarrow{loadDataNext} \text{API请求} \xrightarrow{then/catch} \text{数据更新/错误提示}\\ \text{收藏操作} \xrightarrow{updateCollect} \xrightarrow{inject('collectHandle')} \text{ShowTips提示} \end{cases} $$ #### 3. 核心函数实现 ```javascript // 数据加载示例 const loadDataNext = (direction) => { loading.value = true API.get(`/next?dir=${direction}`) .then(res => { questionData.value = res.data currentIndex.value = direction === 'next' ? 0 : res.data.length-1 }) .finally(() => loading.value = false) } // 模式切换示例 const changeMode = () => { currentMode.value = currentMode.value === 'exam' ? 'study' : 'exam' localStorage.setItem('mode', currentMode.value) // 状态持久化 } ``` #### 4. 组件通信机制 1. **provide/inject**:父组件提供`collectHandle`方法,`updateCollect`通过`inject`调用 2. **事件传递**:`@swipe-left`事件绑定到`loadDataNext('prev')` 3. **ref绑定**:`<SlidePage ref="slider">`用于直接调用组件方法[^2] 4. **状态管理**:通过Vuex或组合式API共享`currentMode`状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值