Vue基础--v-model/v-for/事件属性/侦听器

news2024/10/2 0:23:38

目录

一 v-model表单元素

1.1 v-model绑定文本域的value

1.1.1 lazy属性:光标离开再发请求

1.1.2 number属性:如果能转成number就会转成numer类型

1.1.3 trim属性:去文本域输入的前后空格

1.2v-model绑定单选checkbox

1.3代码展示

二 v-for循环指令

三 计算属性

四 侦听器


一 v-model表单元素

        v-model其实我自己就是单纯的把他理解成双向绑定指令。

        和v-bind一样都是操作数据,只是这个一般用在表单中。 

1.1 v-model绑定文本域的value

<!-- v-model绑定文本域的value ,如果有value会覆盖掉value属性-->
     <!-- lazy属性:光标离开再发请求 -->
    <input type="text" placeholder="请输入用户名" v-model.lazy="username" value="默认值"/>
    <h2>{{username}}</h2>

我们用v-model绑定username,当我们在文本框中输入值后,对应的username也会进行数据的双向绑定,从而展示在页面上,效果如下:

1.1.1 lazy属性:光标离开再发请求

如上面所示,给v-model加上lazy属性,可以实现光标离开后再执行。

1.1.2 number属性:如果能转成number就会转成numer类型

<!-- number属性:如果能转成number就会转成numer类型,比如文本域中输入数字原本时string,但是加上这个属性就会转成number -->
    <input type="text" name="age" v-model.number="age">
    <button @click="change()">获取age类型</button>
    <h2>age的类型:{{type}}</h2>

正常来说,type=“text”的文本域就算输入的数字,也是string类型,而是由这个.number属性,就可以把数字转成number类型,方便进行运算需求。

1.1.3 trim属性:去文本域输入的前后空格

    <!-- trim属性:去文本域输入的前后空格 -->
    <input type="text" v-model.trim="username">    

1.2v-model绑定单选checkbox

实现代码如下:

 <!-- v-model绑定单选checkbox -->
    <input type="radio" name ="sex" v-model="sex" value="男">男
    <input type="radio" name ="sex" v-model="sex" value="女">女
    <h2>{{sex}}</h2>

 具体逻辑如下:

效果展示:

1.3代码展示

完整代码以及注释如下:

<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>
</head>
<body>

  <div id="app">
    <!-- v-model绑定文本域的value ,如果有value会覆盖掉value属性-->
     <!-- lazy属性:光标离开再发请求 -->
    <input type="text" placeholder="请输入用户名" v-model.lazy="username" value="默认值"/>
    <h2>{{username}}</h2>

    <!-- number属性:如果能转成number就会转成numer类型,比如文本域中输入数字原本时string,但是加上这个属性就会转成number -->
    <input type="text" name="age" v-model.number="age">
    <button @click="change()">获取age类型</button>
    <h2>age的类型:{{type}}</h2>

    <!-- trim属性:去文本域输入的前后空格 -->
    <input type="text" v-model.trim="username">

    <!-- v-model绑定单选checkbox -->
    <input type="radio" name ="sex" v-model="sex" value="男">男
    <input type="radio" name ="sex" v-model="sex" value="女">女
    <h2>{{sex}}</h2>

    <!-- v-mode绑定下拉框 -->
    <select name="city" v-model="city">
        <option value="cs">长沙</option>
        <option value="bj">北京</option>
        <option value="sh">上海</option>
    </select>
    <h2>{{city}}</h2>
  </div>
  
  <script type="text/javascript" src="../vue.js"></script>
  <script>
    // 1.创建app
    const app = Vue.createApp({
      // data: option api
      data: function() {
        return {
          username:""  , 
          sex:"女" , 
          city:"sh",
          age:18,
          type:""
        }
      },
      methods:{
        change(){
            this.type = typeof this.age
        }
      }
    })

    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</html>

 效果图如下:

二 v-for循环指令

         一般用在表格展示数据的时候。

        直接展示表格循环获取数据的代码:

        还有可以直接获得数组的下标index:

        完整代码展示:

<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>
</head>
<body>

  <div id="app">
    <h2>列表展示</h2>
    <ul>
        <!-- 从数组arr中取出值name -->
        <li v-for = "name in arr">{{name}}</li>
    </ul>

    <ul>
        <!-- 从数组arr中取出值name和对应的小标index -->
        <li v-for = "(name,index) in arr">{{index}}--{{name}}</li>
    </ul>


    <h2>学生信息展示</h2>
    <table>
        <tr>
            <th>编号</th>
            <th>姓名</th>
            <th>年龄</th>
        </tr>
        <!-- 遍历对象数组 -->
        <tr v-for = "stu in student"> 
            <th>{{stu.id}}</th>
            <th>{{stu.name}}</th>
            <th>{{stu.age}}</th>
        </tr>
    </table>

    <h2>嵌套For循环</h2>
    <table>
        <tr>
            <th>编号</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>女朋友</th>
        </tr>
        <!-- 遍历对象数组 -->
        <tr v-for = "stu in student"> 
            <th>{{stu.id}}</th>
            <th>{{stu.name}}</th>
            <th>{{stu.age}}</th>
        </tr>
    </table>
  </div>
  
  <script type="text/javascript" src="../vue.js"></script>
  <script>
    // 1.创建app
    const app = Vue.createApp({
      // data: option api
      data: function() {
        return {

          arr:["张三"  , "李四"  , "王五"]   , 
          student:[
            {id:1,
                name:"张三",
                age:13,
                girfriends:[
                    {
                    name:"小美",
                    age:12
                    },
                    {
                        name:"小芳",
                        age:11
                    }
                ]
            },

            {
                id:2,
                name:"李四",
                age:15,
                girfriends:[
                    {
                        name:"小王",
                        age:99
                    },
                    {
                        name : "小玉",
                        age:23
                    }
                ]
            }

          ]
        }
      },
    })

    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</html>

        效果展示:

三 计算属性

         说的明白一点,就是用来监听数据的。

         这个函数里面有一个get函数,当需要获得get函数里面的属性的时候,就会自动调用这个get函数从而获取数据。

<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>
</head>
<body>
    <style>
        input{
            width: 50px;
        }
    </style>

  <div id="app">
    <input type="number" v-model="number1" >
    +
    <input type="number" v-model="number2" >
    =
    {{sum}}

    <br>
    <input type="number" v-model="number3" @mouseout="sum">
    +
    <input type="number" v-model="number4" @mouseout="sum">
    =
    {{sum}}

  </div>
  
  <script type="text/javascript" src="../vue.js"></script>
  <script>
    // 1.创建app
    const app = Vue.createApp({
      // data: option api
      data: function() {
        
        return {
          number1:0,
          number2:0,
          result:0
        }
      },
      methods:{
        // sum(){
        //     this.result = this.number1+this.number2
        // }
      },
      methods:{
                sum:function(){
                    return parseInt(this.number1) + parseInt(this.number2);
                }
            },
    
            // 计算属性
     computed:{
         sum:{
             get(){  
                        //get方法, 当有人读取计算属性时,该计算属性的get()函数就会执行
                   return parseInt(this.number1) + parseInt(this.number2); //此时的this就是vm
               }
           }
       }
    })

    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</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>
</head>
<body>

   

  <div id="app">
    <table border="1" >
        <tr>
            <th></th>
            <th>书籍名称</th>
            <th>出版日期</th>
            <th>价格</th>
            <th>购买数量</th>
            <th>操作</th>
        </tr>
        <tr v-for="(book ,  index) in arr">
            <th>{{index+1}}</th>
            <th>{{book.name}}</th>
            <th>{{book.day}}</th>
            <th>{{book.price}}</th>
            <th><button @click="subNumber(book.id) ">-</button>{{book.number}}<button @click="addNumber(book.id)">+</button></th>
            <th><button @click="del(index)">移除</button></th>
        </tr>
    </table>
    <h2>总价:{{sum()}}</h2>
  </div>
  
  <script type="text/javascript" src="../../vue.js"></script>
  <script>
    // 1.创建app
    const app = Vue.createApp({
      // data: option api
      data: function() {
        return {
           total:0,
           nnumber:1,
          arr:[
            {
                id:1,
                name:"挪威的森林",
                day:"2024.10.23",
                price:102,
                number:1,
            },
            {
                id:2,
                name:"活着",
                day:"2024.10.11",
                price:66,
                number:1,
            }
          ]
        }
      },
      methods:{
        sum(){
            if(this.total===0){
                this.arr.forEach(element => {
                this.total+=(element.price*element.number)
               });
            }else{
                return this.total
            }    
           
        },

        //    updateCount() {  
        //      alert(88)
        //     }  ,
  


        del(id){
            this.arr.splice(id,1)
        },
        subNumber(id){
            this.total+=10
           this.arr.forEach(element => {
            if(element.id===id){
                if(element.number>0){
                    this.nnumber--
                    element.number--;
                }
                
            }
           });
        },
        addNumber(id){
            this.arr.forEach(element => {
            if(element.id===id){
                this.nnumber++
                element.number++
            }
           });
        }
      },
       

      // 使用onMounted来在页面加载完成后调用updateCount  
// onMounted:(() => {  
//   updateCount();  
// }),

    watch: {  
    arr: {  
      handler(newValue, oldValue) {  

            this.total=0
            this.arr.forEach(element => {
                this.total += (element.number*element.price)
            }); 
      },  
      deep: true // 开启深度侦听  
    }  
  }, 

    
    })

    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</html>

逻辑如下:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python OpenCV 教学取得视频资讯

这篇教学会介绍使用OpenCV&#xff0c;取得影像的长宽尺寸、以及读取影像中某些像素的颜色数值。 因为程式中的OpenCV 会需要使用镜头或GPU&#xff0c;所以请使用本机环境( 参考&#xff1a;使用Python 虚拟环境) 或使用Anaconda Jupyter 进行实作( 参考&#xff1a;使用Anaco…

基于单片机的温湿度感应智能晾衣杆系统设计

&#xff3b;摘 要&#xff3d; 本设计拟开发一种湿度感应智能晾衣杆系统 &#xff0c; 此新型晾衣杆是以单片机为主控芯片 来控制的实时检测系统 &#xff0e; 该系统使用 DHT11 温湿度传感器来检测大气的温湿度 &#xff0c; 然后通过单 片机处理信息来控制 28BYJ &…

配置路由器支持Telnet操作 计网实验

实验要求&#xff1a; 假设某学校的网络管理员第一次在设备机房对路由器进行了初次配置后&#xff0c;他希望以后在办公室或出差时也可以对设备进行远程管理&#xff0c;现要在路由器上做适当配置&#xff0c;使他可以实现这一愿望。 本实验以一台R2624路由器为例&#xff0c;…

使用 Hugging Face 的 Transformers 库加载预训练模型遇到的问题

题意&#xff1a; Size mismatch for embed_out.weight: copying a param with shape torch.Size([0]) from checkpoint - Huggingface PyTorch 这个错误信息 "Size mismatch for embed_out.weight: copying a param with shape torch.Size([0]) from checkpoint - Hugg…

Redis管理禁用命令

在redis数据量比较大时&#xff0c;执行 keys * &#xff0c;fluashdb 这些命令&#xff0c;会导致redis长时间阻塞&#xff0c;大量请求被阻塞&#xff0c;cpu飙升&#xff0c;严重可能导致redis宕机&#xff0c;数据库雪崩。所以一些命令在生产环境禁止使用。 Redis 禁用命令…

开始尝试从0写一个项目--前端(二)

修改请求路径的位置 将后续以及之前的所有请求全都放在同一个文件夹里面 定义axios全局拦截器 为了后端每次请求都需要向后端传递jwt令牌检验 ps&#xff1a;愁死了&#xff0c;翻阅各种资料&#xff0c;可算是搞定了&#xff0c;哭死~~ src\utils\request.js import axio…

【QML之·基础语法概述】

系列文章目录 文章目录 前言一、QML基础语法二、属性三、脚本四、核心元素类型4.1 元素可以分为视觉元素和非视觉元素。4.2 Item4.2.1 几何属性(Geometry&#xff09;:4.2.2 布局处理:4.2.3 键处理&#xff1a;4.2.4 变换4.2.5 视觉4.2.6 状态定义 4.3 Rectangle4.3.1 颜色 4.4…

互联网3.0时代的变革者:华贝甄选大模型创新之道

在当今竞争激烈的商业世界中&#xff0c;华贝甄选犹如一颗璀璨的明星&#xff0c;闪耀着独特的光芒。 华贝甄选始终将技术创新与研发视为发展的核心驱动力。拥有先进的研发团队和一流设施&#xff0c;积极探索人工智能、大数据、区块链等前沿技术&#xff0c;为用户提供高性能…

Knife4j的介绍与使用

目录 一、简单介绍1.1 简介1.2 主要特点和功能&#xff1a; 二、使用步骤&#xff1a;2.1 添加依赖&#xff1a;2.2 yml数据源配置2.3 创建knife4j配置类2.4 注解的作用 最后 一、简单介绍 1.1 简介 Knife4j 是一款基于Swagger的开源文档管理工具&#xff0c;主要用于生成和管…

【PTA天梯赛】L1-003 个位数统计(15分)

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法刷题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录 题目题解总结 题目 题目链接 题解 使用string把长度达1000位的数字存起来开一个代表个位数的数组 a[11]倒序计算最后一位&#xff0c;…

第16章 主成分分析:四个案例及课后习题

1.假设 x x x为 m m m 维随机变量&#xff0c;其均值为 μ \mu μ&#xff0c;协方差矩阵为 Σ \Sigma Σ。 考虑由 m m m维随机变量 x x x到 m m m维随机变量 y y y的线性变换 y i α i T x ∑ k 1 m α k i x k , i 1 , 2 , ⋯ , m y _ { i } \alpha _ { i } ^ { T } …

从微软 Word 中提取数据

从 Microsoft Word 文档中提取数据可以通过编程来实现&#xff0c;有几种常见的方法&#xff0c;其中之一是使用 Python 和 python-docx 库。python-docx 是一个处理 .docx 文件&#xff08;Microsoft Word 文档&#xff09;的 Python 库&#xff0c;可以读取和操作 Word 文档的…

泛微开发修炼之旅--36通过js控制明细表中同一列中多个浏览框的显示控制逻辑(明细表列中多字段显示逻辑控制)

文章链接&#xff1a;36通过js控制明细表中同一列中多个浏览框的显示控制逻辑&#xff08;明细表列中多字段显示逻辑控制&#xff09;

谷粒商城学习笔记-22-分布式组件-SpringCloud-OpenFeign测试远程调用

文章目录 一&#xff0c;OpenFeign的简介二&#xff0c;OpenFeign的使用步骤1&#xff0c;场景说明2&#xff0c;引入依赖2&#xff0c;开启OpenFeign3&#xff0c;编写Feign接口4&#xff0c;使用feign调用远程接口5&#xff0c;验证 错误记录 上一节学习了注册中心&#xff0…

变长输入神经网络设计

我对使用 PyTorch 可以轻松构建动态神经网络的想法很感兴趣&#xff0c;因此我决定尝试一下。 我脑海中的应用程序具有可变数量的相同类型的输入。对于可变数量的输入&#xff0c;已经使用了循环或递归神经网络。但是&#xff0c;这些结构在给定行的输入之间施加了一些顺序或层…

前端面试题31(TCP与UDP区别)

TCP (Transmission Control Protocol) 和 UDP (User Datagram Protocol) 是两种在网络通信中常用的传输层协议&#xff0c;它们在多个方面存在显著差异&#xff0c;主要体现在以下几个方面&#xff1a; 连接方式&#xff1a; TCP 是面向连接的协议。在数据传输开始之前&#xf…

STM32学习历程(day6)

EXTI外部中断使用教程 首先先看下EXTI的框图 看这个框图就能知道要先初始化GPIO外设 那么和前面一样 1、先RCC使能时钟 2、配置GPIO 选择端口为输入模式&#xff0c; 3、配置AFIO&#xff0c;选择我们用的GPIO连接到后面的EXTI 4、配置EXTI&#xff0c;选择边沿触发方式…

前端javascript中的排序算法之选择排序

选择排序&#xff08;Selection Sort&#xff09;基本思想&#xff1a; 是一种原址排序法&#xff1b; 将数组分为两个区间&#xff1a;左侧为已排序区间&#xff0c;右侧为未排序区间。每趟从未排序区间中选择一个值最小的元素&#xff0c;放到已排序区间的末尾&#xff0c;从…

从Helm到 Operator:Kubernetes应用管理的进化

&#x1f9f0;Helm 的作用 在开始前需要先对 kubernetes Operator 有个简单的认识。 以为我们在编写部署一些简单 Deployment 的时候只需要自己编写一个 yaml 文件然后 kubectl apply 即可。 apiVersion: apps/v1 kind: Deployment metadata: labels: app: k8s-combat …

Camera Raw:常规工具

在 Camera Raw 窗口右下角提供了四个常用的工具&#xff0c;它们分别是&#xff1a;缩放工具、抓手工具、切换取样器叠加以及切换网格叠加工具。 ◆ ◆ ◆ 缩放工具 Zoom Tool 用于放大或缩小预览图像&#xff0c;便于查看和编辑细节。 快捷键&#xff1a;Z 1、双击“缩放工具…