Vue的基本使用

news2024/11/17 16:30:19

文章目录

  • Vue简介
    • Vue的使用
      • 1.Vue指令
      • 2.过滤器
      • 3.侦听器
      • 4.计算属性

Vue简介

Vue是一套用于构建用户界面的前端框架。

vue的两个特性

(1)数据驱动视图

  • 在使用vue的页面中,vue会监听数据的变化,从而自动重新渲染页面的结构。
  • 当页面数据发生变化的时候,会自动重新渲染(数据的变化会驱动视图自动更新)
  • 数据驱动视图是单向的数据绑定

(2)双向数据绑定

  • 双向数据绑定可以辅助开发者在不操作DOM的前提下,自动把用户填写的内容同步到数据源中。
  • 数据源发生变化,会被自动渲染到页面中
  • 页面上表单采集的数据发生变化时,会被vue自动获取到,并更新到js数据中。

MVVM

MVVM(Model View ViewModel)是vue实现数据驱动视图双向数据绑定的核心原理。

它把html页面拆分成了三个部分:

  • Model表示当前页面渲染时所依赖的数据源
  • View表示当前页面所渲染的DOM结构
  • ViewModel表示vue的实例,它是MVVM的核心
    在这里插入图片描述

MVVM的工作原理

​ ViewModel作为MVVM的核心,它把当前页面的数据源(Model)和页面的结构(View)连接在了一起。

在这里插入图片描述

  • 当数据源发生变化的时候,会被ViewModel监听到,VM会根据最新的数据源更新页面的结构。
  • 当表单元素的值发生变化时,也会被VM监听到,VM会把变化过后的最新的值同步到Model数据源中。

Vue的使用

Vue的基本使用

<!-- 1. 导入vue.js的script脚本文件(导入后,window全局中就有了Vue这个构造函数) -->
<script src="./lib/vue-2.6.12.js"></script>
<!-- 2. 在页面中声明一个将要被vue所控制的DOM区域 -->
<div id="app">{{username}}</div>
<script>
// 3.创建vue的实例对象
	const vm = new Vue({

		el: '#app',            
		data: {                
		username: '关羽'
		}
	})
</script>
  • el: 指定vm实例控制页面哪个区域(值是一个选择器)
  • data: 指定Model数据源(就是要渲染到页面上的数据)

1.Vue指令

1.内容渲染指令

​ 用来渲染DOM元素的文本内容。

v-text

<p v-text="username"></p>
  • 把username对应的值,渲染到标签p中
  • v-text指令的缺点: 会覆盖掉元素内部原有的内容

{{}}

<p>姓名:{{username}}</p>
  • 使用{{}}差值表达式将对应的值渲染到元素的内容中
  • 差值表达式专门用来解决v-text覆盖默认文本内容的问题(只是内容的占位符)

v-html

<div v-html="info"></div>
  • 如果要把包含html标签的字符串渲染为页面html元素,则需要使用到v-html

v-text和{{}}差值表达式只能渲染纯文本内容,v-html可以渲染含有标签的字符串。

2.属性绑定指令

​ 如果需要为元素的属性动态绑定属性值,则需要用到v-bind属性绑定指令。

v-bind

<input type="text" v-bind:placeholder="tips">
  • v-bind: 可以简写为:

模板渲染语法中支持js语法

    <div id="app">
        <!-- v-text中使用js语法 -->
        <p v-text="'username:'+username"></p>
        <!-- 差值中使用js语法 -->
        <div>1+1的结果: {{ 1+1 }}</div>
        <div>num的值为: {{ num+1 }}</div>
        <div>{{con}}翻转的结果是: {{ con.split('').reverse().join('') }}</div>
        <!--v-bind中使用js语法-->
        <!-- id=list3 -->
        <div :id="'list' + index"></div>
    </div>

3.事件绑定指令

​ vue提供了v-on事件绑定指令,可以为DOM元素绑定事件监听。

v-on:事件名称="事件的处理函数"

<button v-on:click="add">+1</button>

<script>
	const vm = new Vue({
		el: '#app',
		data: {
			count: 0
		},
		methods: {
			add() {}
		}
</script>
  • v-on可以简写为@
  • methods中定义事件的处理函数

绑定事件并传参

<button v-on:click="add(2)">+1</button>
  • 可以在绑定事件时,添加小括号进行传参

(1)事件对象$event

​ vue提供了内置变量$event来表示事件对象e,它就是原生DOM的事件对象e。

<button @click="add(1,$event)">+1</button>
  • 如果事件没有传参,则事件处理函数中是有事件对象e的
  • 如果事件传了参数,会覆盖掉事件对象e,methods中的add得到的就是我们传入的参数
  • 如果我们在绑事件时,传参了而且还需要用到事件对象e,就可以用到$event

(2)事件修饰符

​ vue提供了事件修饰符的概念,让我们更方便的对事件的触发进行控制。

常见的5个事件修饰符:

  • .prevent: 阻止默认行为
  • .stop: 阻止事件冒泡
  • .capture: 以捕获模式触发当前的事件处理函数
  • .once: 绑定的事件只触发一次
  • .self: 只有在even.target是当前元素自身时,触发事件处理函数

事件.事件修饰符

<a href="http://www.baidu.com" @click.prevent="show">跳转到百度首页</a>

(3)按键修饰符

​ 在监听键盘事件时,我们经常需要判断详细的按键。此时可以用键盘相关的事件添加按键修饰符。

事件.按键修饰符

<input type="text" @keyup.enter="commit">
  • 只有按下enter回车键的时候,才调用commit方法

4.双向绑定指令

​ v-model双向数据绑定,在不操作DOM的前提下,就可以快速的获取表单的数据。

v-model

<input type="text" v-model="username">

<script>
	const vm = new Vue({

            el: '#app',
            data: {
                username: '关羽',
            }
        })
</script>
  • 当表单元素绑定了v-model,用户修改表单时,数据源也随之发生改变。当数据源发生改变时,重新渲染表单得到最新的值
  • v-model在表单元素下使用。

v-model指令的修饰符

为了方便对用户输入的内容进行处理,vue为v-model指令提供了3个修饰符:

  • .number: 自动将用户输入的值转换为数值类型
  • .trim: 自动过滤用户输入的首尾空白字符
  • .lazy: 表单数据在"change"时不需要"input"实时更新。就是表单数据变化时,不需要实时同步到data数据源,当完成时再同步,使用.lazy是可以优化性能的
 <!-- 自动将用户输入的值转换为数值类型 -->
<input type="text" v-model.number="n1">+<input type="text" v-model.number="n2">=<span>{{n1+n2}}</span>

<!-- 自动过滤用户输入的首尾空白字符 -->
<input type="text" v-model.trim="username">

<!-- 表单数据在"change"时不需要"input"实时更新 -->
<input type="text" v-model.lazy="username">

5.条件渲染指令

​ 条件渲染指令用来按需控制DOM的显示与隐藏,分别为: v-if,v-show。

v-if

<p v-if="flag">这是被 v-if 控制的元素</p>
  • v-if原理: 每次动态创建移除元素,来实现元素的显示与隐藏

v-show

<p v-show="flag">这是被 v-show 控制的元素</p>
  • v-show原理: 动态为元素创建或移除display:none样式,来实现元素的显示与隐藏。

两者的使用场景:

如果要频繁的切换元素的显示状态,v-show的性能会更好。

如果刚进入页面时,某些元素默认不需要被展示,而且后期可能也不需要被展示出来,此时v-if性能更好。

v-if的配套指令

v-else-if

<div v-if="type === 'A'">优秀</div>
<div v-else-if="type === 'B'">良好</div>
<div v-else-if="type === 'C'">一般</div>
<div v-else></div>
  • v-else-if充当v-if的“else-if块”,可以连续使用
  • v-else-if必须配合v-if指令使用,否则它将不会被识别

6.循环渲染指令

​ vue提供了v-for循环渲染指令,可以基于一个数组来渲染一个列表结构

v-for

<tr v-for="(item,index) in list" :key="item.id">
     <td>{{index}}</td>
     <td>{{item.id}}</td>
     <td>{{item.uname}}</td>
</tr>
  • 要循环生成哪个DOM元素,就给这个DOM元素加上v-for
  • v-for需要使用item in items形式的特殊语法
  • items: 是待循环的数组;item: 是循环的每一项
  • v-for指令还支持一个可选的第二个参数,即当前项的索引(index)。
  • 官方建议只要用到了v-for命令,那么就一定要绑定一个:key属性并且尽量把id作为key的值
  • key的值类型: 字符串或数字类型
  • key的值是不能重复的(具有唯一性)

2.过滤器

Filter过滤器常用于文本的格式化。过滤器可以用在两个地方: 差值表达式和v-bind属性绑定。

<div id="app">{{message | flt}}</div>

<script>
        const vm = new Vue({
            el: '#app',
            data: {
                message: 'hello vue.js'
            },
            // 定义过滤器
            filters: {
                flt(msg) {
                    const first = msg.charAt(0).toUpperCase()
                    const res = msg.slice(1)
                    // 过滤器中一定要有返回值
                    return first + res
                }
            }
        })
</script>
  • 过滤器添加到js表达式的尾部,通过|(管道符)进行调用。过滤器本身是函数,带有返回值。
  • 过滤器函数必须定义到filters节点下
  • |: 管道符,上一个表达式输出的结果作为下一个表达式的输入

扩展:

可以连续调用多个过滤器

{{ message | filter1 | filter2.. }}

过滤器可以接受参数

{{ message | filter1(arg1,arg2)}}

  • 第一个参数永远都是管道符前面的值,第二个参数开始才是调用过滤器时传入的参数

(1)私有过滤器

​ 在filters节点下定义的过滤器为私有过滤器,因为它只能在当前vm实例所控制的el区域内使用。

(2)全局过滤器

​ 如果希望实例之间共享过滤器,则可以定义全局过滤器。

Vue.filter('过滤器名',function(形参){})

<div id="app">
        <p>{{message | flt}}</p>
</div>

<script>
    Vue.filter('flt', function (res) {

           const first = res.charAt(0).toUpperCase()
           const other = res.slice(1)
           return first + other
})
</script>

3.侦听器

watch侦听器允许我们监视数据变化,从而针对数据的变化做特定的操作。

<div id="app">
        <input type="text" v-model="username">
</div>

<script>
        const vm = new Vue({
            el: '#app',
            data: {
                username: ''
            },
            // 定义侦听器(所有侦听器都定义到watch节点下)
            watch: {
                username(newVal, oldVal) {           
                    console.log('侦听到了username的值变化', newVal, oldVal)
                }
            }
        })
</script>
  • 要侦听哪个数据,哪个数据就作为方法名

  • newVal是变化后的新值,oldVal是变化前的旧值

1.方法格式的侦听器

<script>
      const vm = new Vue({
          el: '#app',
          data: {
              username: ''
          },
          watch: {
              // watch侦听用户名是否被占用
              username(newVal) {      // 
                  if (newVal === '') return
                  // 调用ajax请求,判断newVal是否被占用
                  $.get('https://www.escook.cn/api/finduser' + newVal, res => {
                      console.log(res)
                  })
              }
          }
	  })
</script>
  • 要侦听data中的哪个数据,哪个数据就作为方法名

2.对象格式的侦听器

<script>
        const vm = new Vue({
            el: '#app',
            data: {
                username: ''
            },
            watch: {
                // 对象格式的侦听器
                username: {
                    handler(newVal, oldVal) {

                        console.log(newVal, oldVal)
                    },
                    immediate: true
                }
            }
        })
</script>
  • immediate选项的默认值是false
  • immediate的作用就是控制侦听器是否自动触发

3.深度侦听

<div id="app">
        <input type="text" v-model="info.username">
</div>
<script>
        const vm = new Vue({
            el: '#app',
            data: {
                info: {
                    username: 'zs'
                }
            },
            watch: {
                // 侦听info对象
                info: {
                    handler(newVal) {
                        console.log(newVal)
                    },
                    deep: true
                },
            }
        })
</script>
  • deep选项默认值为false
  • 设置deep选项,开启深度侦听,只要对象中的任何一个属性发生变化,都会触发对象的侦听器

方法格式的侦听器缺点:

  • 无法在刚进入页面的时候,自动触发
  • 如果侦听的是一个对象,对象中的的属性发生了变化,不会触发侦听器

对象格式的侦听器优点:

  • 可以通过设置immediate选项,当进入页面时,就让侦听器自动触发
  • 可通过设置deep选项,深度侦听对象中的每个属性的变化

4.计算属性

计算属性指的是通过一系列运算之后,最终得到一个属性值,这个动态计算出来的属性值可以被模板结构或methods方法使用。

计算属性的特点:

  • 定义的时候,定义成方法格式。在使用计算属性的时候,当普通的属性来使用

计算属性的好处:

  • 实现了代码的复用
  • 只要计算属性中依赖的数据源发生变化,则计算属性会自动重新求值

用计算属性动态生成rgb这么一个字符串

<div class="box" :style="{ backgroundColor: rgb }">{{ rgb }}</div>
<button @click="show">按钮</button>
<script>
        var vm = new Vue({
            el: '#app',
            data: {
                r: 0,
                g: 0,
                b: 0
            },
            methods: {
                show() {
                    console.log(this.rgb)
                }
            },
            computed: {
                rgb() { 
                    return `rgb(${this.r},${this.g},${this.b})`     // 返回生成rgb(x,x,x)字符串
                }
            }
        });
        console.log(vm) // 可以看到vm实例中有rbg属性
</script>
  • 所有的计算属性定义在computed节点下

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

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

相关文章

GUI JFrame实战:六一节,爱她就给她画个哆啦A梦吧

文章目录 前言技术积累容器分类主要APIGraphics图像 绘画方法实战演示1、创建哆啦A梦渲染类2、创建测试方法3、查看渲染结果 写在最后 前言 相信很多使用JAVA高级语言的同学都知道GUI图形用户界面&#xff0c;开发人员可以使用java.awt、javax.swing两个API绘画想要的图形并通…

蓝牙规范系列--基础篇(第一篇)

一、前言 玩过物联网的小伙伴肯定知道ESP32&#xff08;一款WiFi/BT SoC&#xff09;&#xff0c;那肯定也知道蓝牙这个东西&#xff0c;蓝牙技术最近几年由于蓝牙耳机很火&#xff0c;那蓝牙技术到底是怎样的呢&#xff1f; 蓝牙无线技术是一种短距离的通信系统旨在替换便携式…

c++学习——友元、全局友元函数、友元类

友元 类的主要特点之一是数据隐藏&#xff0c;即类的私有成员无法在类的外部(作用域之外)访问。但是&#xff0c;有时候需要在类的外部访问类的私有成员&#xff0c;怎么办? 解决方法是使用友元函数&#xff0c;友元函数是一种特权函数&#xff0c;c允许这个特权函数访问私有…

python 自动编译VS项目

目录 一、python自动编译项目 1、环境变量 1) CMAKE 2&#xff09;VS 2、CMAKE 生成VS项目 1) cmake 命令介绍 2&#xff09;python 调用cmake 命令 3、devenv编译VS项目 1) devenv介绍 2&#xff09;devenv命令行开关 3) 自动编译VS项目 一、python自动编译项目 …

04 布隆过滤器BloomFilter

是什么 布隆过滤器&#xff08;英语&#xff1a;Bloom Filter&#xff09;是 1970 年由布隆提出的。它实际上是一个很长的二进制数组一系列随机hash算法映射函数&#xff0c;主要用于判断一个元素是否在集合中。通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景&a…

C++ 和机器学习:使用 C++ 执行 ML 任务的简介

C 和机器学习&#xff1a;使用 C 执行 ML 任务的简介 介绍 C 是一种高性能编程语言&#xff0c;非常适合机器学习( ML ) 任务。尽管它在 ML 中可能不像 Python 或 R 那样流行&#xff0c;但它在速度和内存效率方面具有优势。 在本文中&#xff0c;我们将概述使用 C 执行 ML 任务…

“双碳同行者大会”成功举办,绿色家居企业参与其中

2023年5月27日 &#xff0c;由万科集团创始人、深石集团创始人王石先生创立的碳中和社区品牌“生物圈三号”在深圳大梅沙成功举办了“回归未来双碳同行——生物圈三号双碳同行者大会暨全球运河穿越新书发布会”。 生物圈三号作为社区碳中和综合解决方案平台&#xff0c;为建筑、…

Word控件Spire.Doc 【其他】教程(5):在 Word 中嵌入媒体文件

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

Axios请求失败重刷接口

需求背景 页面接口请求时偶尔会出现 Network Error 异常报错&#xff0c;重新请求就会请求成功 接口没办法捕获异常原因&#xff0c;前端来做一次重刷解决问题 net::ERR_SSL_PROTOCOL_ERRORnet::ERR_CONNECTION_REFUSED 解决思路 记录请求map&#xff08;以url为唯一标识&…

Live800:智能客服机器人有哪些核心功能?

随着互联网的普及和用户服务要求的不断升级&#xff0c;许多企业已经开始关注在线客服系统以及智能客服机器人的应用。 那么&#xff0c;智能客服机器人在解决企业痛点的过程中&#xff0c;充分使用了哪些核心功能呢&#xff1f; 一、自然语言处理 客户提问的方式千奇百怪&am…

Hindawi官宣上线8本新刊!这6本被踢SCI期刊,EI正常在检

Hindawi官宣&#xff1a;8本新刊上线 2023年5月23日&#xff0c;Hindawi官宣与IET的8本合作期刊在完全开放获取模式下全面上线&#xff0c;所有期刊名称仍然保留IET抬头&#xff0c;但将由Hindawi全面负责出版、主持和运营等相关事宜。 No.1 IET BioMetrics 该期刊关注生物识…

linux shell编程规范和变量

一、shell简述 概念&#xff1a;shell解释器&#xff0c;翻译官功能&#xff0c;与内核进行沟通的应用程序。 把代码翻译为二进制&#xff0c;让内核处理&#xff0c;负责接收用户输入的操作指令&#xff08;命令&#xff09;并进行解释&#xff0c;将需要执行的操作传递给内核…

功能上新| GPU篇:SoC GPU信息、GPU Counter性能指标

在玩家要求游戏更流畅、画质更精美的今天&#xff0c;优化GPU过度使用导致的性能问题成了大多数游戏开发团队关注的核心。当项目的GPU压力达到一定阈值时&#xff0c;卡顿、掉帧、发热、降频等问题便随之而来&#xff0c;严重影响用户体验。 为了解决项目的GPU压力问题&#x…

Kafka的常用命令

提前说明&#xff1a;下述所有命令都是需要进入到Kafka服务的的bin目录下执行&#xff0c;即下图所示目录。 1.查看主题列表 kafka-topics.sh --list --bootstrap-server ip:端口 2.创建主题 如下为创建一个单分区单副本的主题的命令示例&#xff1a; kafka-topics.sh --c…

Hack The Box - sequel关卡

TASK 1 任务 1 During our scan, which port do we find serving MySQL? 在扫描过程中&#xff0c;我们发现哪个端口为 MySQL 提供服务&#xff1f; 3306TASK 2 任务 2 What community-developed MySQL version is the target running? 目标运行的是哪个社区开发的MySQL版…

基于nodejs+Vue的少儿编程课程网上报名系统express+vscode

近年来&#xff0c;随着网络技术的不断发展&#xff0c;越来越多人在网站查询各种信息&#xff0c;少儿编程网上报名系统对用户和管理员都有很大帮助&#xff0c;少儿编程网上报名系统通过和数据库管理系软件协作来实现用户与管理员之间的一个很好的操作平台&#xff0c;基于这…

【大数据学习篇11】广告点击流实时统计

学习目标/Target 掌握广告点击流实时统计实现思路 掌握利用Kafka生产用户广告点击流数据 了解数据库设计 掌握如何创建Spark Streaming连接 掌握利用Spark Streaming读取业务数据 掌握利用Spark读取黑名单用户 掌握利用Spark Streaming过滤黑名单用户 掌握利用Spark St…

bug:使用useClipboard不生效问题

背景 使用vueuse/core的useClipboard来实现复制功能&#xff0c;没有生效。 原因 useClipboard 的底层是是使用navigator.clipboard实现的。但是在 http协议 中&#xff0c;navigator.clipboard打印undefined&#xff08;如下图&#xff09;&#xff0c;导致在http协议中使用…

旅行商问题TSP

目录 蚁群算法 Hopfield网络 遗传算法 免疫算法 蚁群算法 求解思路 Hopfield网络 Hopfield网络适合求结果的次优解&#xff0c;可以保证解向能量函数最小值方向收敛&#xff0c;但不能确保达到全局最小点。 实现能量函数 网格能量的最小值对应于最佳或者次最佳的路径距离。…

MySQL部署PXC集群-全网最详细

MySQL部署PXC集群 一&#xff0c;PXC了解 1.PXC介绍 Percona XtraDB Cluster&#xff08;简称PXC&#xff09; 是基于Galera的MySQL高可用集群解决方案 Galera Cluster是Codership公司开发的一套免费开源的高可用方案 PXC集群主要由两部分组成&#xff1a;Percona Server …