Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)

目录

响应式数据

ref

reactive

事件绑定指令 v-on

v-on 鼠标监听事件

 v-on 键盘监听事件

 v-on  简写形式

 属性动态化指令 v-bind

iuput标签动态属性绑定

img标签动态属性绑定

b标签动态属性绑定

 v-bind 简写形式

条件渲染指令 v-if

 遍历指令 v-for

遍历对象的值 

 遍历对象的值和索引

 遍历对象的值和键

 遍历对象的值,键和索引

 指令嵌套

 项目实战

文字按钮切换图片

v-on切换上一张

v-on切换下一张

v-bind绑定图片的路径

 数字按钮跳转图片

数字按钮

跳转函数设置

跳转函数绑定

完整代码


响应式数据

响应式数据是指数据在改变时能够自动更新,我们可以通过 ref, reactive 让数据变成响应式

ref

可以定义基本类型的响应式变量

let xxx=ref(初始值)

<div id="app">   
        <p>个人信息:</p>
        <p>性别:{{ gender }}</p>
        <p>年龄:{{ age }}</p>
        <button @click="genderChange">点击更改性别</button>
        <br>
        <button @click="ageChange">点击年龄加1</button>
    </div>
    <script type="module">
        // 导入响应数据类型 ref
        import {createApp,ref} from"./vue.esm-browser.js"
        createApp({
            setup(){
                
                let gender = "女";
                let age = ref(25);

                const genderChange=()=> {
                gender.value = "男";
                console.log("成功修改性别")
                
                }

                const ageChange=()=> {
                age.value += 1;
                 console.log("成功加1")
                }
                return{
                    gender,
                    age,
                    genderChange,
                    ageChange
                }


            }
        }).mount("#app");

    </script>

reactive

定义对象类型数据

<div id="app">   
        <p>个人信息:</p>
        <p>年龄:{{ test_1.age }}</p>
        <p>性别:{{ test.gender }}</p>
        <button @click="ageChange">点击年龄加1</button>
        <br>
        <button @click="genderChange">点击更改性别</button>
      
    </div>
    <script type="module">
        // 导入响应数据类型 reactive
        import {createApp,reactive} from"./vue.esm-browser.js"
        createApp({
            setup(){

                const test={
                    gender:"女"
                };

                const genderChange=()=> {
                test.gender = "男";
                console.log("成功修改性别")
                }

                const test_1=reactive({
                    age:18
                });

                const ageChange=()=> {
                test_1.age +=1;
                console.log("成功加1")

                }
                return{
                    test,
                    test_1,
                    genderChange,
                    ageChange
                }


            }
        }).mount("#app");

    </script>

事件绑定指令 v-on

用于监听DOM事件并触发对应的方法,和JS中的监听器一样,可以在HTML元素上添加事件监听器,当这个事件被触发时,会执行指定的方法。

格式:v-on  :  click(监听的事件如:键盘或鼠标事件)="test_2"(监听的节点)

v-on 鼠标监听事件

 v-on  :  click(鼠标事件)="test_2"(监听的节点)

    <div id="app">     

    <h2>{{test_1.name}}</h2>
    <button v-on:click="test_2">单击修改名字!</button>

    </div>
    <script type="module">



        import {createApp,ref,reactive} from"./vue.esm-browser.js"
        createApp({
            setup(){

初始值
                const test_1=reactive({
                    name:"木木",
                });

修改的值
            const test_2=()=>{
                test_1.name="花花"
                console.log("鼠标单击成功!");
            }

返回的值
            return{
                test_1,
                test_2,
            }

            }
        }).mount("#app");

    </script>

 单击按钮后

 v-on 键盘监听事件

v-on  :  keyup . v(监听键盘“  v ”)="test_2" (监听的节点)

            enter space tab 按键修饰符

            keyup是在用户松开按键时才触发

            keydown是在用户按下按键时立即触发

    <div id="app">     
    
    <h2>{{test_1.name}}</h2>
    <button v-on:keyup.v="test_2">按下键盘v即可修改名字!</button>

    </div>


    <script type="module">
        import {createApp,ref,reactive} from"./vue.esm-browser.js"
        createApp({
            setup(){
初始值            
            const test_1 = reactive({
                    name: "花花",
                });
修改值    
                const test_2 = () => {
                    test_1.name ="木木",
                    console.log("键盘修改名字成功!");
                }
返回值
            return{
                test_1,
                test_2,
            }

            }
        }).mount("#app");

    </script>

按下键盘前 

按下键盘后 

v-on 键盘组合快捷键: 


<button v-on:keyup.ctrl.enter="test_2">按下ctrl+enter即可修改名字!</button>

<button v-on:keyup.ctrl.a="test_2">按下ctrl+a即可修改名字!</button>

 v-on  简写形式

将 v-on: click 改为  @click  即为简写状态

以下为v-on 键盘事件和鼠标事件的简写形式:

<button @click="test_2">单击修改名字!</button>


<button @keyup.enter="test_2">按下键盘enter即可修改名字!</button>
<button @keyup.Tab="test_2">按下键盘Tab即可修改名字!</button>
<button @keyup.space="test_2">按下键盘enter即可修改名字!</button>


 属性动态化指令 v-bind

用于将数据绑定到HTML元素的属性上。通过v-bind,将Vue的数据动态地绑定到HTML标签的属性上,可以动态显示数据。v-bind指令可以用于绑定HTML元素的任何属性。

格式: v-bind  :  src(标签内属性) =  "test.img"

iuput标签动态属性绑定

  <div id="app">     
   <img v-bind:src="test.img" ><br>
   <button @click="change">单击更换照片</button>
    </div>


    <script type="module">
        import {createApp,ref,reactive} from"./vue.esm-browser.js"
        createApp({
            setup(){


               const test=reactive({
                img:"./img_src/logo1.png",
               });


               const change=()=>{
                test.img=`./img_src/logo2.png`;
                console.log("成功更换照片");
               }


               return{
                test,
                change,
               }

            }
        }).mount("#app");

    </script>

img标签动态属性绑定

 <div id="app">     
   <input type="text" v-bind:value="test.word"><br>
   <button @click="change">单击补充句子</button>
    </div>


    <script type="module">
        import {createApp,ref,reactive} from"./vue.esm-browser.js"
        createApp({
            setup(){


               const test=reactive({
                word:"I need ",
               });


               const change=()=>{
                test.word+="you";
                console.log("句子补充完整啦!")
               }


               return{
                test,
                change,
               }


            }
        }).mount("#app");

    </script>

 单击前

单击后 

b标签动态属性绑定

 <style>
        .wordColor{
            color: blue;
        }
    </style>
</head>
<body>
    <div id="app">     
    
    <b v-bind:class="{wordColor:test.wordStatu}">你好!!</b><br>
    <button @click="change">单击更改文字颜色</button>

    </div>
    <script type="module">
        import {createApp,ref,reactive} from"./vue.esm-browser.js"
        createApp({
            setup(){
设置控制文本颜色的开关为 false
               const test=reactive({
                wordStatu: false
               });
当用户单击后,控制文本颜色的开关为  true
               const change=()=>{
                test.wordStatu=!test.wordStatu;
                console.log("颜色更改成功!");
               }


               return{
                test,
                change,
               }

            }
        }).mount("#app");

单击后 

 v-bind 简写形式

<img :src="test.img" >
<input type="text" :value="test.word">
<b :class="{wordColor:test.wordStatu}">你好!!</b>

条件渲染指令 v-if

可以隐藏节点,v-if是通过删除节点实现隐藏。当遇到需要频繁显示和隐藏的场景时,不适合使用v-if, 因为频繁增删节点,会导致渲染效率下降

 <div id="app">     
    
    <b v-if="test.word">你好!!</b><br>
    <button @click="change">单击隐藏文字</button>
    </div>


    <script type="module">
        import {createApp,ref,reactive} from"./vue.esm-browser.js"
        createApp({
            setup(){

               const test=reactive({
                word: true
               });

               const change=()=>{
                test.word=!test.word;
               }


               return{
                test,
                change,
               }

            }
        }).mount("#app");

    </script>

 可以通过特定的条件来决定是否显示或隐藏特定的DOM元素,当条件为真时,v-if指令将元素添加到DOM中;当条件为假时,v-if指令将元素从DOM中移除。

<div id="app">     
    <p>{{test.watch}}w</p>
    <p v-if="test.watch<=100">一般浏览量</p>
    <p v-else-if="test.watch>100 && test.watch<=300">浏览量持续上升</p>
    <p v-else-if="test.watch>300 && test.watch<=600">浏览量向千靠拢啦!努努力!</p>
    <p v-else>恭喜你,火啦!!</p>
    <button @click="add(40,50)">单击增加流量</button>
    

    </div>
    <script type="module">
        import {createApp,ref,reactive} from"./vue.esm-browser.js"
        createApp({
            setup(){

                const test=reactive({
                    watch:0
                });

                const add=(a,b)=>{
                    test.watch+=a+b
                   console.log("浏览量为"+test.watch);
                }

                return{
                    test,
                    add
                }

              
            }
        }).mount("#app");

    </script>

单击后 

 遍历指令 v-for

指定一个数组或对象作为遍历的数据源,然后使用v-for指令来迭代数据源中的每一项

v-for  =  "(value值,index索引,key键 )in test.user(要遍历的数据源)"

遍历对象的值 

 <div id="app">   

遍历数组内的值:  
   <p v-for="value in test.user">{{value}}</p>
  </div>

const test=reactive({
                    user:{
                    name:"木木",
                    age:22,
                    sex:"男",
                    hobby:"读书"},
                    number:["十一","十二","十三"]

                });

                return{
                    test,
                }

 遍历对象的值和索引

写指令时,先值后索引

 <div id="app">     
   <p v-for="(value,index) in test.number">
    {{ index }} : {{ value }}
</p>

    </div>
    <script type="module">
        import {createApp,ref,reactive} from"./vue.esm-browser.js"
        createApp({
            setup(){

                const test=reactive({
                    user:{
                    name:"木木",
                    age:22,
                    sex:"男",
                    hobby:"读书"},
                    number:["十一","十二","十三"]

                });
                return{
                    test,
                }

            }
        }).mount("#app");

    </script>

 遍历对象的值和键

 写指令时,先值后键

<p v-for="(value,key) in test.user">
    {{ key }} : {{ value }}
</p>

 遍历对象的值,键和索引

 写指令时,先值再键后索引

<p v-for="(value,key,index) in test.user">
    {{index}}: {{ key }} : {{ value }}
</p>

 指令嵌套

<template> 标签可以用来包装多个元素或者多行代码, 不会在页面中渲染

<template v-for="(value,key,index) in test.user">
    <p v-if="index == 0">  
        {{ index }} : {{ key }} : {{ value }}
    </p>   
</template>

 指令嵌套 运行结果

 项目实战

 做一个动态相册,如下图:

解析:

用v-on为切换相片的按钮绑定上一个函数,这个函数负责更改图片路径;

v-bind绑定图片的路径,使得图片路径可以自动更新

文字按钮切换图片

v-on切换上一张

注:图片的命名要有顺序的命名,方便实现功能

当我们点击上一张时,照片的数量是在不断减少的,并伴随着照片路径的更改

我们可以先给照片的数量和路径做一个初始值的设置;其次用函数来控制照片的数量及路径的改变;最后将函数绑定到按键上,通过v-on来监听鼠标事件并触发对应的方法

 初始值的设置

                const img=reactive({
照片数量                    num:1,
照片的路径                  url:"./img_src/logo1.png"
               });

照片数量及路径的改变

 上一张:                   
                            const nagtive=()=>{
设置照片数量自减                  img.num--
当照片数减到0时                    if(img.num==0){
使照片数等于4                        img.num=4
这样就实现了一个循环的效果!          }

照片路径的改变                    img.url=`./img_src/logo${img.num}.png`
照片的路径随照片数改变            }

v-on绑定按钮

<button @click="nagtive">上一张</button> 

v-on切换下一张

步骤与上面大庭相近,不同的是,当我们点击下一张时,照片的数量不断增加的,所以我们可以将上面自减的设置改为自加

                    const add=()=>{
照片数自加                img.num++
当到数量为5时             if(img.num==5){
使照片数回到1              img.num=1;
达到循环的效果                        }

照片路径随照片数改变     img.url=`./img_src/logo${img.num}.png`

                        }
<button @click="add">下一张</button>

v-bind绑定图片的路径

<img v-bind:src = "img.url" class="img" alt="图片加载失败">

 数字按钮跳转图片

数字按钮

利用遍历指令v-for来遍历 数据源(4)  以内的值,数字按钮就出来了

        <ul type="none" >
            <li v-for="value in 4">
                    {{value}}
            </li>
        </ul>

跳转函数设置

创建一个函数,这里命名为"jump",通过函数jump 调用v-for所遍历的值(value);将照片和路径绑定到数字按钮,第1张照片与数字按钮1绑定,以此类推

                    const jump=(value)=>{
                    img.num=value;
                    img.url=`./img_src/logo${img.num}.png`

                }

跳转函数绑定

通过v-on将跳转函数绑定到数字按钮上,监听鼠标事件并触发对应的方法

         <ul type="none" class="box">
            <li v-for="value in 4" @click="jump(value)">{{value}}</li>
        </ul>

完整代码

<head>
    <meta charset="UTF-8">
    <title>相册</title>

    <style>
样式设置
         .img{
            width: 480px;  
            height: 240px;
            border: 1px bisque solid;
         }


        .box{
            margin-bottom: 20px;
            padding: 0;
           
        }

       
        ul li{
            float: left;
            background-color: bisque;
            height: 20px;
            width: 20px;
            margin-left: 10px;
            text-align: center;
        }
        
    </style>
</head>

<body>
    <div id="app">
相册基本骨架

        <h2>基于Vue3实现的相册:展示第{{img.num}}张相片</h2>
        
        <img v-bind:src = "img.url" class="img" alt="图片加载失败"> 

        <ul type="none" class="box">
            <li v-for="value in 4" @click="jump(value)">
                {{value}}
            </li>
        </ul>

   <br>
   
        <button @click="nagtive">上一张</button>   <button @click="add">下一张</button>



    </div>

    <script type="module">
        import { createApp, ref,reactive } from './vue.esm-browser.js'

        createApp({
            setup(){
初始值
                const img=reactive({
                    num:1,
                    url:"./img_src/logo1.png"
                });

下一张                const add=()=>{
                    img.num++
                    if(img.num==5){
                        img.num=1;
                    }
                    img.url=`./img_src/logo${img.num}.png`

                }
上一张
                const nagtive=()=>{
                    img.num--
                    if(img.num==0){
                        img.num=4
                    }
                    img.url=`./img_src/logo${img.num}.png`
                    
                }
跳转
                const jump=(value)=>{
                    img.num=value;
                    img.url=`./img_src/logo${img.num}.png`

                }

                return{
                    img,
                    add,
                    nagtive,
                    jump,
                }
            }
        }).mount("#app");

    </script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922663.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译

本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5&#xff0c;你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…

自然语言处理: RAG优化之Embedding模型选型重要依据:mteb/leaderboard榜

本人项目地址大全&#xff1a;Victor94-king/NLP__ManVictor: CSDN of ManVictor git地址&#xff1a;https://github.com/opendatalab/MinerU 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新不易&#xff0c;希望走过路…

Redis 常用数据类型插入性能对比:循环插入 vs. 批量插入

Redis 是一款高性能的键值数据库&#xff0c;其支持多种数据类型&#xff08;String、Hash、List、Set、ZSet、Geo&#xff09;。在开发中&#xff0c;经常会遇到需要插入大量数据的场景。如果逐条插入&#xff0c;性能会显得较低&#xff0c;而采用 Pipeline 批量插入 能大幅提…

oneplus6线刷、trwp、magisk(apatch)、LSPosed、Shamiko、Hide My Applist

oneplus6线刷android10.0.1 oneplus6线刷包(官方android10.0.1)下载、线刷教程&#xff1a; OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip 启用开发者模式 设置 / 连续点击6次版本号 : 启用开发者模式设置/开发者模式/{打开 usb调试, 打开 网络adb调试,…

node.js中使用express.static()托管静态资源

express.static()定义 express.static(root, [options])是一个中间件函数&#xff0c;负责为Express应用提供静态资源服务。它允许你指定一个或多个目录作为静态资源的根目录&#xff0c;当客户端请求这些资源时&#xff0c;Express会查找并返回对应的文件。 安装express npm i…

【含开题报告+文档+PPT+源码】基于SSM的社区老人服务系统设计与实现

开题报告 在当前人口老龄化趋势明显以及信息化社会发展背景下&#xff0c;基于 SSM 框架构建的社区老人服务系统具有深远的背景意义。首先&#xff0c;它响应了我国老龄化进程加快所带来的多元化、个性化养老服务需求&#xff0c;利用互联网技术为老年人提供便捷高效的在线申请…

Spring AI 框架使用的核心概念

一、模型&#xff08;Model&#xff09; AI 模型是旨在处理和生成信息的算法&#xff0c;通常模仿人类的认知功能。通过从大型数据集中学习模式和见解&#xff0c;这些模型可以做出预测、文本、图像或其他输出&#xff0c;从而增强各个行业的各种应用。 AI 模型有很多种&…

学习与理解LabVIEW中多列列表框项名和项首字符串属性

多列列表框控件在如下的位置&#xff1a; 可以对该控件右击&#xff0c;如下位置&#xff0c;即可设置该控件的显示项&#xff1a; 垂直线和水平线指的是上图中组成单元格的竖线和横线&#xff08;不包括行首列首&#xff09; 现在介绍该多列列表框的两个属性&#xff0c;分别…

(Keil)MDK-ARM各种优化选项详细说明、实际应用及拓展内容

参考 MDK-ARM各种优化选项详细说明、实际应用及拓展内容 本文围绕MDK-ARM优化选项,以及相关拓展知识(微库、实际应用、调试)进行讲述,希望对你今后开发项目有所帮助。 1 总述 我们所指的优化,主要两方面: 1.代码大小(Size) 2.代码性能(运行时间) 在MDK-ARM中,优…

实时数据开发 | 怎么通俗理解Flink容错机制,提到的checkpoint、barrier、Savepoint、sink都是什么

今天学Flink的关键技术–容错机制&#xff0c;用一些通俗的比喻来讲这个复杂的过程。参考自《离线和实时大数据开发实战》 需要先回顾昨天发的Flink关键概念 检查点&#xff08;checkpoint&#xff09; Flink容错机制的核心是分布式数据流和状态的快照&#xff0c;从而当分布…

[译]Elasticsearch Sequence ID实现思路及用途

原文地址:https://www.elastic.co/blog/elasticsearch-sequence-ids-6-0 如果 几年前&#xff0c;在Elastic&#xff0c;我们问自己一个"如果"问题&#xff0c;我们知道这将带来有趣的见解&#xff1a; "如果我们在Elasticsearch中对索引操作进行全面排序会怎样…

七、SElinux

一、SElinux简介 SELinux是Security-Enhanced Linux的缩写&#xff0c;意思是安全强化的linuxSELinux 主要由美国国家安全局(NSA)开发&#xff0c;当初开发的目的是为了避免资源的误用传统的访问控制在我们开启权限后&#xff0c;系统进程可以直接访问当我们对权限设置不严谨时…

鸿蒙开发-音视频

Media Kit 特点 一般场合的音视频处理&#xff0c;可以直接使用系统集成的Video组件&#xff0c;不过外观和功能自定义程度低Media kit&#xff1a;轻量媒体引擎&#xff0c;系统资源占用低支持音视频播放/录制&#xff0c;pipeline灵活拼装&#xff0c;插件化扩展source/demu…

小程序25- iconfont 字体图标的使用

项目中使用到图标&#xff0c;一般由公司设计进行设计&#xff0c;设计好后上传到阿里巴巴矢量图标库 日常开发过程中&#xff0c;也可以通过 iconfont 图标库下载使用自带的图标 补充&#xff1a;使用 iconfont 图标库报错&#xff1a;Failed to load font 操作步骤&#xff…

vulhub之fastjson

fastjson 1.2.24 反序列化 RCE 漏洞(CVE-2017-18349) 漏洞简介 什么是json json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。举个简单的例子如下: {"name":"BossFrank", "age":23, "isDevel…

Java语言程序设计 选填题知识点总结

第一章 javac.exe是JDK提供的编译器public static void main (String args[])是Java应用程序主类中正确的main方法Java源文件是由若干个书写形式互相独立的类组成的Java语言的名字是印度尼西亚一个盛产咖啡的岛名Java源文件中可以有一个或多个类Java源文件的扩展名是.java如果…

DevExpress控件 基本使用

DevExpress控件 一、DevExpress简介 1、所有编辑器的公共功能 全部都可以绑定数据&#xff1b; 全部都可以独立使用或用于由 Developer Express 提供的容器控件 (XtraGrid、XtraVerticalGrid、XtraTreeList 和 XtraBars) 内的内置编辑&#xff1b; 全部都使用相同的样式、外…

003 STM32基础、架构以及资料介绍——常识

注&#xff1a; 本笔记参考学习B站官方视频教程&#xff0c;免费公开交流&#xff0c;切莫商用。内容可能有误&#xff0c;具体以官方为准&#xff0c;也欢迎大家指出问题所在。 01什么是STM32&#xff08;宏观&#xff09; STM32属于一个微控制器&#xff0c;自带了各种常用通…

单片机_简单AI模型训练与部署__从0到0.9

IDE&#xff1a; CLion MCU&#xff1a; STM32F407VET6 一、导向 以求知为导向&#xff0c;从问题到寻求问题解决的方法&#xff0c;以兴趣驱动学习。 虽从0&#xff0c;但不到1&#xff0c;剩下的那一小步将由你迈出。本篇主要目的是体验完整的一次简单AI模型部署流程&#x…

2024最新YT-DLP使用demo网页端渲染

2024最新YT-DLP使用demo网页端渲染 前提摘要1.使用python的fastapi库和jinjia2库进行前端渲染2.代码实现1&#xff09;目录结构2&#xff09;代码style.cssindex.htmlresult.htmlmain.pyrun.py 3&#xff09;运行测试命令端运行 3.项目下载地址 前提摘要 2024最新python使用yt…