前端学习笔记 2:Vue

前端学习笔记 2:Vue

Vue 是一个目前最流行的前端响应式框架,关于它的简单介绍可以观看这里。

1.快速入门

Vue 的官网提供一个快速上手指南,有多种方式可以安装和使用 Vue,这里展示一个最简单的方式——直接导入官方提供的在线的核心 JS 文件进行使用。

这里展示的内容相当于官方快速上手指南中的使用 ES 模块构建版本。

需要先像在之前文章中介绍的那样,在 JS 模块中导入 Vue 的createApp函数:

<script type="module">import { createApp } from "https://unpkg.com/vue@3/dist/vue.esm-browser.js";
</script>

要想让 Html 页面元素被 Vue 控制和渲染,需要使用createApp函数对其装载(mount):

<body><div id="app"></div><script type="module">import { createApp } from "https://unpkg.com/vue@3/dist/vue.esm-browser.js";createApp().mount("#app");</script>
</body>

在上边这个示例中,id 为appdiv元素(包括其子元素)被 Vue 控制和渲染,具体是通过createApp().mount("#app")实现的。

要想向被 Vue 控制的 Html 标签中写入(渲染)内容,需要先准备数据,具体是通过createApp的参数提供:

<script type="module">import { createApp } from "https://unpkg.com/vue@3/dist/vue.esm-browser.js";createApp({data: function(){return {msg: "Hello World!"};}}).mount("#app");
</script>

这里createApp函数接收一个 JS 对象作为参数,该对象的data属性同样是一个函数,其返回值是一个 JS 对象,该对象的属性可以在 Vue 渲染的 Html 元素中使用。

当然,当 JS 对象的属性是函数时,也可以使用简写方式进行定义:

createApp({data(){return {msg: "Hello World!"};}
}).mount("#app");

准备好 Vue 数据后,在 Html 元素中使用插值表达式({{...}})插入数据:

<div id="app"><h1>{{msg}}</h1>
</div>

这样页面加载后就可以被 Vue 正常渲染和显示内容。

2.vue 指令

类似于一些模版语言,vue 提供一些程序控制指令,用于更灵活地对页面元素进行控制和渲染。

2.1.v-for

通常使用v-for指令将 JS 数组中的内容渲染到 Html 表格或列表中。

这里提供一个简单的示例代码:

<body><div id="app"><table><tr><td>序号</td><td>姓名</td><td>年龄</td></tr><tr><td>序号</td><td>姓名</td><td>年龄</td></tr></table></div><script type="module">import {createApp} from "https://unpkg.com/vue@3/dist/vue.esm-browser.js";createApp({data(){return {students: [{name: "JackChen",age: 19},{name: "BrusLee",age: 28}]}}}).mount("#app");</script>
</body>

在上面的示例中,提供了一个表格,表格所在的 div 由 Vue 渲染,并且通过createApp函数的参数提供了一个可以用于填充表格的 JS 数组students

现在使用v-for指令填充表格:

<table><tr><td>序号</td><td>姓名</td><td>年龄</td></tr><tr v-for="(student,index) in students"><td>{{index}}</td><td>{{student.name}}</td><td>{{student.age}}</td></tr>
</table>

像上面展示的,只需要在需要循环填充的元素(这里是tr标签)中添加属性v-for,并在其值中使用(...) in ...的方式遍历 JS 数组读取元素和索引下标即可。

(...) in ...循环读取的写法与 Python 颇为类似。

如果不需要使用索引下标,可以简写:

v-for="student in students"

2.2.v-bind

我们已经知道,要在 Html 标签体中使用 Vue 提供的数据,需要使用插值表达式,但如果要在标签的属性值中使用 Vue 提供的数据,就要使用 v-bind 命令:

<body><div id="app"><a v-bind:href="url">百度</a></div><script type="module">import {createApp} from "https://unpkg.com/vue@3/dist/vue.esm-browser.js";createApp({data(){return {url: "https://www.baidu.com/"}}}).mount("#app");</script>
</body>

在上面的示例中,通过v-bind命令,将 Vue 中提供的url变量的值设置为a标签的href属性值。

特别的,使用v-bind:xxx设置属性值时,可以简写为:xxx,比如上面示例中可以简写为:

<a :href="url">百度</a>

2.3.v-if && v-show

可以使用v-if命令控制是否显示某个 Html 标签:

<body><div id="app">商品价格:<span v-if="customer.level>=1 && customer.level<=2">9.9</span><span v-else-if="customer.level>2 && customer.level<=3">19.9</span><span v-else>29.9</span></div><script type="module">import { createApp } from "https://unpkg.com/vue@3/dist/vue.esm-browser.js"createApp({data() {return {customer: {level: 2,name: "JackChen"}}}}).mount("#app");</script>
</body>

如同其他的模版语言一样,v-if可以结合v-else-ifv-else命令一起使用,起到通过条件表达式来控制是否显示 Html 元素的作用。

使用v-show同样可以控制 Html 元素是否在页面显示:

<div id="app">商品价格:<span v-show="customer.level>=1 && customer.level<=2">9.9</span><span v-show="customer.level>2 && customer.level<=3">19.9</span><span v-show="customer.level>3">29.9</span>
</div>

注意,v-show后的条件表达式不能为空。

页面展示效果是相同的,它们的区别在于作用机制不同:

  • v-if是通过将 Html 元素对应的 DOM 节点从页面文档的 DOM 树中删除/添加的方式控制是否显示。
  • v-show是通过设置元素的 CSS 样式(style="display:none")来控制是否显示。

作用机制的不同决定了它们在生效时的性能差异,前者会触发 DOM 树的修改以及页面的重新渲染,而后者仅涉及页面重新渲染。

因此,如果有 Html 元素需要频繁的显示或隐藏,应当使用v-showv-if应当用于仅在页面加载时需要判断是否显示的元素。

2.4.v-on

可以用v-on命令监听 HTML DOM 事件,并在相应的事件发生时执行指定的 JS 函数:

<body><div id="app"><button v-on:click="redirect">跳转到百度</button></div><script type="module">import {createApp} from "https://unpkg.com/vue@3/dist/vue.esm-browser.js"createApp({methods:{redirect(){window.location.href="https://baidu.com"}}}).mount("#app");</script>
</body>

注意,这里绑定的是 DOM 元素的事件,而非 Html 事件,所以是click而不是onclick,两者的写法略有不同。

要绑定的 JS 方法需要定义在 Vue 函数createApp入参的methods属性中。

特别的,使用v-on绑定事件时可以简写为@event_name

<button @click="redirect">跳转到百度</button>

2.5.v-model

v-model可以作用于 Html 表单元素,将其的视图与 Vue 中的数据模型进行双向绑定。这样就可以很容易地获取用户在表单元素中填写的值,或者通过 Vue 的数据模型修改表单元素的值。

下面是一个简单示例:

<body><div id="app"><input v-model="num" /><button @click="increase">自增</button></div><script type="module">import { createApp } from "https://unpkg.com/vue@3/dist/vue.esm-browser.js"createApp({data() {return {num: 0}},methods: {increase() {this.num++;}}}).mount("#app");</script>
</body>

在上面这个示例中,使用v-model将文本输入框与数据模型num进行了双向绑定,输入框的初始值是数据模型的初始值0,按钮的点击事件会触发increase函数,在该函数中对num自增,自增后同样会改变输入框中显示的值,这就是双向绑定。

increase方法中的this关键字在这里代表的并不是methods属性,而是 Vue 实例。因此可以通过this.num获取到需要的数据模型。

3.生命周期

类似于其它框架,Vue 实例有生命周期,包括从创建到销毁的一系列过程。这些过程有对应的生命周期钩子(方法)可以供我们调用,以在 Vue 实例的特定阶段执行某些代码。

比较常用的有mounted,这个方法对应 Vue 实例已经加载成功,类似于以前前端开发经常会使用的 document.ready 事件,可以将一些页面加载完毕后执行的内容放在该函数中。

下面是一个简单示例:

<body><div id="app"></div><script type="module">import { createApp } from "https://unpkg.com/vue@3/dist/vue.esm-browser.js"createApp({mounted() {console.log("vue 实例加载完毕")}}).mount("#app");</script>
</body>

4.Axios

Axios 是一个前端框架,用它可以更方便地发送 Ajax 请求。

用于调试的后端示例代码可以从这里 获取。

首先需要引用 Axios 的 JS 文件:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

具体的 JS 文件地址可以在官方指南中安装部分的 使用 unpkg CDN 找到。

看一个简单示例,使用 Axios 从服务端读取所有文章列表:

<body onload="getAllArticles()"><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script>function getAllArticles() {axios({url: '/article/getAll',method: 'get',baseURL: 'http://localhost:8080'}).then(function (result) {console.log(result.data)}).catch(function (error) {console.log(error)});}</script>
</body>

这里使用的是axios的标准调用,可以在参数中设定各种调用所需的配置内容,包括 URL、调用方法等,具体可以参考官方文档中的请求配置。

接收到的响应信息可以使用级联调用的then方法的参数(这里是result)获取,该参数包含响应报文头、HTTP 状态码等信息,最常用的是响应报文体(result.data)。完整的响应内容结构可以参考官方文档的响应结构。

实际上then方法接收的是一个匿名函数,该匿名函数负责处理成功时的响应。所以也可以使用匿名函数的特殊写法作为 then 方法的参数:

axios({url: '/article/getAll',method: 'get',baseURL: 'http://localhost:8080'
}).then(result => {console.log(result.data)
}).catch(error => {console.log(error)
});

JS 中匿名函数的简写方式类似于 Java。

then类似,用于处理调用失败时的响应函数在catch方法中设置。

除了上边这种最基本的调用方式,Axios 还提供一些更简单的调用方式,比如:

axios.get('http://localhost:8080/article/getAll').then(result => {console.log(result.data)
}).catch(error => {console.log(error)
});

类似的,对于 POST 请求,也有响应的简写方式:

axios.post('http://localhost:8080/article/add',{title: '哈利波特',category: '小说',time: '2001-10-01',state: '已发布'
})

更多的 POST 调用示例可以查看官方文档。

5.案例

可以用上面介绍的内容完成一个简单案例——一个带搜索功能的文章列表页面:

<!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><div id="app">文章分类:<input type="text" v-model="category" />发布状态:<input type="text" v-model="state" /><button @click="search">搜索</button><table><tr><td>文章标题</td><td>分类</td><td>发表时间</td><td>状态</td><td>操作</td></tr><tr v-for="article in articles"><td>{{article.title}}</td><td>{{article.category}}</td><td>{{article.time}}</td><td>{{article.state}}</td><td><a>编辑</a><a>删除</a></td></tr></table></div><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script type="module">import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'createApp({data() {return {articles: [],category: '',state: ''}},methods: {loadArticles() {axios.get("http://localhost:8080/article/getAll").then(result => {this.articles = result.data}).catch(error => {console.log(error)})},search() {axios.get("http://localhost:8080/article/search", {params: {category: this.category,state: this.state}}).then(result => {this.articles = result.data}).then(error => {console.log(error)})}},mounted() {this.loadArticles();}}).mount("#app");</script>
</body></html>

后台的搜索接口实际上有bug,如果某个搜索条件为空,就不会返回任何内容。

谢谢阅读,本文的完整示例代码可以从这里获取。

6.参考资料

  • w3school 在线教程
  • Axios中文文档 | Axios中文网 (axios-http.cn)
  • Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)
  • 黑马程序员SpringBoot3+Vue3全套视频教程

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

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

相关文章

Linux高并发服务器开发之网络编程

Linux网络编程 网络基础TCP和socketTCP状态转移和IO多路复用反应堆模型和线程池模型libeventwebserver项目 网络基础 TCP和socket TCP状态转移和IO多路复用 反应堆模型和线程池模型 libevent webserver项目

Select缺点及代码示例

一、Select缺点 二、服务器端 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/select.h>int main() {// 创建socketint lfd socket(PF_INET, SOCK_STREAM, 0)…

006、函数

1. 一个小技巧 在前面文章中&#xff0c;我们提到&#xff0c;在黑窗口中输入 code . 命令可以快速在 Visual Studio Code 中打开新建的项目&#xff0c;这个是你刚刚新建了项目&#xff0c;并且黑窗口正好是打开的情况下。 如果是之前创建的项目&#xff0c;用上面的方法就会有…

git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作)

文章目录 1. Git概述1.1 何为版本控制1.2 为什么需要版本控制1.3 版本控制工具1.4 Git简史1.5 Git工作机制1.6 Git和代码托管中心 2. Git安装3. Git常用命令3.1 设置用户签名3.1.1 说明3.1.2 语法3.1.3 案例实操 3.2 初始化本地库3.2.1 基本语法3.2.2 案例实操3.2.3 结果查看 3…

【Java】log4j和slf4j区别

log4j&#xff1a;Apache Software Foundation 开源 slf4j&#xff1a;不支持日志滚动等高级功能 在开源库或内部库中使用 SLF4J&#xff0c;将使其独立于任何特定的日志记录实现&#xff0c;这意味着无需为多个库管理多个日志记录配置&#xff0c;您的客户端将会很需要这一点…

【k8s】deamonset文件和说明

目录 deamonset的相关命令 deamonset的定义 deamonset的使用场景 deamonset的例子 deamonset字段说明 serviceAccountName DaemonSet的结构及其各个部分的作用 deamonset的相关命令 #查看<name-space>空间内有哪些deamonset kubectl get DaemonSet -n <na…

Django 学习教程- Django 入门案例

Django学习教程系列 Django学习教程-介绍与安装 前言 本教程是为 Django 5.0 编写的&#xff0c;它支持 Python 3.10 至以上。如果 Django 版本不匹配&#xff0c;可以参考教程 使用右下角的版本切换器来获取你的 Django 版本 &#xff0c;或将 Django 更新到最新版本。如果…

判断素数的方法大全

质数又称素数。一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数&#xff1b;否则称为合数&#xff08;规定1既不是质数也不是合数&#xff09;。 一、直接暴力法求素数 n的素数的判断&#xff0c;我自己只想到了把2到n-1&#xf…

Winclone Pro 10 for Mac:轻松备份和还原你的Windows系统

Winclone Pro 10 for Mac是一款专为Mac用户设计的备份和还原软件&#xff0c;旨在帮助用户轻松管理和保护他们的Windows系统。无论是为了数据安全还是系统的稳定性&#xff0c;Winclone Pro 10都能提供全面的解决方案。 这款软件具备强大的备份功能&#xff0c;能够快速而准确…

Java流程控制语句(if语句,switch语句,for循环,while循环,do...while循环,三种循环的区别)

文章目录 第一章 流程控制语句1.1 流程控制语句分类1.2 顺序结构 第二章 判断语句&#xff1a;if语句2.1 if语句格式1练习1&#xff1a;老丈人选女婿练习2&#xff1a;考试奖励第一种格式的细节&#xff1a; 2.2 if语句格式2练习1&#xff1a;吃饭练习2&#xff1a;影院选座 2.…

AI产品经理 - 如何做一款软硬协同AI产品

【背景】从0做一款软硬协同的AI产品&#xff0c;以智能医药保温箱 1.以智能医药保温箱 2.调研定义市场方向 地点&#xff1a;医药、实验室 场景&#xff1a;长宽高/装箱/运输/实验室 3.需求挖掘 4.如何进行软硬件AI产品工作 软硬件产品设计&#xff1a;功能/硬件外观设计、…

2023就这样过去了,2024会更好吗?

2023年&#xff0c;不是很好 2023年是疫情后的第一年&#xff0c;疫情过去了&#xff0c;大家都有大多的希望&#xff0c;希望经济可以恢复&#xff0c;希望信心可以恢复&#xff0c;但是整体都是远远低于预期的。年初的一片热潮&#xff0c;年中的一片哀嚎&#xff0c;年底基…

SetWindowsHookEx: 全局钩子实现键盘记录器

简介 SetWindowsHookEx 钩子(Hook)&#xff0c;是Windows消息处理机制的一个平台&#xff0c;应用程序可以在上面设置子程以监视指定窗口的某种消息&#xff0c;而且所监视的窗口可以是其他进程所创建的。当消息到达后&#xff0c;在目标窗口处理函数之前处理它。钩子机制允许应…

【华为OD机试真题2023CD卷 JAVAJS】分割均衡字符串

华为OD2023&#xff08;C&D卷&#xff09;机试题库全覆盖&#xff0c;刷题指南点这里 分割均衡字符串 知识点编程基础 题目描述&#xff1a; 均衡串定义&#xff1a;字符串只包含两种字符&#xff0c;且两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成…

Python之线程池设计实战

案例 10000条数据&#xff0c;要先下载&#xff0c;然后需要从并发量支持一秒20次的识别接口通过&#xff0c;最近将结果写入excel中&#xff0c;如果用python完成&#xff0c;如何实现&#xff0c;线程池大小设多少合适&#xff0c;线程池大小在哪用合适 针对这个需求&#…

Hive生产调优介绍

1.Fetch抓取 Fetch抓取是指&#xff0c;Hive中对某些情况的查询可以不必使用MapReduce计算。例如&#xff1a;SELECT * FROM employees;在这种情况下&#xff0c;Hive可以简单地读取employee对应的存储目录下的文件&#xff0c;然后输出查询结果到控制台。 在hive-default.xml…

云卷云舒:构建业务型电信智能运维方法

1 引言 智能运维&#xff08;AIOps-Algorithmic IT Operations基于算法的IT运维&#xff09;是人工智能技术在IT运维领域的运用&#xff0c;引用Gartner 的报告的一段话“未来几年&#xff0c;将近50%的企业将会在他们的业务和IT运维方面采用AIOps&#xff0c;远远高于今天的10…

Cloud-Platform 学习——Part6 WebClient异步非阻塞请求工具

参考&#xff1a; https://zhuanlan.zhihu.com/p/370935458?utm_id0 - 知乎专栏在 SpringBoot 中从 RestTemplate 过渡到 WebClient&#xff1a;详细指南-CSDN博客 多年来&#xff0c;Spring 框架的 RestTemplate 一直是客户端 HTTP 访问的首选解决方案&#xff0c;它提供同步…

php的laravel权限问题

1.这是我新建的一个路由&#xff0c;然后就是说每新建一个路由都要给他开个权限&#xff01;&#xff01;&#xff01;&#xff01; 2.这个是组内大佬写的&#xff1a; 我们也可以在里面加&#xff0c;也可以在浏览器的页面手动加&#xff08;对我们新手来说还是浏览器的页面…

matlab导出高清图片,须经修改后放入latex(例如添加文字说明,matlab画图不易操作)

一、背景 我们在写文章时&#xff0c;使用matlab画图后&#xff0c;如果不需要对图片进行额外修改或调整&#xff0c;例如添加文字说明&#xff0c;即可直接从matlab导出eps格式图片&#xff0c;然后插入到latex使用。 通常latex添加图片&#xff0c;是需要eps格式的。 但很…