当前位置: 首页 > article >正文

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>


http://www.kler.cn/a/409104.html

相关文章:

  • 周末总结(2024/11/24)
  • HTMLCSS:3D金字塔加载动画
  • MySQL 主从复制之多线程复制
  • 【数据结构】【线性表】一文讲完队列(附C语言源码)
  • el-table的树形结构后端返回的id没有唯一键怎么办
  • Java中的CAS
  • elasticsearch的文档管理
  • MySQL原理简介—12.MySQL主从同步
  • 计算机网络复习笔记(湖科大教书匠)
  • Qt案例 滥用[Qt::BlockingQueuedConnection]队列链接导致出现程序死锁Bug的问题
  • JavaWeb开发:HTML 页面与接口对接
  • 基于Java Springboot工厂生产设备维护管理系统
  • Facebook商城号封号的原因是什么?
  • 数据集-目标检测系列- 花卉 玫瑰 检测数据集 rose >> DataBall
  • C/C++ 每日一练:实现字符串的大小写转换
  • unity3d————基础篇小项目(设置界面)
  • linux常见版本:
  • 本地部署 MaskGCT
  • 网络爬虫——综合实战项目:多平台房源信息采集与分析系统
  • Python爬虫:深度解析1688接口数据获取